0

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
}
4

1 に答える 1

1

この主題に関する私の以前の投稿を参照として使用します:

OpenCVウィンドウを作成し、マウスの左ボタンが押されるたびにコンソールにメッセージを書き込む、簡単なC ++ / Qt/OpenCVデモを組み立てることができました。

コードは自明だと思います。

main.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);
}
于 2013-01-31T18:55:56.870 に答える