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

来源:互联网 发布:win7如何安装linux系统 编辑:程序博客网 时间:2024/06/03 11:17

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 )

    {

    caseCV_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();

 

    return0;

}

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

 
0 0
原创粉丝点击