我不明白为什么包装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);
}
答案 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();
}