2013-03-28 228 views
0

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

一个示例代码段是这样的:

private: cv::Mat *cvImage; 

出于某种原因,我创建了一个函数调用的解码(),它返回CV ::垫。

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

cvImage无法通过上述代码获取正确的值。通常是数据,数据结束,数据限制,数据存储和行是0或意外的值。

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

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

回答

1

您在那里使用指针创建未定义的行为。不要在垫子上使用它们!

DONTcv::Mat *cvImage;

DOcv::Mat cvImage;

CV ::垫引用计数,这些指针将破坏他们的破坏。

一个提醒:

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 

编辑:

“出于某种原因,我创建了一个函数调用解码()返回CV ::垫。”

,这里是你的第一个问题解码创建一个临时

无效副本(){cvImage = &解码();}(这被留下复印件()后销毁)

,并返回的地址它。

,因为它似乎是CLI只能处理POD对象(如指针)

  1. 让利解码回报AA垫*,而不是采取临时的地址

    垫*解码() Mat * m =新的Mat(100,100,CV_UC8); ... return m; }

  2. 让副本dlete旧

    无效副本(){ 如果(cvImage)删除cvImage; cvImage = decode(); }

+0

我想到了你的方式,但cv :: Mat cvImage;不能用作全局变量,因为它会说“混合类型不受支持”。同时编译。使其定义为指针的唯一方法。 – Novfrank 2013-03-28 12:02:20

+0

那你的“混合型”是什么?我确定,它是一种避免它的方法 – berak 2013-03-28 13:10:23

+0

我不确定,但它给了我一个错误:“d:\ ImageProcess \ Form1.h(109):错误C4368:无法将'cvImage'定义为托管成员'ImageProcess :: Form1':不支持混合类型“每当我使用private编译:cv :: Mat cvImage;作为全局变量。 – Novfrank 2013-03-28 13:33:37