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();
}