Я не понимаю, почему в результате переноса setMouseCallback
объект Mat
в onMouse
становится пустым, в то время как вызов setMouseCallback
непосредственно в main
не делает.
#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);
}
Редактировать
Аргументация в ответ Алексис Уилк имеет смысл, но она может быть не на 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);
}