【问题标题】:OpenCV & C++: global cv::Mat object returns wrong valuesOpenCV 和 C++:全局 cv::Mat 对象返回错误值
【发布时间】:2013-03-29 02:47:07
【问题描述】:

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

一个示例代码sn-p是这样的:

private: cv::Mat *cvImage;

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

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

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

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

我想知道为什么会这样??

【问题讨论】:

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


    【解决方案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() 后被销毁)

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

    然后你返回它的地址。

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

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

      垫 * 解码() { 垫 *m = 新垫(100,100,CV_UC8); ... 返回米; }

    2. 让副本删除旧的

      无效复制(){ if (cvImage) 删除 cvImage; cvImage = 解码(); }

    【讨论】:

    • 我想过你的办法,但是 cv::Mat cvImage;不能用作全局变量,因为它会说“不支持混合类型”。编译时。将其定义为指针的唯一方法。
    • 那里的“混合型”是什么?我敢肯定,有办法避免它
    • 我不确定,但它给了我一个错误:“d:\ImageProcess\Form1.h(109): error C4368: cannot define 'cvImage' as a member of managed 'ImageProcess:: Form1':不支持混合类型”每当我使用 private 编译时:cv::Mat cvImage;作为全局变量。
    • 它现在通过使用您的建议获得正确的值。谢谢。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    相关资源
    最近更新 更多