opencv 播放视频文件
程序员文章站
2022-07-13 12:02:55
...
上一篇讲了如何通过opencv 和freeimage 播放gif文件。这篇初略讲下opencv视频播放的部分。我也是第一次接触opencv,所以讲得比较粗浅,共同学习。
上一篇忘记说了,由于功能用的比较少,所以依赖的opencv的库就相对少,这样应用体积也小。视频播放和图片处理依赖的库有
opencv_core341d.lib
opencv_highgui341d.lib
opencv_videoio341d.lib
opencv_imgcodecs341d.lib
FreeImage.lib
freeimage使用用来解析gif信息的,这里不是必须的。
然后再列一下关键的的步骤
void CCOpenCVDlg::playAVI()
{
// TODO: 在此添加控件通知处理程序代码
CDC *pDC = GetDlgItem(IDC_STATIC)->GetDC();//根据ID获得窗口指针再获取与该窗口关联的上下文指针
HDC hdc = pDC->GetSafeHdc(); // 获取设备上下文句柄
CRect rect;
// 矩形类
GetDlgItem(IDC_STATIC)->GetClientRect(&rect); //获取box1客户区
//std::wstring path = GetAbsolutePath(L"loading.avi");
CvCapture *capture = cvCreateFileCapture("D:\\WorkSpace\\COpenCV\\Debug\\loading.avi"); //读取视频
if (capture == NULL) {
printf("NO capture"); //读取不成功,则标识
//return 1;
};
double fps = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS); //读取视频的帧率
int vfps = 1000 / fps; //计算每帧播放的时间
printf("%5.1f\t%5d\n", fps, vfps);
double frames = cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);//读取视频中有多少帧
printf("frames is %f\n", frames);
//cvNamedWindow("example",CV_WINDOW_AUTOSIZE); //定义窗口
IplImage *frame;
CvvImage cimg;
while (1){
frame = cvQueryFrame(capture); //抓取帧
if (frame == nullptr)
{
break;
}
cimg.CopyOf(frame, frame->nChannels);
cimg.DrawToHDC(hdc, &rect);
float ratio = cvGetCaptureProperty(capture, CV_CAP_PROP_POS_AVI_RATIO); //读取该帧在视频中的相对位置
printf("%f\n", ratio);
//if (!frame)break;
//cvShowImage("IDC_STATIC",frame); //显示
char c = cvWaitKey(vfps);
if (c == 27)break;
}
ReleaseDC(pDC);
cvReleaseCapture(&capture);
cvDestroyWindow("example");
}
效果其实和播放gif一样,过程还发现一个问题,opencv只能播放avi格式的视频文件,其他格式的无法播放。后来在网上搜了一下,说是需要转码,需要用到另外一个开源库叫ffmpeg。专门用来做视频的编码和解码。以后可以慢慢引入ffmpeg然后做一个任意格式可以播放的工具。然后可以把SDL/webrtc 这些可以做视频的开源库做个比较,这是个漫长的过程。
opencv还可以开启摄像头,实时采集摄像头的数据,这个我没有试过,这里附上一个链接还有一段调用。https://blog.csdn.net/zmdsjtu/article/details/52235056。
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
using namespace cv;
int main()
{
VideoCapture cap(0);
Mat frame;
while (1)
{
cap >> frame;
imshow("调用摄像头", frame);
waitKey(30);
}
return 0;
}
这里发现CSDN嵌入代码段窗口的一个BUG, shif + tab效果同tab。