阅读 82

opencv读取视频文件(OpenCV 视频读写操作)

视频读写本质上还是读写图像,因为视频是由一帧一帧图像组成的,1秒24帧基本就能流畅地读取视频了。本文对OpenCV 视频操作做个汇总。

 

1.读取视频

两种读取视频文件的方法:

方法1:调用API open函数

VideoCapture cap;
cap.open("x.avi");

方法2:直接读取文件

VideoCapture cap("x.avi");

1.1 显示视频每一帧

while (true) {
bool ret = capture.read(frame);
if (!ret) break;
imshow("frame", frame);
char c = waitKey(5);
if (c == 27) { // ESC
break;
}
}

1.2 获取视频文件的属性信息

VideoCapture cap;
cap.open("E:\\2.avi"); //打开视频
if(!cap.isOpened())
return;
int width = cap.get(CV_CAP_PROP_FRAME_WIDTH); //帧宽度
int height = cap.get(CV_CAP_PROP_FRAME_HEIGHT); //帧高度
int frameRate = cap.get(CV_CAP_PROP_FPS); //帧率 x frames/s
int totalFrames = cap.get(CV_CAP_PROP_FRAME_COUNT); //总帧数
cout<<"视频宽度="<endl;
cout<<"视频高度="<endl;
cout<<"视频总帧数="<endl;
cout<<"帧率="<endl;

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

2.写入视频文件

2.1 API

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

2.2 两种读取视频文件的方法

方法1:writer.write(frame)

方法2:writer >>frame

这两种方法的frame 都是一帧图像。

2.3 注意事项

1)写入视频前需安装对应的编解码器

2)生成视频是否支持彩色应与构造函数设置一致

3)生成视频尺寸需与读取视频尺寸一致

3.示例

#include 
#include 
using namespace cv;
using namespace std;

int main(int argc, char** argv) {
VideoCapture capture;
capture.open("D:/images/video/vtest.avi");
// VideoCapture capture("D:/images/video/vtest.avi");
if (!capture.isOpened()) {
printf("could not open the camera...\n");
}
namedWindow("frame", WINDOW_AUTOSIZE);
int fps = capture.get(CAP_PROP_FPS);
int width = capture.get(CAP_PROP_FRAME_WIDTH);
int height = capture.get(CAP_PROP_FRAME_HEIGHT);
int num_of_frames = capture.get(CAP_PROP_FRAME_COUNT);
int type = capture.get(CAP_PROP_FOURCC);
printf("frame size(w=%d, h=%d), FPS:%d, frames: %d \n", width, height, fps, num_of_frames);
Mat frame;
VideoWriter writer("D:/test.mp4", type, fps, Size(width, height), true);
while (true) {
bool ret = capture.read(frame);
if (!ret) break;
imshow("frame", frame);
writer.write(frame);
char c = waitKey(5);
if (c == 27) { // ESC
break;
}
}
capture.release();
writer.release();
waitKey(0);
destroyAllWindows();
}
文章分类
百科问答
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐