欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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");
}

opencv 播放视频文件

效果其实和播放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。