一、视频加载与摄像头调用
视频、摄像头加载
VideoCapture(filename, CAP_ANY)
对以上实例解释如下:
若读取的为本地视频,则filename为视频名称,若读取的是摄像头数据,则为int类型的摄像头id。
视频属性的获取
视频属性可以通过get()函数获取。
视频中每一帧图像的获取
见文末案例
二、视频文件的保存
VideoWriter(fliename, fourcc, fps, framSize, isColor)
对以上实例进行解释:
filename:保存视频的地址和文件名,包含视频格式;
fourcc:压缩帧的4字符编解码器代码,详细参数在表2-7给出;
fps:保存视频的帧率,即视频中每秒图像的张数;
framSize:视频帧的尺寸;
isColor:保存视频是否为彩色视频;
三、读取视频的样例
int main() {
//创建一个video对象
VideoCapture video;
//打开1.MP4文件
video.open("./1.mp4");
//判断视频是否打开成功
if (video.isOpened())
{
cout << "错误" << endl;
return -1;
}
//显示视频帧率
video.get(CAP_PROP_FPS);
//显示视频宽度
video.get(CAP_PROP_FRAME_WIDTH);
//显示每一帧的图像
while (1)
{
Mat frame;
video >> frame;
if (frame.empty())
{
break;
}
//控制视频的快放与慢放,同时当视频读取完毕后会退出程序
uchar c = waitKey(1000/ video.get(CAP_PROP_FPS));
if (c == 'a')
{
break;
}
}
}
四、读取并保存视频的样例
int main() {
//创建一个video对象
VideoCapture video;
//打开1.MP4文件
video.open("./1.mp4");
//判断视频是否打开成功
if (video.isOpened())
{
cout << "错误" << endl;
return -1;
}
//显示视频帧率
video.get(CAP_PROP_FPS);
//显示视频宽度
video.get(CAP_PROP_FRAME_WIDTH);
//显示每一帧的图像
Mat frame;
video >> frame;
if (frame.empty())
{
return -1;
}
//判断图像是否为彩色图像
bool isColor = (frame.type() == CV_8UC3);
//创建写对象的实例
VideoWriter writer;
//选择编码格式
int codec = VideoWriter::fourcc('M', 'J', 'P', 'G');
//设置写入视频的帧率
double fps = 25.0;
//设置保存视频的文件名称
string filename = "1.avi";
//创建保存文件的视频流
writer.open(filename, codec, fps, frame.size(), isColor);
if (!writer.isOpened())
{
cout << "失败" << endl;
return -1;
}
while (1)
{
//检测是否保存完毕
if (!video.read(frame))
{
break;
}
//写入视频流
writer.write(frame);
//显示图像
imshow("Live", frame);
uchar c = waitKey(50);
//按ESC退出循环
if (c == 27)
{
break;
}
}
}