学习笔记:C++环境下cv::VideoCapture的.read(frame)的读取与存储方式

//在Qt环境下手动选择文件目录(默认视频在D盘下,并要求视频格式为.avi或.mp4格式)
QString my_filename = QFileDialog::getOpenFileName(this,"打开视频","D:\\","(*.avi *.mp4)");

//Qt环境下,需要将读入的QString类型转换为String类型以读取视频
cv::VideoCapture my_video(m_filename.toStdString());


Mat frame;
my_video.read(frame);

示例代码解读:

首先,我们需要通过this指针打开路径手动找到目标文件,再定义VideoCapture类的对象 my_video (类比于构造函数,此构造函数需要输入一个String类型的地址名作为变量输入)用来存储视频文件,此时,这个视频文件有很多参数,我们可以通过  .read  函数来读取当前未读取过的第一帧。可以将这个  .read  函数当成是该类的成员函数

C++语言中默认的cv::read函数为“逐帧读取”,并将读取到的帧存放到frame中去。因此通常会用.get()函数得到总帧数与帧频,然后while循环直至视频结束

通俗来讲就是读一帧少一帧。

一下是一段实例,具体功能为读取视频并显示视频(在视频结束之前无法进行关闭,如需关闭则需要额外设置变量和控件并将其嵌套至while循环中以暂停循环)

其中m_video.get(宏名)函数的用法参考我的另一篇博客

学习笔记:C++环境下cv::VideoCapture.get()的宏使用_The King of LA的博客-CSDN博客

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/帧率=每帧停留时间
}

以上就是本次学习的全部记录,如有疑问可以私信笔者一起讨论。

你可能感兴趣的:(opencv,c++,计算机视觉,qt)