OpenCV 4.1习题解答

本文介绍了在OpenCV 4.1中处理视频时遇到的问题及解决方案,包括读取彩色、灰度和边缘视频,强调了路径、格式、帧获取等问题,提供了解决视频格式不支持、帧获取失败等错误的方法,并提醒了释放资源的注意事项。
摘要由CSDN通过智能技术生成

chap 4.1 习题解答

读取视频文件,显示彩色视频、灰度视频、边缘视频。

#include<opencv2/opencv.hpp>
#include<iostream>

// chap 4.1 video : frame - gray - canny
void main()
{
	using namespace std;
	CvCapture* capture=cvCreateFileCapture("D:\\video\\case.mp4");
	IplImage* frame=NULL;
	while(capture)
	{
		frame=cvQueryFrame(capture);
		if(frame==NULL)
		{
			cout<<"frame error!"<<endl;// display the frame error
			break;
		}
		IplImage* gray=cvCreateImage(cvGetSize(frame),8,1);// gray pic 8UC1
		IplImage* canny_pic=cvCreateImage(cvGetSize(frame),8,1);// canny_pic  8UC1
		cvCvtColor(frame,gray,CV_BGR2GRAY);// pay attention to BGR2GRAY ( not RGB2GRAY )
		cvCanny(gray,canny_pic,100,200,3);// the last parameter must be 3..
		cvNamedWindow("frame");
		cvNamedWindow("gray");
		cvNamedWindow("canny");
		cvShowImage("frame",frame);
		cvShowImage("gray",gray);
		cvShowImage("canny",canny_pic);
		if(cvWaitKey(30)>0)  // not cvWaitKey(0);
			break;   // any keys pushed down, exit the loop
	}
	cvReleaseCapture(&capture);// Don't  releaseImage(&frame)
	//cvReleaseImage(&gray);
	//cvReleaseImage(&canny_pic);
}

注意几个小问题:

0, 注意gray 、 canny 通道数,8UC1 , 在没有得到图像大小前,不能设定图像大小,大或小都导致CV_BGR2GRAY 失败。

1, 读取视频文件路径: d:\\video\\case.mp4 中是' \ \ ' ,而非‘\ ' .   写错的后果,capture捕获视频失败,while(  false ),直接退出程序。

2, 视频格式。这个问题我说不准,之前用opencv2.1.0可以读取avi 视频,不能读mp4 ;

现在opencv2.4.4 能读取mp4, 不能读取 avi 。 可能是系统没有安装其他相关的视频编解码器的缘故吧。

当你视频路径没有问题,而程序一闪而过(不显示 " frame error!"),很可能就是opencv不支持当前的视频格式,可以转换其他格式试试。

3,假如碰到一种格式,while( capture)为真,而frame 得不到相应的帧图像,为了应对该情况,使用判断 if ( frame == NULL ) 决定是否结束程序。

4, 程序内的灰度图、边缘图指针的创建是在循环体内,最后就不用再循环体外释放了。

5,只能释放 capture, 不要释放 frame。 因为创建frame 的时候,没有创建相应的内存空间,只是个空的指针头,教材内有相关内容。

6,按任意键退出  if ( cvWaitKey(30) > 0 ) break; 没键按下,每帧图像显示30ms直到视频结束或按键按下。

这是简单的写法,也可以写作: char c = cvWaitKey(33);

 if ( c > 0 ) break ; // any key   pushed to exit

if( c == 27 ) break; // Esc pushed down to exit

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值