我正在尝试在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的值也会意外更改。
我想知道为什么会发生这种情况?
答案 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对象(如指针)
让解码返回一个Mat *,而不是取一个temp的地址
Mat * decode(){ Mat * m = new Mat(100,100,CV_UC8); ... 返回m; }
让复制dlete旧的
void copy(){ if(cvImage)删除cvImage; cvImage = decode(); }