兴趣学习: opencv -- 视频读写, 鼠…

opencv -- 视频读写, 鼠标响应事件

     1. 今天晚上无聊, 翻了翻opencv的书, 发现一些练习题. (下面题目有跟书上稍稍改动)

     2. 做ACM题做多了, 看见题目就冲动了.     -。-!!

 题目一: a. 创建一个程序实现以下功能: (1). 从视频文件中读入数据; (2). 将读入数据转换为灰度图.

         (3). 对图像经行边缘检测. 将三个过程处理结果显示到不同的窗口中.

         b. 将a中的三个图像显示在一个图像窗口中.

         c. 在图像中显示文字标签.

题目二: 在题目一b的基础上, 增加鼠标点击事件, 在三幅画像中任何地方点击鼠标左键, 在图像上打印

        坐标(像素点坐标).

编译环境: qt-4.8.1, opencv 2.3.0

pro文件:

INCLUDEPATH += C:\OpenCV\include\opencv \

        C:\OpenCV\include\opencv2 \
        C:\OpenCV\include
 
 
LIBS += C:\OpenCV\lib\*.a
 
 
SOURCES += \
    main.cpp

 

代码:

#include <cv.h>
#include <highgui.h>

 

//相应鼠标的事件, 回调函数

void my_mouse_callback(int event, int x, int y, int flags, void *param)

{

    IplImage *img = (IplImage*) param;

    switch( event )

    {

    case CV_EVENT_LBUTTONDOWN:{

        CvFont font;

        cvInitFont(&font, CV_FONT_BLACK, 1.0,1.0,0,1,8);

 

        char str[20];

        sprintf(str,"(%d,%d)",x,y); //坐标

        cvPutText(img, str, cvPoint(x,y), &font, CV_RGB(250,0,0));

        cvShowImage("test5", img);

        }

        break;

    }

}

 

int main(int argc, char *argv[])

{

    CvCapture *capture = cvCreateFileCapture("1.avi");

    //初始化视频写结构体.

    //视频的格式, 频率, 每帧大小, 是否默认彩色

    CvVideoWriter * videoWriter = cvCreateVideoWriter(

                "2.avi",

                cvGetCaptureProperty(capture, CV_CAP_PROP_FOURCC),

                cvGetCaptureProperty(capture, CV_CAP_PROP_FPS),

                cvSize(

                    (double)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH),

                    (double)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT)

                    ),

                1

                );

 

    cvNamedWindow("test1", CV_WINDOW_AUTOSIZE);

    cvNamedWindow("test2", CV_WINDOW_AUTOSIZE);

    cvNamedWindow("test3", CV_WINDOW_AUTOSIZE);

    cvNamedWindow("test4", CV_WINDOW_AUTOSIZE);

    cvNamedWindow("test5", CV_WINDOW_AUTOSIZE);

 

    //5种不同的窗口, 图片帧

    IplImage *img = cvQueryFrame(capture);

    IplImage *frame = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);

    IplImage *pCanny = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);

    IplImage *h_img = cvCreateImage(

                cvSize(img->width/2,img->height/2),

                img->depth,

                img->nChannels

                );

    IplImage *image = cvCreateImage(

                cvSize(img->width*3, img->height),

                img->depth,

                img->nChannels

                );

 

    //创建鼠标点击, 在图像上打印坐标.

    //my_mouse_callback坐标左键点击反应回调函数.

    //image传入的参数(void *)

    cvSetMouseCallback("test5", my_mouse_callback, image);

 

 

    while(1)

    {

        img = cvQueryFrame(capture);

        if(img == NULL) break;

        cvWriteFrame( videoWriter, img ); //视频写

        cvCvtColor(img, frame, CV_RGB2GRAY); //RGB -> GRAY

        cvCanny(frame, pCanny, 50, 150, 3); // 边缘检测

        cvPyrDown(img, h_img); //图像缩小

 

        //将三个视频拼接在一个窗口显示.

        cvSetImageROI(image, cvRect(0,0,img->width,img->height)); //设置关注区域

        cvCopy(img, image);

        cvResetImageROI(image);

 

        cvSetImageROI(image, cvRect(img->width,0,img->width,img->height));

        cvCvtColor(frame, image, CV_GRAY2RGB);

        CvFont font; //打印字体格式

        cvInitFont(&font, CV_FONT_BLACK, 1.0,1.0,0,1,8);

        cvPutText(image, "(Benson!!!)", cvPoint(10,50), &font, CV_RGB(250,250,250));

        cvResetImageROI(image);

 

        cvSetImageROI(image, cvRect(2*img->width,0,img->width,img->height));

        cvCvtColor(pCanny, image, CV_GRAY2RGB);

        cvResetImageROI(image);

 

 

        cvShowImage("test1", img);

        cvShowImage("test2", frame);

        cvShowImage("test3", pCanny);

        cvShowImage("test4", h_img);

        cvShowImage("test5", image);

        if( (char)cvWaitKey(33) == 27) break;

    }

 

    cvReleaseVideoWriter(&videoWriter);

    cvReleaseImage(&img);

    cvReleaseImage(&frame);

    cvReleaseImage(&pCanny);

    cvReleaseImage(&h_img);

    cvReleaseImage(&image);

    cvDestroyAllWindows();

 

    return 0;

}

结果:
红色字体(998,177)是鼠标点击坐标值.
兴趣学习: <wbr>opencv <wbr>-- <wbr>视频读写, <wbr>鼠标响应事件

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值