C++ 在Qt中使用CvMouseCallback
程序将首先显示带有网络摄像头提要的窗口,用户将通过在其上绘制正方形/矩形来定义要跟踪的对象。之后,将出现一个新窗口,显示跟踪的对象 我主要从这里获得代码: 它在控制台中运行良好,因此。我尝试使用Qt GUI,因为我需要使用Qt GUI,因为我想添加一些功能,包括按钮、对话框等。但当我这样做时,它说: 错误:无法将“Calibrate::mouseHandler”从类型“void(Calibrate:)(int,int,int,int,void*)”转换为类型“CvMouseCallback{aka void(属性)((cdecl))(int,int,int,int,int,void)}” {cvSetMouseCallback(“图像”,鼠标手柄和鼠标垫);} 在这一行中发现错误: {cvSetMouseCallback(“图像”,鼠标手柄和鼠标垫);} MouseCallback函数可在以下位置找到:C++ 在Qt中使用CvMouseCallback,c++,qt,opencv,C++,Qt,Opencv,程序将首先显示带有网络摄像头提要的窗口,用户将通过在其上绘制正方形/矩形来定义要跟踪的对象。之后,将出现一个新窗口,显示跟踪的对象 我主要从这里获得代码: 它在控制台中运行良好,因此。我尝试使用Qt GUI,因为我需要使用Qt GUI,因为我想添加一些功能,包括按钮、对话框等。但当我这样做时,它说: 错误:无法将“Calibrate::mouseHandler”从类型“void(Calibrate:)(int,int,int,int,void*)”转换为类型“CvMouseCallback{ak
///------- MouseCallback function ------------------------------------------------------------------------------------------
void mouseHandler(int event, int x, int y, int flags, void *param)
{
if (event == CV_EVENT_LBUTTONDOWN && !drag)
{
/// left button clicked. ROI selection begins
point1 = Point(x, y);
drag = 1;
}
if (event == CV_EVENT_MOUSEMOVE && drag)
{
/// mouse dragged. ROI being selected
Mat img1 = img.clone();
point2 = Point(x, y);
rectangle(img1, point1, point2, CV_RGB(255, 0, 0), 3, 8, 0);
imshow("image", img1);
}
if (event == CV_EVENT_LBUTTONUP && drag)
{
point2 = Point(x, y);
rect = Rect(point1.x, point1.y, x - point1.x, y - point1.y);
drag = 0;
roiImg = img(rect);
roiImg.copyTo(mytemplate);
// imshow("MOUSE roiImg", roiImg); waitKey(0);
}
if (event == CV_EVENT_LBUTTONUP)
{
/// ROI selected
select_flag = 1;
drag = 0;
}
}
CV::SETMOSECARLACKEY(OH,请使用C++ API,而不是旧的C-One)期望一个自由(非类成员)函数作为回调。 所以,有两种方法来处理这个问题:
- 将其设为静态(此时不能使用“this”指针或任何类成员)
- 重定向到静态函数,并从此处调用您的成员函数:
类校准{
})void mouseHandler(int event, int x, int y, int flags, void *param) { // this is your member-function shown above. } static void mouseWrapper(int event, int x, int y, int flags, void *param) { Calibrate * cal = (Calibrate*)param; // cast back to 'this' // now call your member-function. cal->mouseHandler(event, x, y,flags, 0) ; } void init() { // call the wrapper function instead, and // pass this pointer for later redirection cv::setMouseHandler("image",mouseWrapper,this); }
确保你使用的是C++ API。因此,也许你必须更改要包含的标题。 您应该使用的函数是setMouseCallback(const String&winname,MouseCallback onMouse,void*userdata=0)。 这在opencv2/highgui.hpp中声明
那么@berak提供的“静态”解决方案应该可以工作。参考@berak的方法,只需稍作更改,它就会工作 而不是编码cv::setMouseHandler(“image”,mouseWrapper,this)
,将其更改为cv::setMouseCallback
。OpenCV中没有名为setMouseHandler
的函数,因此它肯定没有被声明
别忘了在头文件中声明函数。(仅限mouseHandler
)
这是我的代码,请看:
void MainWindow::mouseHandler(int event, int x, int y, int flags, void *param)
{
// this is your member-function shown above.
}
void mouseWrapper(int event, int x, int y, int flags, void *param)
{
MainWindow * cal = (MainWindow*)param; // cast back to 'this'
// now call your member-function.
cal->mouseHandler(event, x, y,flags, 0) ;
}
void MainWindow::on_pushButton_clicked()
{
setMouseCallback("image", mouseWrapper, this);
}
希望能有帮助 这是太多的代码浏览。请提供一个兼容的小示例来重现这个问题。我不知道OpenCV框架,但我知道,由于调用约定的不同,使用类成员函数作为回调函数通常会有困难。我建议保留您拥有的鼠标处理程序,但将其用于收集必要的数据,并将自定义的
QEvent
(例如OpenCVEvent)发布回事件队列,并让您的Calibrate
类在其event()
函数中拾取事件。我尝试了您的建议,但没有成功。我不确定我是否都明白了。它说,'setMouseHandler'没有在这个范围内声明
ooh,我的错。cv::namespace丢失,它是cv::setMouseHandler(或在标题后添加:使用命名空间cv;
)。我的程序中已经有使用命名空间cv
。也许我的代码真的有问题。