0

我正在尝试在 Windows 窗体中使用 OpenCV。我创建了一个全局 cv::Mat 对象,并期望该对象供其他函数使用。但是,每次我初始化全局 cv::Mat 对象并退出/返回函数时,我的全局 cv::Mat 对象的值都会自动更改,原因不明。

一个示例代码片段如下:

private: cv::Mat *cvImage;

出于某种原因,我创建了一个名为 decode() 的函数,它返回 cv::Mat。

void copy(){cvImage = &decode();}

cvImage 无法通过上述代码获得正确的值。通常是 data、dataend、datalimit、datastart 和 rows 为 0 或意外值。

即使我尝试使用局部变量,比如 cv::Mat img 来做所有事情然后运行 cvImage = &img; ,每当函数退出或返回时,cvImage 的值也会意外改变。

我想知道为什么会发生这种情况??

4

1 回答 1

1

您在那里使用指针会产生未定义的行为。不要将它们与垫子一起使用!

cv::Mat *cvImage;

cv::Mat cvImage;

cv::Mats 被引用,那些指针会对它们造成严重破坏。

提醒一句:

Mat a,b;  b=a;         // shallow copy, shared pixels (that's probably, what you wanted)
Mat a,b;  b=a.clone(); // deep copy, b will have y copy of a's pixels

编辑:

“出于某种原因,我创建了一个名为 decode() 的函数,它返回 cv::Mat。”

这是你的第一个问题,这里 decode 创建了一个临时的(离开 copy() 后被销毁)

无效复制(){cvImage = &decode();}

然后你返回它的地址。

因为看起来,cli 只能处理 POD 对象(如指针)

  1. 让解码返回 a Mat*,而不是获取临时地址

    Mat * decode() { Mat *m = new Mat(100,100,CV_UC8); ...返回米;}

  2. 让副本删除旧的

    void copy(){ if (cvImage) 删除 cvImage; cvImage = 解码();}

于 2013-03-28T10:17:52.420 回答