OpenCV& C ++:global cv :: Mat对象返回错误的值

时间:2013-03-28 08:23:49

标签: opencv c++-cli global-variables

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

一个示例代码段如下:

private: cv::Mat *cvImage;

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

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

cvImage无法通过上述代码获得正确的值。通常是数据,dataend,datalimit,datastart和行为0或意外值。

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

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

1 个答案:

答案 0 :(得分:1)

你使用指针会产生未定义的行为。不要在垫子上使用它们!

不要 cv::Mat *cvImage;

DO 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。”

这是你的第一个问题,这里解码会创建一个临时的(在离开copy()后会被破坏)

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

然后返回它的地址。

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

  1. 让解码返回一个Mat *,而不是取一个temp的地址

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

  2. 让复制dlete旧的

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