这篇博客主要讲解opencv中视频读写。
主要涉及到两个api函数:
videocapture
videowriter
一、函数简介
1.1 videocapture
视频文件读取、摄像头读取、视频流读取
videocapture既支持从视频文件(.avi , .mpg格式)读取,也支持直接从摄像机(比如电脑自带摄像头)中读取。要想获取视频需要先创建一个videocapture对象,videocapture对象的
创建方式有以下三种:
【方式一】是从文件(.mpg或.avi格式)中读取视频,**对象创建以后,opencv将会打开文件并做好准备读取它,如果打开成功,我们将可以开始读取视频的帧,并且cv::videocapture的成员函数isopened()将会返回true(建议在打开视频或摄像头时都使用该成员函数判断是否打开成功)。
方法: cv::videocapture capture(const string& filename); // 从视频文件读取
例程: cv::videocapture capture("c:/users/dada/data/gogo.avi"); // 从视频文件读取
【方式二】是从摄像机中读取视频,**这种情况下,我们会给出一个标识符,用于表示我们想要访问的摄像机,及其与操作系统的握手方式。对于摄像机而言,这个标志符就是一个标志数字——**如果只有1个摄像机,那么就是0,如果系统中有多个摄像机,那么只要将其向上增加即可。**标识符另外一部分是摄像机域(camera domain),用于表示摄像机的类型,这个域值可以是下面任一预定义常量。
cv::videocapture capture(int device ); //视频捕捉设备 id ---笔记本电脑的用0表示
【方式三】先创建一个捕获对象,然后通过成员函数open()来设定打开的信息,操作如下。
cv::videocapture videocapture; 这里的第二个videocapture是一个对象名 videocapture.open( "c:/users/dada/data/gogo.avi" );
将视频帧读取到cv::mat矩阵中,有两种方式:一种是read()操作;另一种是 “>>”操作。
cv::mat frame; cap.read(frame); //读取方式一 cap >> frame; //读取方式二
1.2 videowriter
功能:视频写出、文件保存
我们先来看一下opencv3中的这个函数原型:
videowriter video_writer; video_writer.open(const string& filename, int fourcc, double fps,size framesize, bool iscolor=true);
参数意义:
- filename:保存文件名称及路径;
- fourcc:表示压缩帧的codec,一般用cv_fourcc(‘m’,‘j’,‘p’,‘g’) = motion-jpeg codec;
- fps:表示帧率,可用video_writer.get(cv_cap_prop_fps);
- framesize:保存的视频大小;
而opencv4中与opencv3还是有一定区别的,这个再一会附代码的时候我会附两个不同版本的。
二、代码示例
附opencv4及以上所用代码:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
// 打开摄像头
// videocapture capture(0);
// 打开文件
videocapture capture;
capture.open("c:/users/dell/desktop/opencv-master/samples/data/vtest.avi");
if (!capture.isopened()) {
printf("could not read this video file...\n");
return -1;
}
size s = size((int)capture.get(cap_prop_frame_width),
(int)capture.get(cap_prop_frame_height));
int fps = capture.get(cap_prop_fps);
printf("current fps : %d \n", fps);
videowriter writer("c:/users/dell/desktop/picture/test.mp4", cap_opencv_mjpeg, fps, s, true);
mat frame;
namedwindow("camera-demo", window_autosize);
while (capture.read(frame)) {
imshow("camera-demo", frame);
writer.write(frame);
char c = waitkey(50);
if (c == 27) {
break;
}
}
capture.release();
writer.release();
waitkey(0);
return 0;
}
opencv3代码:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
// 打开摄像头
// videocapture capture(0);
// 打开文件
videocapture capture;
capture.open("d:/vcprojects/images/768x576.avi");
if (!capture.isopened()) {
printf("could not read this video file...\n");
return -1;
}
size s = size((int)capture.get(cv_cap_prop_frame_width),
(int)capture.get(cv_cap_prop_frame_height));
int fps = capture.get(cv_cap_prop_fps);
printf("current fps : %d \n", fps);
videowriter writer("d:/test.mp4", cv_fourcc('d', 'i', 'v', 'x'), fps, s, true);
mat frame;
namedwindow("camera-demo", cv_window_autosize);
while (capture.read(frame)) {
imshow("camera-demo", frame);
writer.write(frame);
char c = waitkey(50);
if (c == 27) {
break;
}
}
capture.release();
writer.release();
waitkey(0);
return 0;
}
其实不是代码有什么区别 只是一些标识符在不同opencv版本中的写法不一样。
三、结果展示

上边为输出的fps(每秒传输的帧数)
下边为我们读取的视频
以及我们文件夹中保存的视频:

到此这篇关于c++ opencv之视频读写(videocapture,videowriter)的实现的文章就介绍到这了,更多相关opencv 视频读写内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论