#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;
}
《学习OpenCV》练习4-1
最新推荐文章于 2018-09-23 09:54:43 发布