《学习OpenCV》练习4-1

#include "cv.h"
#include "highgui.h"
#include "stdio.h"

//*****************************************************
//canny边缘检测函数:输出写入一个单通道(灰度级)图像
//in              :输入的IplImage图像指针
//lowThresh       :
//highThresh      :
//aperture        :
//return          :返回一个输出图像的IplImage指针
//*****************************************************
IplImage* doCanny( IplImage* in, double lowThresh, double highThresh, double aperture )
{
	if (in->nChannels != 1)
	{
		return 0;															//Canny只能解决灰度图像
	}
	IplImage* out = cvCreateImage( cvGetSize(in), IPL_DEPTH_8U, 1 );
	cvCanny( in, out, lowThresh, highThresh, aperture );
	return out;
}

int main()
{
	/*生成窗口*/
	cvNamedWindow( "sorce", CV_WINDOW_AUTOSIZE );							//源视频文件窗口
	cvNamedWindow( "gray", CV_WINDOW_AUTOSIZE );							//转换成灰度视频文件窗口
	cvNamedWindow( "canny", CV_WINDOW_AUTOSIZE );							//转换为canny边缘检测后的视频文件窗口

	/*源视频capture、frame的提取*/
	CvCapture* capt_sorce = cvCreateFileCapture( "sorce.mp4" );				//从源视频sorce.mp4提取视频信息capture
	IplImage* frame_sorce;													//从源视频提取帧
	if (!capt_sorce)														//如果提取视频失败,则main函数返回-1
	{
		return -1;
	}

	/*提取源视频信息经过得到的灰度视频信息与canny视频信息*/
	double fps = cvGetCaptureProperty( capt_sorce, CV_CAP_PROP_FPS );		//将源视频的每秒帧数赋给灰度视频或canny视频的fps
	CvSize size = cvSize((int)cvGetCaptureProperty( capt_sorce, CV_CAP_PROP_FRAME_WIDTH ),
						 (int)cvGetCaptureProperty( capt_sorce, CV_CAP_PROP_FRAME_HEIGHT ));
																			//通过内联函数,将源视频的宽度和高度赋给灰度或canny视频的size结构体
	/*得到写入灰度视频信息*/
	CvVideoWriter* writer_gray = cvCreateVideoWriter( "gray",
													  CV_FOURCC('M','J','P','G'),
													  fps,
													  size );				//通过设置一些信息,创建一个写入视频结构指针
	IplImage* frame_gray = cvCreateImage( size, IPL_DEPTH_8U, 1 );			//创建一个指向尺寸为size,深度为unsigned 8位,1通道(灰度)的图像指针

	/*得到写入canny视频信息*/
	CvVideoWriter* writer_canny = cvCreateVideoWriter( "canny",
													  CV_FOURCC('M','J','P','G'),
													  fps,
													  size );				//通过设置一些信息,创建一个写入视频结构指针
	IplImage* frame_canny = cvCreateImage( size, IPL_DEPTH_8U, 1 );			//创建一个指向尺寸为size,深度为unsigned 8位,1通道(灰度)的图像指针


	/*大循环播放视频*/
	while(1)
	{
		/*源视频播放*/
		frame_sorce = cvQueryFrame( capt_sorce );							//从源视频信息提取帧
		if (!frame_sorce)													//如果源视频帧为0,意味着视频播放完毕,退出while循环
		{
			break;
		}
		cvShowImage( "sorce", frame_sorce );								//循环显示源视频每一帧图像
		/*灰度视频播放*/
		cvCvtColor( frame_sorce, frame_gray, CV_RGB2GRAY );					//将源视频RGB的颜色通道转换为单通道的灰度视频
		cvWriteFrame( writer_gray, frame_gray );							//为已经写入好的视频结构writer_gray写入帧
		cvShowImage( "gray", frame_gray );									//循环显示灰度视频每一帧图像
		/*canny视频播放*/
		frame_canny = doCanny( frame_gray, 10, 100, 3 );					//将灰度视频的每一帧通过canny检测转化为canny视频的帧
		cvWriteFrame( writer_canny, frame_canny );							//为已经写入好的视频结构writer_canny写入帧
		cvShowImage( "canny", frame_canny );								//循环显示canny视频每一帧图像

		/*33ms每一帧,与按下ESC键退出*/
		char c = cvWaitKey(33);
		if (c==27)
		{
			break;
		}
	}

	/*源视频内存的释放*/
	cvReleaseCapture( &capt_sorce );
	cvDestroyWindow( "sorce" );
	/*灰度视频内存的释放*/
	cvReleaseVideoWriter( &writer_gray );
	cvReleaseImage( &frame_gray );
	cvDestroyWindow( "gray" );
	/*canny视频内存的释放*/
	cvReleaseVideoWriter( &writer_canny );
	cvReleaseImage( &frame_canny );
	cvDestroyWindow( "canny" );

	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值