我试图在Windows窗体中使用OpenCV。我创建了一个全局cv::Mat对象,并期望该对象供其他函数使用。然而,每次我初始化全局cv::Mat对象并退出/返回函数时,全局cv::Mat对象的值就会由于未知的原因自动改变。
一个示例代码片段如下:private: cv::Mat *cvImage;
出于某种原因,我创建了一个名为decode()的函数,它返回cv::Mat。
void copy(){cvImage = &decode();}
cvImage无法通过上述代码获得正确的值。通常是数据、数据端、数据限制、数据艺术和行为0或非预期值。
甚至我试图使用一个局部变量,说cv::Mat img,做一切然后运行cvImage = &img;
,每当函数退出或返回时,cvImage的值也会意外地改变。
我想知道为什么会发生这种情况??
指针的使用会产生未定义的行为。不要和Mats一起使用!
don 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。"
这是你在这里的第一个问题decode创建了一个临时(在离开copy()后被销毁)
void copy(){cvImage = &decode();}
,然后返回它的地址
似乎,cli只能处理POD对象(如指针)
让decode返回a a Mat*,而不是获取temp的地址
Mat * decode() {Mat *m = new Mat(100,100,CV_UC8);…返回m;}
let copy delete the old one
空白拷贝(){如果(cvImage)删除cvImage;cvImage = decode();}