题目说明:
a创建一个程序实现以下功能:(1)从视频文件中读入数据;(2)将读入数据转换为灰度图;(3)对图像做Canny边缘检测。将三个过程的处理结果显示到不同的窗口中,每个窗口根据其内容合理命名。
#include <highgui.h>
#include <cv.h>
int main()
{
char * file_path = "E:/song.mp4";
CvCapture * capture = 0;
capture = cvCreateFileCapture(file_path);
// 载入视频文件失败
if(capture == NULL)
{
printf("Can't load the video file, quit...\n");
return 0;
}
// 每一帧
static IplImage * frame;
// 灰度后的每一帧
static IplImage * gray_frame;
// 边缘检测后的每一帧
static IplImage * canny_frame;
//创建三个窗口
cvNamedWindow("color",CV_WINDOW_AUTOSIZE);
cvNamedWindow("gray",CV_WINDOW_AUTOSIZE);
cvNamedWindow("canny",CV_WINDOW_AUTOSIZE);
// 从视频文件读入数据
frame = cvQueryFrame(capture);
// 为gray_frame 和 canny_frame 分配合适的尺寸
gray_frame = cvCreateImage( cvGetSize(frame), frame->depth, 1);
canny_frame = cvCreateImage( cvGetSize(frame), frame->depth, 1);
while(1)
{
frame = cvQueryFrame(capture);
if(!frame)
break;
// 将读入数据转换为灰度图
cvCvtColor( frame, gray_frame, CV_RGB2GRAY );
// 对图像做Canny边缘检测
cvCanny( gray_frame, canny_frame, 30, 100, 3);
// 显示图像
cvShowImage("color", frame);
cvShowImage("gray", gray_frame);
cvShowImage("canny", canny_frame);
char c = cvWaitKey(4);
if(c == 27)
break;
}
cvReleaseCapture(&capture);
//释放图像数据
cvReleaseImage(&frame);
cvReleaseImage(&gray_frame);
cvReleaseImage(&canny_frame);
//释放窗口数据
cvDestroyAllWindows();
return 0;
}
注意:不要把gray_frame = cvCreateImage( cvGetSize(frame), frame->depth, 1);和canny_frame = cvCreateImage( cvGetSize(frame), frame->depth, 1);放到while循环中去,这样会在内存中不断申请空间,最后导致内存泄露而停止程序。
引用:qdsclove的专栏
http://blog.csdn.net/stk_overflow/article/details/8760035