Функция MouseCallback OpenCV

У меня проблема с OpenCV. Я пробовал реализацию из других вопросов, но проблема остается снова. У меня есть класс под названием MainWindow и в какой-то момент в этом классе он создает 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
}

0

Решение

Используя в качестве ссылки мои предыдущие посты на эту тему:

Мне удалось собрать быструю демонстрацию C ++ / Qt / OpenCV, которая создает окно 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);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]