opencv学习之路(2)、读取视频,读取摄像头

  一、介绍

视频读取本质上就是读取图像,因为视频是由一帧一帧图像组成的。1秒24帧基本就能流畅的读取视频了。 
①读取视频有两种方法: 
A. VideoCapture cap; 
cap.open(“1.avi”); 
B. VideoCapture cap(“1.avi”);



②循环显示每一帧: 
while(1) 

Mat frame; //定义Mat变量,用来存储每一帧 
cap>>frame; //读取当前帧方法一 
//cap.read(frame); //读取当前帧方法二 
imshow(“视频显示”, frame); //显示一帧画面 
waitKey(30); //延时30ms 
}

  二、读取视频示例程序

 1 #include<opencv2/opencv.hpp>
 2 using namespace cv;
 3
 4 void main(){
 5     VideoCapture cap;
 6     cap.open("E://2.avi"); //打开视频,以上两句等价于VideoCapture cap("E://2.avi");
 7
 8     //cap.open("http://www.laganiere.name/bike.avi");//也可以直接从网页中获取图片,前提是网页有视频,以及网速够快
 9     if(!cap.isOpened())//如果视频不能正常打开则返回
10         return;
11     Mat frame;
12     while(1)
13     {
14         cap>>frame;//等价于cap.read(frame);
15         if(frame.empty())//如果某帧为空则退出循环
16             break;
17         imshow("video", frame);
18         waitKey(20);//每帧延时20毫秒
19     }
20     cap.release();//释放资源
21 }

  三、读取视频说明

  1. 打开的视频可以是本地视频如: 
    VideoCapture cap(“1.avi”); 
    也可以是网络视频如: 
    VideoCapture cap(“http://www.laganiere.name/bike.avi“);
  2. 读取视频一定要加异常判断 
    A.打开视频失败(各种原因) 
    B. 取帧失败异常(程序结尾判断) 
    ex1: 
    if(!cap.isOpened()) //检查打开是否成功 
    return; 
    ex2: 
    cap>>frame; 
    if(!frame.empty()) //判断当前 帧是否为空 

    imshow(“video”, frame); 
    waitKey(30); 

    else break;

  四、获取指定视频类的相关参数信息

 1 #include<opencv2/opencv.hpp>
 2 #include<iostream>
 3 using namespace cv;
 4 using namespace std;
 5
 6 void main(){
 7     VideoCapture cap;
 8     cap.open("E:\\2.avi"); //打开视频,等价于   VideoCapture cap("E://2.avi");
 9
10     if(!cap.isOpened())
11         return;
12
13     int width = cap.get(CV_CAP_PROP_FRAME_WIDTH);  //帧宽度
14     int height = cap.get(CV_CAP_PROP_FRAME_HEIGHT); //帧高度
15     int frameRate = cap.get(CV_CAP_PROP_FPS);  //帧率 x frames/s
16     int totalFrames = cap.get(CV_CAP_PROP_FRAME_COUNT); //总帧数
17
18     cout<<"视频宽度="<<width<<endl;
19     cout<<"视频高度="<<height<<endl;
20     cout<<"视频总帧数="<<totalFrames<<endl;
21     cout<<"帧率="<<frameRate<<endl;
22
23     Mat frame;
24     while(1)
25     {
26         cap>>frame;//等价于cap.read(frame);
27         if(frame.empty())
28             break;
29         imshow("video", frame);
30         if(waitKey(20)>0)
31             break;
32     }
33     cap.release();
34 }

  五、读取摄像头

读取摄像头和读取视频大同小异,主要是这句代码有些许不同。 
VideoCapture cap; 
cap.open(0); 
读取视频时可以传入视频路径,而读取摄像头传入的是index索引号。



注: 
1)如果默认笔记本/台式机只有一个USB摄像头,Index=0; 如果有2个,一般Index为0和1,根据具体情况区分,摄像头接入和断开会改变Index值 
2)如果接入2个以上,但只想用指定的一个,可以在设备管理器中禁用其他,同时Index设置为0 

3)因为开启摄像头后一直在进行读取,所以需要用waitKey()返回值判断退出预览 
imshow(“video”, frame); 
if(waitKey(30)>0)//无按键按下返回-1,按键按下时退出 
break; 
也可以指定按键退出: 
if(waitKey(30)==27) //Esc键退出,ESC的ASCLL码为27 
break;

  六、读取摄像头后加入简单处理效果

如果只是读取摄像头不进行处理的话,那毫无意义,现在以canny边缘检测以及颜色空间转换为目标进行处理。

 1 #include<opencv2/opencv.hpp>
 2 using namespace cv;
 3
 4 void main(){
 5     VideoCapture cap;
 6     cap.open(0); //打开摄像头
 7
 8     if(!cap.isOpened())
 9         return;
10
11     Mat frame;
12     while(1)
13     {
14         cap>>frame;//等价于cap.read(frame);
15         Canny(frame, frame, 30, 100);//canny边缘检测
16         //cvtColor(frame, frame, CV_BGR2HSV);//BGR空间转为HSV颜色空间,注意,两者不能同时对同一张图片(在此为frame)进行处理,否则报错
17         if(frame.empty())
18             break;
19         imshow("video", frame);
20         if(waitKey(20)>0)//按下任意键退出摄像头
21             break;
22     }
23     cap.release();
24     destroyAllWindows();//关闭所有窗口
25 }

  七、写入视频

  1、介绍

①VideoWriter: OpenCV提供VideoWriter类写视频文件,类的构造函数可以指定文件名、播放帧率、帧尺寸、是否创建彩色视频。

②两种写入帧方法: 
1 ) writer.write(frame); 
2)writer >>frame(这里的箭头方向应该相反,不知道为什么箭头不能向←); 
③注意事项: 
1)写入视频前需安装对应的编解码器 
2)生成视频是否支持彩色应与构造函数设置一致 
3)生成视频尺寸需与读取视频尺寸一致

  2、代码示例

 1 #include<opencv2/opencv.hpp>
 2 #include<iostream>
 3 using namespace cv;
 4 using namespace std;
 5
 6 void main(){
 7     VideoCapture cap;
 8     cap.open("E://2.avi");
 9     Size size0=Size(cap.get(CV_CAP_PROP_FRAME_WIDTH),cap.get(CV_CAP_PROP_FRAME_HEIGHT));
10     VideoWriter writer("E://out.avi",-1,cap.get(CV_CAP_PROP_FPS),size0,false);
11
12     if(!cap.isOpened())
13         return;
14
15     Mat frame;
16     while(1)
17     {
18         cap>>frame;
19         Canny(frame,frame,30,100);
20         if(frame.empty())
21             break;
22         writer<<frame;//等同于writer.write(frame);
23         imshow("video", frame);
24         if(waitKey(10)>0)
25             break;
26     }
27     cout<<"write end!";
28     cap.release();
29     destroyAllWindows();
30 }
时间: 07-11

opencv学习之路(2)、读取视频,读取摄像头的相关文章

python_Opencv_读取视频_摄像头

目标 • 学会读取视频文件,显示视频,保存视频文件 • 学会从摄像头获取并显示视频 • 你将会学习到这些函数:cv2.VideoCapture(),cv2.VideoWrite()用摄像头捕获视频 使用摄像头来捕获一段视频,并把它转换成灰度视频显示出来. 首先应该创建一个VideoCapture 对象,参数可以是设备的索引号,或者是一个视频文件. 设备索引号就是在指定要使用的摄像头.一般的笔记本电脑都有内置摄像头.所以参数就是0.你可以通过设置成1或者其他的来选择别的摄像头. 之后,你就可以一帧

OpenCV3读取视频或摄像头

我们可以利用OpenCV读取视频文件或者摄像头的数据,将其保存为图像,以用于后期处理.下面的实例代码展示了简单的读取和显示操作: 1 // This is a demo introduces you to reading a video and camera 2 #include <iostream> 3 #include <string> 4 #include <sstream> 5 using namespace std; 6 7 // OpenCV include

Duanxx的OpenCV学习:图片转化为视频

前面我说明了一下Opencv的视频转图片的方式和代码,这次要说明的是Opencv如何将图片转化为视频: 本文完整代码下载 1 VideoWriter说明 这里主要用到的是Opencv里的一个类:VideoWriter 其API参考链接:API链接. 函数原型: VideoWriter::VideoWriter(const string& filename, int fourcc, double fps, Size frameSize, bool isColor=true) 参数说明: filen

【openCV学习笔记】【2】读取并播放一段视频

#include <iostream> #include <opencv/highgui.h> int main(int argc, char** argv){ cvNamedWindow("Example2", CV_WINDOW_AUTOSIZE); CvCapture* capture = cvCreateFileCapture("/Users/apple/Pictures/openCV/video/Andyou.mp4");//这里相

opencv学习之路(6)、鼠标截图,滑动条播放视频

一.鼠标截图 1 #include<opencv2/opencv.hpp> 2 #include<iostream> 3 using namespace cv; 4 using namespace std; 5 6 Mat img=imread("E://1.jpg"); 7 Mat temp=img.clone(); 8 Mat ROI; 9 Point pt; 10 bool flag=false; 11 12 void onMouse(int event,

Opencv学习之路—Opencv下基于HOG特征的KNN算法分类训练

在计算机视觉研究当中,HOG算法和LBP算法算是基础算法,但是却十分重要.后期很多图像特征提取的算法都是基于HOG和LBP,所以了解和掌握HOG,是学习计算机视觉的前提和基础. HOG算法的原理很多资料都可以查到,简单来说,就是将图像分成一个cell,通过对每个cell的像素进行梯度处理,进而根据梯度方向和梯度幅度来得到cell的图像特征.随后,将每个cell的图像特征连接起来,得到一个BLock的特征,进而得到一张图片的特征.Opencv当中自带HOG算法,可以直接调用,进行图像的特征提取.但

OpenCV 学习之路(1)

OpenCV的第一个代码: #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> cv::Mat function(){ cv::Mat ima(500,500,CV_8U,50); return ima; } int main(){ //创建窗口 cv::namedWindow("Image 1"); cv::named

opencv学习之路(21)、模板匹配及应用

一.模板匹配概念 二.单模板匹配 1 #include "opencv2/opencv.hpp" 2 #include <iostream> 3 using namespace std; 4 using namespace cv; 5 6 void main() 7 { 8 Mat temp=imread("E://mu.jpg"); 9 Mat src=imread("E://lena.jpg"); 10 Mat dst=src.c

opencv学习之路(25)、轮廓查找与绘制(四)——正外接矩形

一.简介 二.外接矩形的查找绘制 1 #include "opencv2/opencv.hpp" 2 using namespace cv; 3 void main() 4 { 5 //外接矩形的查找绘制 6 Mat srcImg =imread("E://12.jpg"); 7 imshow("src",srcImg); 8 Mat dstImg = srcImg.clone(); //原图备份 9 cvtColor(srcImg, srcIm