• Opencv下图像对鼠标事件的响应


    直接上代码:

     1 ////////////////////////////////////////////////////////////////////////
     2 //
     3 // 该程序从文件中读入一幅图像,响应在图片上的左键右键消息
     4 // 并显示点击图像的坐标,然后显示出来. 
     5 //
     6 ////////////////////////////////////////////////////////////////////////
     7 #include <stdlib.h>
     8 #include <stdio.h>
     9 #include <math.h>
    10 #include <cv.h>
    11 #include <highgui.h> 
    12 #include <windows.h>
    13 
    14 //定义鼠标响应消息函数mouseHandler函数名可以自己设定,event为鼠标响应事件
    15 /*event:   CV_EVENT_LBUTTONDOWN,   CV_EVENT_RBUTTONDOWN,   CV_EVENT_MBUTTONDOWN,
    16            CV_EVENT_LBUTTONUP,     CV_EVENT_RBUTTONUP,     CV_EVENT_MBUTTONUP,
    17            CV_EVENT_LBUTTONDBLCLK, CV_EVENT_RBUTTONDBLCLK, CV_EVENT_MBUTTONDBLCLK,
    18            CV_EVENT_MOUSEMOVE */
    19 
    20 //x,y为相对于图片左上角的像素坐标
    21 /*flags:   CV_EVENT_FLAG_CTRLKEY, CV_EVENT_FLAG_SHIFTKEY, CV_EVENT_FLAG_ALTKEY,
    22            CV_EVENT_FLAG_LBUTTON, CV_EVENT_FLAG_RBUTTON,  CV_EVENT_FLAG_MBUTTON */ 
    23 //void* param为用户的值传给鼠标响应函数mouseHandler
    24 void mouseHandler(int event, int x, int y, int flags, void* param)
    25 {
    26     switch(event){
    27     case CV_EVENT_LBUTTONDOWN:
    28         printf("Left button down.PixPoint(%d,%d)
    ",x,y);
    29         break; 
    30         
    31     case CV_EVENT_RBUTTONDOWN:
    32         printf("Right button down.PixPoint(%d,%d)
    ",x,y);
    33         break;
    34     case CV_EVENT_MBUTTONDOWN:
    35         if(flags&CV_EVENT_FLAG_CTRLKEY)
    36         printf("Middle button down and ctrl is press at the same time.PixPoint(%d,%d)
    ",x,y);
    37         break;
    38     }
    39   }
    40 
    41 
    42 int main(int argc, char *argv[])
    43 {
    44     IplImage* img = 0;    //定义图像文件指针,指向载入的原始图像
    45     int height,width,channels;  //定位图像的长度(像素),宽带(像素),通道数(指每个像素用多少个字节表示)
    46     uchar *data;      //存储图像具体的像素数据
    47 
    48     char Image_Filename[20];  //输入图像文件的文件名
    49 
    50     printf("Please input the filename of image:
    ");
    51     scanf("%s",Image_Filename);
    52  
    53 
    54     img=cvLoadImage(Image_Filename,0);    //载入图像函数,第一个参数为图像名称.第二个参数为辅助参数,
    55                          //有正,零,负三种值.正数表示以三通道图像载入(三通道即一个像素用3个字节表示),0表示
    56                     //以单通道载入图像,负数代表载入图像的通道数由图像本身决定.
    57     if(!img)
    58     {
    59         printf("Could not load image file: %s
    ",argv[1]);
    60         exit(0);
    61     } 
    62     
    63     
    64 
    65     cvNamedWindow("mainWin", 0);   //创建一个名称为mainWin的窗口,用于显示图像.CV_WINDOW_AUTOSIZE值为1    
    66                     //表示固定窗口大小,若第二个参数为0表示窗口大小可变,图像也会随着窗口的大小而改变
    67 
    68     cvMoveWindow("mainWin", 0, 0);  //设置窗口的位置,第一个参数为窗口的名字,后面两个参数为窗口显示的位置,(0,0)表示显示在桌面的左上角.
    69 
    70     cvSetMouseCallback("mainWin",mouseHandler,NULL); //注册鼠标事件处理函数,一个参数为要响应改函数的窗口名,第二个参数自定义的鼠标事件
    71                               //处理函数,最后一个为用户需要传给鼠标事件处理函数的值,不需要传递则设为NULL
    72 
    73     
    74     cvShowImage("mainWin", img ); //在之前创建的mainWin窗口中显示图像
    75     
    76     cvWaitKey(0);     //等待敲击键盘,结束程序    
    77     
    78     cvReleaseImage(&img );  //释放图像文件指针
    79     return 0;
    80 }


    运行结果如下:

  • 相关阅读:
    POJ3693 Maximum repetition substring —— 后缀数组 重复次数最多的连续重复子串
    SPOJ
    POJ2774 Long Long Message —— 后缀数组 两字符串的最长公共子串
    POJ3261 Milk Patterns —— 后缀数组 出现k次且可重叠的最长子串
    POJ1743 Musical Theme —— 后缀数组 重复出现且不重叠的最长子串
    SPOJ
    AC自动机小结
    HDU3247 Resource Archiver —— AC自动机 + BFS最短路 + 状压DP
    POJ1625 Censored! —— AC自动机 + DP + 大数
    Herding
  • 原文地址:https://www.cnblogs.com/vpoet/p/4659615.html
Copyright © 2020-2023  润新知