您的位置:首页 > 运维架构

《学习OpenCV》第四章课后题1-a

2015-07-18 11:11 411 查看
题目说明:

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的专栏

/article/1384989.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: