cv::VideoCapture m_video("F:/视频.avi");//这里把视频文件“视频.avi”存放在F盘目录下
m_video.get(propId);
这里我们将视频存放到m_video中,那么m_video.get()的参数propId为一个宏名,也可以是一个数字。
首先我们先总结一下宏名的特点:
一:开头三个单词都是CV_CAP_PROP_
二:第四个单词开始有区分,对应具体功能或者对象,因宏而异
笔者本人主观上将宏名比作文件夹的名称,选择宏相当于去文件夹里找对应的函数文件。如果视频的某个特征组成非常复杂,需要用很多参数去形容,那么对于这个特征可能用一个参数表示比较困难,因此需要通过多个函数去表示这个特征,这也是为何有些宏名是四个单词而有些是五个的原因。
下面这段代码展示了CV_CAP_PROP_FRAME_COUNT(7)和CV_CAP_PROP_FPS(5)两个宏的具体作用,这段代码的功能是通过选择路径打开格式为avi或mp4的视频文件并在窗口中显示。
QString m_filename = QFileDialog::getOpenFileName(this,"打开视频","D:\\2_projects\\video_and_photo","(*.avi *.mp4)");
cv::VideoCapture m_video(m_filename.toStdString());//视频路径只能为String类型
int m_count = m_video.get(CV_CAP_PROP_FRAME_COUNT);//得到总帧数,用来计数以停止视频
int m_fps = m_video.get(CV_CAP_PROP_FPS);//得到帧率以控制视频速度
//m_video.get();//函数的两种使用方式
Mat frame,m_frame;
QImage fra;
while (--m_count)//m_count未减到0时持续循环,也即一直播放视频
{
m_video.read(frame);
cvtColor(frame,m_frame,CV_BGR2RGB);//将image由Mat格式转为QImage格式的必备操作(两者在内存中三通道的存储顺序不同)
fra = QImage((const uchar*)(m_frame.data),m_frame.cols,m_frame.rows,m_frame.cols*m_frame.channels(),QImage::Format_RGB888);//强制类型转换将Mat转为QImage
imshow("video", frame);
waitKey(1000 / m_fps);//1000ms/帧率=每帧停留时间
}
笔者认为平时用的比较多的已经标红,后续还有一些我平时用不到的就先不添加以免扰乱初学者的视线
0:CV_CAP_PROP_POS_MSEC
视频文件的当前位置以毫秒为单位播放
1:CV_CAP_PROP_POS_FRAMES
帧索引,即下一个要捕获的帧的索引
2:CV_CAP_PROP_POS_AVI_RATIO
视频文件的相对位置,0说明影片开始,1说明影片结束
3:CV_CAP_PROP_FRAME_WIDTH
帧的宽度(对应图片像素的宽度)
4:CV_CAP_PROP_FRAME_HEIGHT
帧的高度(对应图片像素的高度)
5:CV_CAP_PROP_FPS
帧率,即每秒播放的帧的数量
6:CV_CAP_PROP_FOURCC
编解码的4character字符代码
7:CV_CAP_PROP_FRAME_COUNT
视频文件的总帧数
8:CV_CAP_PROP_FORMAT
通过retrieve返回的帧,以Mat格式存放
9:CV_CAP_PROP_MODE
10:CV_CAP_PROP_BRIGHTNESS
图像的亮度
11:CV_CAP_PROP_CONTRAST
图像的对比度
12:CV_CAP_PROP_SATURATION
图像的饱和度
13:CV_CAP_PROP_HUE
图像的色调
14:CV_CAP_PROP_GAIN
图像增益
15:CV_CAP_PROP_EXPOSURE
曝光
16:CV_CAP_PROP_CONVERT_RGB
该宏返回值为布尔类型,表示图像是否应转换为RGB