opencv 播放视频文件

上一篇讲了如何通过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。

猜你喜欢

转载自blog.csdn.net/moyebaobei1/article/details/81745014