鼠标回调函数 OpenCV
MouseCallback Function OpenCV
我在使用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);
}
相关文章:
- OpenCV 函数 cv::remap() 的执行时间更长,当程序在两者之间进入睡眠状态时
- 如何使用writeCloud() OpenCV函数来构建给定3D点坐标的点云
- OpenCV - 函数 cvarrToMat 中的未知数组类型
- 从OpenCV函数C NDK访问返回的值
- OpenCV 函数在由C++线程程序调用的 Python 脚本本身调用时锁定
- 使用某些OpenCV函数时出现分段错误
- Cmake找到了通往OpenCV库的路径,但没有找到OpenCV函数Rodrigues
- 如何使用opencv函数计算图像的孔数(二进制)
- 当我使用 opencv 函数 cvNorm(image,NULL,CV_L2)时,它会返回异常结果,为什么
- 代码在 HoughCircles 的 OpenCV 函数圈运行时崩溃
- 对某些 OpenCV 函数的未定义引用
- OpenCV函数来计算类似于MATLAB产品的数组元素的乘积?
- 这个opencv函数是如何在c++中解释的
- Opencv 函数只能以 C 代码方式调用,而不能以C++方式调用
- Opencv 函数和宽字符串
- 调试断言失败的 Opencv 函数
- 为什么使用TBB的OpenCV函数比基于Boost的实现快得多
- 在不使用opencv函数的情况下将RGB图像转换为HSI图像
- 我可以使用 opencv 函数(如 cv::multiply 和 std::vector<cv::Mat> 作为输入和输出参数吗?
- OpenCV 函数 "Split" & "Merge" 的调试断言失败