为什么包装setMouseCallback导致Mat对象为空?

时间:2019-04-05 02:24:29

标签: c++ opencv

我不明白为什么包装setMouseCallback会导致Mat中的onMouse对象为空,而直接在setMouseCallback中调用main却不会。 / p>

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;


void onMouse(int event, int x, int y, int flags, void* param)
{
    Mat* image = reinterpret_cast<Mat*>(param);
    if (image->empty())
        cout << "The image is empty." << endl;
}

void Wrapper(Mat input)
{
    setMouseCallback("Input Window", onMouse, reinterpret_cast<void*>(&input));
}

int main()
{
    Mat input = imread("filename.jpg", IMREAD_UNCHANGED);

    namedWindow("Input Window", WINDOW_NORMAL);
    imshow("Input Window", input);

    // Wrapper(input); // A

    //setMouseCallback("Input Window", onMouse, reinterpret_cast<void*>(&input)); //B

    waitKey(0);
}

编辑

Alexis Wilke's answer中的推理是有道理的,但可能并非100%正确。在下面的代码中,我包装了整个内容,从而无需将Mat传递给Wrapper,但仍然出现问题。那是什么原因造成的?

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;


void onMouse(int event, int x, int y, int flags, void* param)
{
    Mat* image = reinterpret_cast<Mat*>(param);
    if (image->empty())
        cout << "The image is empty." << endl;
}

void Wrapper()
{
    Mat input = imread("filename.jpg", IMREAD_UNCHANGED);

    namedWindow("Input Window", WINDOW_NORMAL);
    imshow("Input Window", input);

    setMouseCallback("Input Window", onMouse, reinterpret_cast<void*>(&input));
}

int main()
{

    Wrapper(); 

    waitKey(0);
}

2 个答案:

答案 0 :(得分:0)

您的意思是用参考值而非复制值来声明Wrapper()

void Wrapper(Mat & input)
{
    setMouseCallback("Input Window", onMouse, reinterpret_cast<void*>(&input));
}

查看其他&吗?

在没有&的情况下,您会传递input的副本,而原始文件不会被修改。

Mat input;
Wrapper(input);   // without the `&`, input is copied and whatever happens
                  // to the copy is not known by the caller

您还可以使用一个指针:

void Wrapper(Mat * input)

尽管我怀疑您正在使用引用来避免使用指针。

答案 1 :(得分:0)

推理是未知的,但是以下解决了该问题!

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;


void onMouse(int event, int x, int y, int flags, void* param)
{
    Mat* image = reinterpret_cast<Mat*>(param);
    if (image->empty())
        cout << "The image is empty." << endl;
}

void Wrapper()
{
    Mat input = imread("filename.jpg", IMREAD_UNCHANGED);

    namedWindow("Input Window", WINDOW_NORMAL);
    imshow("Input Window", input);

    setMouseCallback("Input Window", onMouse, reinterpret_cast<void*>(&input));

    waitKey(0);
}

int main()
{    
    Wrapper();             
}