鼠标回调函数 OpenCV

MouseCallback Function OpenCV

本文关键字:OpenCV 函数 回调 鼠标      更新时间:2023-10-16

我在使用OpenCV时遇到了问题。我已经尝试了其他问题的实现,但问题仍然存在。我有一个名为 MainWindow 的类,在该类的某个时候,它会创建一个名为"rectified"的 NamedWindow。在我的主函数中,我试图添加一个侦听器来捕获该 cvNamedWindow 实例上的点击事件。问题是on_mouse函数没有响应。这是我的主要方法:

static void on_mouse( int event, int x, int y, int flags, void *param)
{
     qDebug("hjhv00");
     MainWindow * mw=(MainWindow*)param;
     if(mw->getMyVision()->getCalibrationDone())
     {
        if(event==CV_EVENT_LBUTTONDOWN){
           qDebug("%d<---->%d",x,y);
        }
     }
}
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    int mouseParam=5;
    w.show();
    cvSetMouseCallback("rectified",on_mouse,&w);
    return a.exec();
    // test svn
    // test from google
}

参考我以前关于这个主题的文章:

  • 使用OpenCV在网络摄像头上绘图
  • 自由格式图像选择(最好是 C++ 格式)
  • 从视频上的矩形使用鼠标设置 ROI

我能够组装一个快速的 C++/Qt/OpenCV 演示,该演示创建一个 OpenCV 窗口,并在每次按下鼠标左键时在控制台上写入一条消息。

我相信代码是不言自明的:

主.cpp:

#include <cv.h>
#include <highgui.h>
#include <iostream>
#include <QtWidgets/QApplication>

void on_mouse(int event, int x, int y, int flags, void* param)
{
    if (event == CV_EVENT_LBUTTONDOWN)
    {
        std::cout << "@ Left mouse button pressed at: " << x << "," << y << std::endl;
    }
}

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    IplImage* img = cvLoadImage("/Users/karlphillip/workspace/opencv/qt_mouse/LeafGlyph.jpg");
    if (!img)
    {
        std::cout << "!!! Failed to load image" << std::endl;
        return -1;
    }
    cvNamedWindow("result", CV_WINDOW_AUTOSIZE);
    cvSetMouseCallback("result",&on_mouse, 0);
    cvShowImage("result", img);
    cvWaitKey(0);
    return app.exec();
}

project.pro(在 Mac OS X 上使用):

TEMPLATE = app
QT      += widgets
## OpenCV settings for Mac OS X
macx {
    INCLUDEPATH += /usr/local/include/opencv
    LIBS += -L/usr/local/lib/ 
        -lopencv_core 
        -lopencv_highgui 
        -lopencv_imgproc
}
SOURCES += 
    main.cpp 

有关实现的说明:

我建议你将呼叫移动到cvSetMouseCallback()到你呼叫cvNamedWindow()的任何地方。我怀疑正确的地方是在应该创建窗口的MainWindow的构造函数中,对吧?!然后,还必须将on_mouse()定义为MainWindow静态成员并实现它。

如果这样做,则代码将类似于:

void MainWindow::on_mouse(int event, int x, int y, int flags, void* param)
{
    if (event == CV_EVENT_LBUTTONDOWN)
    {
        std::cout << "@ Left mouse button pressed at: " << x << "," << y << std::endl;
    }
}
MainWindow::MainWindow()
{
    IplImage* img = cvLoadImage("/Users/karlphillip/workspace/opencv/qt_mouse/LeafGlyph.jpg");
    if (!img)
    {
        std::cout << "!!! Failed to load image" << std::endl;
        return;
    }
    cvNamedWindow("result", CV_WINDOW_AUTOSIZE);
    cvSetMouseCallback("result",&on_mouse, 0);
    cvShowImage("result", img);
    cvWaitKey(0);
}