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

题目说明:
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

发布了19 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/windxf/article/details/46940809