Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Qt中使用CvMouseCallback_C++_Qt_Opencv - Fatal编程技术网

C++ 在Qt中使用CvMouseCallback

C++ 在Qt中使用CvMouseCallback,c++,qt,opencv,C++,Qt,Opencv,程序将首先显示带有网络摄像头提要的窗口,用户将通过在其上绘制正方形/矩形来定义要跟踪的对象。之后,将出现一个新窗口,显示跟踪的对象 我主要从这里获得代码: 它在控制台中运行良好,因此。我尝试使用Qt GUI,因为我需要使用Qt GUI,因为我想添加一些功能,包括按钮、对话框等。但当我这样做时,它说: 错误:无法将“Calibrate::mouseHandler”从类型“void(Calibrate:)(int,int,int,int,void*)”转换为类型“CvMouseCallback{ak

程序将首先显示带有网络摄像头提要的窗口,用户将通过在其上绘制正方形/矩形来定义要跟踪的对象。之后,将出现一个新窗口,显示跟踪的对象

我主要从这里获得代码:

它在控制台中运行良好,因此。我尝试使用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函数可在以下位置找到:

    ///------- 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
。也许我的代码真的有问题。