使用鼠标回调修改类中的 Mat 属性

Modifying Mat attribute in class with mouse callback

本文关键字:Mat 属性 修改 鼠标 回调      更新时间:2023-10-16

将解释使用项目符号使其易于阅读(希望如此):

  • 我正在编写一个程序,该程序需要能够使用鼠标在图像上绘制。
  • 我组织程序的方式是每个图像都存储在它自己的类实例中。该实例包括一个保存图像的 cv::Mat 属性,以及一个空白的 cv::Mat(我称之为画布),我希望在其中保存绘制的任何内容。画布的大小和类型与图像 cv::Mat 相同。
  • 我编写了一个鼠标回调函数来绘制矩形,但是我收到一个错误(我相信这与从图像中获取存储的画布有关)。

OpenCV 错误:setSize 中的断言失败 (0 <= _dims &&_dims <= CV_MAX_DIM),文件/tmp/opencv-0tcS7S/opencv-2.4.9/modules/core/src/matrix.cpp,第 89 行libc++abi.dylib:以 cv::Exception:/tmp/opencv-0tcS7S/opencv-2.4.9/modules/core/src/matrix.cpp:89 的未捕获异常终止:错误:(-215) 0 <= _dims &&_dims <= 函数 setSize 中的CV_MAX_DIM

这是我的代码:

void draw(int event, int x, int y, int flags, void* params){
ImgData* input = (ImgData*)params;  //Convert the struct passed in as void to a ImageData struct.
if(event == EVENT_LBUTTONDOWN){
    printf("Left mouse button clicked.n");
    input->ipt = Point(x,y);                        //Store the initial point, this point is saved in memory.
    printf("Original position = (%i,%i)n",x,y);
}else if(event == EVENT_LBUTTONUP){
    cv::Mat temp_canvas;
    input->getCanvas().copyTo(temp_canvas);
    printf("Left mouse button released.n");
    input->fpt = Point(x,y);                        //Final Point.
    cv::rectangle(temp_canvas, input->ipt, input->fpt, Scalar(200,0,0));
    input->setCanvas(temp_canvas);
}
}

我尝试这样做的方法是从对象实例复制画布,在此副本上绘制矩形,然后用此修改后的画布覆盖旧画布。

对此的任何帮助或解释为什么会发生将不胜感激。

谢谢

我已经解决了这个问题,只是我没有正确传递对象:

setMouseCallback("Window", draw, &images->at(imageShown));  // replaced the code: setMouseCallback("Window", draw, &images[imageShown]);

愚蠢的错误...