1. 摄像头以及视频数据的打开
cv::VideoCapture cap(0); //整形参数代表视频来源于摄像头
cv::VideoCapture cap(filePath); //一个文件路径代表打开的是一个视频文件
//打开
if (cap.isOpened())
{
cout << "open Failed!" << endl;
return -1;
}
cout << "Open Success" << endl;
2. 视频文件读取到Mat中(一次读取一帧,且OpenCV会丢弃音频信息)
cap.read(frame);
//此方法包含以下两步:
if (!cap.grab()) break; //对视频的一帧进行解码
if (!cap.retrieve(frame)) break; //对视频进行色彩转换
注意:
有的视频存储的是下一帧图像的变化,所有解码是必须的,但是为了显示的效率,有时候可以减少对视频色彩的转换,即减少帧率
3. 相机和视频的属性处理
CAP_PROP_FPS 帧率
CAP_PROP_FRAME_COUNT 总帧数
CAP_PROP_POS_FRAMES 当前帧的位置
CAP_PROP_FRAME_WIDTH 视频的宽度
CAP_PROP_FRAME_HEIGHT 视频的高度
3.1 读取属性
int fps = cap.get(CAP_PROP_FPS);
if (!fps) fps = 30; //如果读取的fps为0
int sleepTime = 1000 / fps; //等待时间
waitKey(sleepTime);
3.1 设置属性
cap.set(CAP_PROP_POS_FRAMES, 0); //设置当前帧的位置为0
4. 视频文件的写入
注意:写入的图像帧信息,必须与视频文件头信息相对于,否则会出错
4.1 文件的打开
写入文件头信息
//方式一:
VideoWriter writer;
writer.open(
"1.mp4", //视频路径
VideoWriter::fourcc('H','2','6','4'),//编码方式
30, //帧率
Size(600,600), //视频的宽高信息
true //bool isColor = true:是否有色彩
)
//方式二:
VideoWriter writer;
writer.create(
"1.mp4", //视频路径
VideoWriter::fourcc('H','2','6','4'),//编码方式
30, //帧率
Size(600,600), //视频的宽高信息
true //bool isColor = true:是否有色彩
)
4.2 文件的写入
写入视频帧
writer.write(frame);
4.3 文件尾部信息的写入
写入视频的索引信息,包括文件时长
writer.release();