opencv c ++中的鼠标事件

时间:2013-12-13 19:36:41

标签: c++ events mouse geometry

我想用这个功能编写一个程序:

  

当用户在窗口上单击鼠标左键时,圆圈就是   用15半径构造

首先我制作500 * 500的黑色图像

然后我将setMouseCallback用于my_mouse_callback,在函数my_mouse_callback中我编写了我的圆圈代码,在运行程序时没有任何错误但只有黑色图像500 * 500,当我点击鼠标左键没有任何反应时,我知道我的程序有问题但在哪里?请帮帮我,我的程序是这样的:

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

int main() {
    int i,j,k;

    Mat image;
    image.create(500,500,CV_8UC3);

    namedWindow("amin");

    for(i=0;i<500;i++){
        for(j=0;j<500;j++){
            for(k=0;k<3;k++){
                Vec3b &intensity = image.at<vec3b>(j, i);
                intensity.val[k]=0; 
            }
        } 
    } 

    setMouseCallback( "amin", my_mouse_callback, &image );

    imshow("amin",image);
    waitKey(0);

    return(0); 
} 

void my_mouse_callback( int event, int x, int y, int flags, void* param ) {
    if(event==CV_EVENT_LBUTTONDOWN){
        circle( image, Point(x,y), 20, Scalar(0xff,0xff,0xff) );
    }
}

3 个答案:

答案 0 :(得分:1)

这似乎是我没有使用的OpenCV,但是:

my_mouse_callback函数无法访问图像变量 - 它是main()的本地变量吗?你的意思是:

void my_mouse_callback( int event, int x, int y, int flags, void* param ) {
    if(event==CV_EVENT_LBUTTONDOWN){
        Mat* pImage = (Mat*)param;
        Mat image = *pImage;
        circle( image, Point(x,y), 20, Scalar(0xff,0xff,0xff) );
    }
}

如果这个答案很愚蠢我会道歉,但我没有使用过CV,这是30秒文档阅读的结果。

答案 1 :(得分:0)

当我使用版本2.4.9的opencv时,我会看到以下关键事件 模块/ highgui /包含/ opencv2 / highgui.hpp

enum
{
    EVENT_MOUSEMOVE      =0,
    EVENT_LBUTTONDOWN    =1,
    EVENT_RBUTTONDOWN    =2,
    EVENT_MBUTTONDOWN    =3,
    EVENT_LBUTTONUP      =4,
    EVENT_RBUTTONUP      =5,
    EVENT_MBUTTONUP      =6,
    EVENT_LBUTTONDBLCLK  =7,
    EVENT_RBUTTONDBLCLK  =8,
    EVENT_MBUTTONDBLCLK  =9
};

因此,检查您的源文件,事件名称是否正确。

答案 2 :(得分:0)

替换这个:

imshow("amin",image);
waitKey(0);

with:

while(true){
imshow("amin",image);
waitKey(1);}  // 1ms