У меня проблема с 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
}
Используя в качестве ссылки мои предыдущие посты на эту тему:
Мне удалось собрать быструю демонстрацию 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);
}
Других решений пока нет …