视频读写
1.从文件中读取视频:
1 #include <opencv2/opencv.hpp> 2 #include <iostream> 3 4 using namespace cv; 5 using namespace std; 6 7 int main(int argc, char** argv) { 8 VideoCapture capture; //一个视频读取函数capture 9 capture.open("L:/opencv_picture/video_004.avi"); // capture.open读取视频文件位置 10 if (!capture.isOpened()) { 11 printf("could not load video data...\n"); //如果读不到视频 12 return -1; 13 } 14 15 Mat frame; //一帧图像frame 16 namedWindow("video-demo", CV_WINDOW_AUTOSIZE); 17 while (capture.read(frame)) { //capture.read读取视频后将每一帧图像放在frame中 18 imshow("video-demo", frame); //显示每一帧图像 19 char c = waitKey(50); //每帧延时0.05秒 20 if (c == 27) { //如果按下Esc键 21 break; 22 } 23 } 24 25 waitKey(0); 26 return 0; 27 }
每帧延时0.05s刚好1s显示20帧图像,为动画效果。
2.从摄像头中读取视频:
opencv中视频编码器的选用API参数如上图所示:
mp4:
读取(摄像头录制)视频代码如下:
1 #include <opencv2/opencv.hpp> 2 #include <iostream> 3 4 using namespace cv; 5 using namespace std; 6 7 int main(int argc, char** argv) { 8 VideoCapture capture(0); 9 if (!capture.isOpened()) { 10 printf("could not load video data...\n"); 11 return -1; 12 } 13 14 double fps = capture.get(CV_CAP_PROP_FPS); // 获取视频帧fps 15 Size size = Size(capture.get(CV_CAP_PROP_FRAME_WIDTH), capture.get(CV_CAP_PROP_FRAME_HEIGHT)); 16 //获取帧图像的宽度和高度 size( , ) 17 printf("FPS : %f", fps); 18 VideoWriter writer("H:/wv_demo.mp4", -1, 15.0, size, true); 19 //将摄像头采集的视频写到一个mp4的文件中 20 //VideoWriter writer 函数的参数: 21 //1.文件位置名称格式 2.编码器(为-1时可以选择编码方式)3.录制帧数 4.录制视频的size 5.true 22 23 24 // create window 25 Mat frame; 26 namedWindow("video-demo", CV_WINDOW_AUTOSIZE); 27 28 // show each frame and save 29 while (capture.read(frame)) { 30 imshow("video-demo", frame); 31 writer.write(frame); 32 char c = waitKey(50); 33 if (c == 27) { 34 break; 35 } 36 } 37 38 waitKey(0); 39 return 0; 40 }
注意:
若编码器选择为-1时,
录制的文件为avi,则会出现选择框选择编码的方式。
录制的文件为mp4,则都是默认选项直接录制。
结束录制时需要按两次Esc键。