一、视频数据的读取
视频文件是由多张图片组成的,但imread()函数并不能直接读取视频文件,VideoCapture类起到了重要作用。
读取视频文件VideoCapture类构造函数:
cv::VideoCapture::VidoeCapture(); //默认构造函数
cv::VideoCapture::VideoCapture(const String &filename,
int apiPreference = CAP_ANY
)
filename: 读取视频文件或者图像序列名称。
apiPreference: 读取视频。
该函数是构造一个能够读取与处理视频文件的视频流。上诉代码中第一行是VideoCapture类的默认构造函数,知识声明了一个能够读取视频数据的类,具体读取什么视频文件,需要在使用是通过open()函数指出。第二种构造函数在给出声明变量的同时也将视频数据赋值给变量。可以读取的视频文件种类包括视频文件(形如video.avi)。与imread()函数一样,构造函数同样可能读取视频文件失败,因此需要通过isOpened()函数进行判断。如果读取成功则返回true,如果读取失败则返回false。
通过构造函数只是将视频文件加载到了VideoCapture类变量中,当我们在需要使用视频中的图像时,还需要将图像由VideoCapture类变量导出到Mat类变量中,用于后期处理,该操作可以通过“>>”运算符将图像按照视频顺序由VideoCapture类变量赋值给Mat类变量。当VideoCapture类变量中所有的图像都赋值给Mat类变量够,再次赋值的时候Mat类变量会变为空矩阵,因此可以通过empty()判断VideoCapture类变量中是否所有图像都已经读取完毕。
VideoCapture类变量提供了可以查看视频属性的get()函数,通过输入指定的标志来获取视频属性。
标志参数 | 简记 | 作用 |
CAP_PROP_POS_MSEC | 0 | 视频文件的当前位置(以毫秒为单位) |
CAP_PROP_FRAME_WIDTH | 3 | 视频流中图像的宽度 |
CAP_PROP_FRAME_HEIGHT | 4 | 视频流中图像的高度 |
CAP_PROP_FPS | 5 | 视频流中图像的频率(每秒帧数) |
CAP_PROP_FOURCC | 6 | 编解码器的4字符代码 |
CAP_PROP_FRAME_COUNT | 7 | 视频流中图像帧数 |
CAP_PROP_FORMAT | 8 | 返回的Mat对象格式 |
CAP_PROP_BRIGHTNESS | 10 | 图像的亮度(仅适用于支持的相机) |
CAP_PROP_CONTRAST | 11 | 图像对比度(仅适用于相机) |
CAP_PROP_SATURATION | 12 | 图像饱和度(仅适用于相机) |
CAP_PROP_HUE | 13 | 图像的色调(仅适用于相机) |
CAP_PROP_GAIN | 14 | 图像的增益(仅适用于支持的相机) |
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
system("color F0") //更改界面颜色
VideoCapture video("test.mp4);
if (video.isOpened())
{
cout << "视频中图像的宽度=" << video.get(CAP_PROR_FRAME_WIDTH) << endl;
cout << "视频中图像的高度=" << video.get(CAP_PROR_FRAME_HEIGHT) << endl;
cout << "视频帧率=" << video.get(CAP_PROP_FPS) << ednl;
}
else
{
cout << "请确认视频文件名称是否正确" << endl;
return -1;
}
while(1)
{
Mat frame;
video >> frame;
if ( frame.empty())
break;
imshow("video", frame);
waitKey(1000 / video.get(CAP_PROP_FPS));
}
waitKey(0);
return 0;
}
二、摄像头的直接调用
VideoCapture类还可以调用摄像头,构造方式如下:
cv::VideoCapture::VideoCapture(int index,
int apiPreference = CAP_ANY
)
与读取视频图像对比,只有第一个参数不同,调用摄像头时,第一个参数为要打开的摄像头设备的ID,ID的命名方式从0开始。从摄像头中国读取图像数据的方式与从视频中读取图像数据的方式相同,通过">>"符号读取当前时刻相机拍摄到的图像。并且,在读取视频时,VideoCapture类具有的属性同样可以使用。