视频处理的是运动图像,而不是静止图像。视频资源可以是一个专用摄像机、网络摄像头、视频文件或图像文件序列。
在 OpenCV 中,VideoCapture 类和 VideoWriter 类为视频处理中所涉及的捕获和记录任务提供了一个易用的 C++API。
前面有提到OpenCV2和OpenCV3的视频读写:
主要相关知识
-
什么是FOURCC?
FOURCC是“四字符代码”的缩写 - “四字符代码” - 媒体文件中使用的视频编解码器,压缩格式,颜色或像素格式的标识符。FOURCC总是在文件中占用32位/ 4字节。
写FOURCC的另一种方法是4CC(4,如“四”字符代码)。
FOURCC中的四个字符通常限制在ASCII表中的人类可读字符内。因此,很容易传达和传达FOURCC在媒体文件中的内容。
AVI文件是最广泛使用或第一种广泛使用的媒体文件格式,它使用FOURCC标识符来编写用于压缩文件中各种视频/音频流的编解码器
一些比较知名的FOURCC包括“DIVX”,“XVID”,“H264”,“DX50”。但这些仅仅是数百种中的一小部分。
-
VideoWriter构造函数
VideoWriter(const String& filename, int fourcc, double fps, Size frameSize, bool isColor = true); VideoWriter(const String& filename, int apiPreference, int fourcc, double fps, Size frameSize, bool isColor = true) filename:存放写入视频的路径 apiPreference: fourcc:代表了所使用的编码方式。 fps:每秒写入帧数,被创建视频流的帧率 frameSize:写入视频文件的宽和高。 isColor:若非零,编码器希望得到彩色帧并进行编码;否则,是灰度帧。(只有在Windows下支持这个标志)
fourcc部分参数: CV_FOURCC('P','I','M','1') = MPEG-1 codec CV_FOURCC('M','J','P','G') = motion-jpeg codec CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec CV_FOURCC('U', '2', '6', '3') = H263 codec CV_FOURCC('I', '2', '6', '3') = H263I codec CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec
视频读写
#include <iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main() {
//存放读取的每一帧和被转化后的每一帧
Mat in_f, out_f;
//打开自带摄像头
VideoCapture readCapture(0);
//判断摄像头是否打开成功
if (!readCapture.isOpened()) {
cout << "摄像头打开错误!" << endl;
return -1;
}
//获取读入视频文件的高度和宽度
int width=(int)readCapture.get(CAP_PROP_FRAME_WIDTH);
int height=(int)readCapture.get(CAP_PROP_FRAME_HEIGHT);
//定义存放读取视频的地址
char myVideo[] = "D:/test/myVideo3.avi";
//定义每一秒读取的帧数
double fps = 30;
//按照规定的帧数写入读取的视频文件
//当存入视频为灰度色彩时,isColor必须设置为0
//否则,不需要写最后一个参数,否则会出现问题。
VideoWriter writerCapture(myVideo,VideoWriter::fourcc('X', 'V', 'I', 'D'),fps,Size(width,height),0);
if (!writerCapture.isOpened()) {
cout << "写入视频错误" << endl;
return -1;
}
//显示摄像头读取的视频和转换成灰度空间的视频文件
while (true)
{
//从摄像机读取帧(抓取并解码)
readCapture >> in_f;
//将帧转换为灰度
cvtColor(in_f, out_f, COLOR_BGR2GRAY);
//将幀写入视频文件(编码并保存)
writerCapture << out_f;
imshow("read", in_f);
imshow("write", out_f);
if (waitKey(1000 / fps) >= 0) {
break;
}
}
readCapture.release();
return 0;
}
灰度视频和彩色视频:
可能遇到的问题:
-
打不开视频或摄像头
①.本地视频的输入路径有问题,例如下面所示:string outputVideoPath = "D:\test\3.avi";
上述方式会因为转义符而出现问题。
正确的路径命名方式为: string outputVideoPath = "D:\\test\\3.avi"; string outputVideoPath = "D:/test/3.avi";
②.摄像头前几帧出现空帧
解决办法:多次加载视频,readCapture>>in_f 直至图像不为空。 -
保存文件为空
可能是后缀名的问题,尝试使用.avi。
-
保存文件打不开
可能是帧率及图像宽高设置有误。
学习:
VideoWriter的用法
opencv笔记(三十三)——Video Capture使用示例。读取视频
OpenCV读取和写入视频文件