一、介绍
视频读取本质上就是读取图像,因为视频是由一帧一帧图像组成的。1秒24帧基本就能流畅的读取视频了。
1、读取视频有两种方法:
(1) VideoCapture cap; cap.open(“1.avi”); (2) VideoCapture cap(“1.avi”);
2、循环显示每一帧:
1 while(1) 2 { 3 Mat frame; //定义Mat变量,用来存储每一帧 4 cap>>frame; //读取当前帧方法一 5 //cap.read(frame); //读取当前帧方法二 6 imshow(“视频显示”, frame); //显示一帧画面 7 waitKey(30); //延时30ms 8 }
二、读取视频
【示例】
1 //读取视频 2 #include<opencv2/core/core.hpp> 3 #include<opencv2/imgproc/imgproc.hpp> 4 #include<opencv2/highgui/highgui.hpp> 5 #include<iostream> 6 7 using namespace std; 8 using namespace cv; 9 10 int main(){ 11 VideoCapture cap; 12 cap.open("../../1.mp4"); //打开视频,以上两句等价于VideoCapture cap("E://2.avi"); 13 14 if(!cap.isOpened())//如果视频不能正常打开则返回 15 return -1; 16 17 int width = cap.get(CV_CAP_PROP_FRAME_WIDTH);//帧宽度 18 int height = cap.get(CV_CAP_PROP_FRAME_HEIGHT);//帧高度 19 int frameRate = cap.get(CV_CAP_PROP_FPS);//帧率 × frames/s 20 int totalFrames = cap.get(CV_CAP_PROP_FRAME_COUNT);//总帧数 21 22 //获取视频的相关参数 23 cout << "视频的宽度:" << width << endl; 24 cout << "视频的高度:" << height << endl; 25 cout << "视频的总帧数:" << totalFrames << endl; 26 cout << "帧率:" << frameRate << endl; 27 28 Mat frame; 29 while(1) 30 { 31 cap>>frame;//等价于cap.read(frame); 32 if(frame.empty())//如果某帧为空则退出循环 33 break; 34 imshow("video", frame); 35 waitKey(20);//每帧延时20毫秒 36 } 37 cap.release();//释放资源 38 39 return 0; 40 }
三、读取摄像头
读取摄像头和读取视频大同小异,主要是这句代码有些许不同。
1 VideoCapture cap; 2 cap.open(0);
读取视频时可以传入视频路径,而读取摄像头传入的是index索引号。
注:
1)如果默认笔记本/台式机只有一个USB摄像头,Index=0; 如果有2个,一般Index为0和1,根据具体情况区分,摄像头接入和断开会改变Index值
2)如果接入2个以上,但只想用指定的一个,可以在设备管理器中禁用其他,同时Index设置为0
3)因为开启摄像头后一直在进行读取,所以需要用waitKey()返回值判断退出预览
1 imshow(“video”, frame); 2 if(waitKey(30)>0)//无按键按下返回-1,按键按下时退出 3 break;
也可以指定按键退出:
1 if(waitKey(30)==27) //Esc键退出,ESC的ASCLL码为27 2 break;
【示例】
1 //读取摄像头 2 #include <opencv2/core/core.hpp> 3 #include <opencv2/highgui/highgui.hpp> 4 #include <opencv2/imgproc/imgproc.hpp> 5 #include <iostream> 6 7 using namespace std; 8 using namespace cv; 9 10 int main(){ 11 VideoCapture cap; 12 cap.open(0); //打开摄像头 13 14 if(!cap.isOpened()) 15 return -1; 16 17 Mat frame; 18 while(1) 19 { 20 cap>>frame;//等价于cap.read(frame); 21 //Canny(frame, frame, 30, 100);//canny边缘检测,去掉这一行就是纯粹的读取摄像头了 22 cvtColor(frame, frame, CV_BGR2HSV);//BGR空间转为HSV颜色空间,注意,两者不能同时对同一张图片(在此为frame)进行处理,否则报错 23 if(frame.empty()) 24 break; 25 imshow("video", frame); 26 if(waitKey(20)>0)//按下任意键退出摄像头 因电脑环境而异,有的电脑可能会出现一闪而过的情况 27 break; 28 } 29 cap.release();//释放所有资源 30 destroyAllWindows();//关闭所有窗口 31 32 return 0; 33 }
四、写入视频
1、介绍
(1)VideoWriter: OpenCV提供VideoWriter类写视频文件,类的构造函数可以指定文件名、播放帧率、帧尺寸、是否创建彩色视频。
1 CV_WRAP VideoWrite(); 2 CV_WRAP VideoWrite(const string& filename, int fourcc, double fps, Size frameSize, bool isColor=true);
(2)两种写入帧方法:
1 writer.write(frame); 2 writer << frame;
(3)注意事项:
1)写入视频前需安装对应的编解码器
2)生成视频是否支持彩色应与构造函数设置一致
3)生成视频尺寸需与读取视频尺寸一致
【示例】
1 //写入视频 2 #include <opencv2/core/core.hpp> 3 #include <opencv2/highgui/highgui.hpp> 4 #include <opencv2/imgproc/imgproc.hpp> 5 #include<iostream> 6 7 using namespace cv; 8 using namespace std; 9 10 int main(){ 11 VideoCapture cap; 12 cap.open("../../1.avi"); 13 Size size0=Size(cap.get(CV_CAP_PROP_FRAME_WIDTH),cap.get(CV_CAP_PROP_FRAME_HEIGHT)); 14 VideoWriter writer("../../out.avi",-1,cap.get(CV_CAP_PROP_FPS),size0,false); 15 16 if(!cap.isOpened()) 17 return -1; 18 19 Mat frame; 20 while(1) 21 { 22 cap>>frame; 23 Canny(frame,frame,30,100); 24 if(frame.empty()) 25 break; 26 writer<<frame;//等同于writer.write(frame); 27 imshow("video", frame); 28 if(waitKey(10)>0) 29 break; 30 } 31 cout<<"write end!"; 32 cap.release(); 33 //destroyAllWindows(); 34 35 return 0; 36 }