gpt4 book ai didi

opencv - OpenCV和C++:全局cv::Mat对象返回错误的值

转载 作者:行者123 更新时间:2023-12-02 17:52:58 25 4
gpt4 key购买 nike

我正在尝试在Windows Form中使用OpenCV。我创建了一个全局cv::Mat对象,并期望该对象可用于其他功能。但是,每次我初始化全局cv::Mat对象并退出/返回该函数时,我的全局cv::Mat对象的值都会由于未知原因而自动更改。

一个示例代码片段如下所示:

private: cv::Mat *cvImage;

出于某种原因,我创建了一个名为decode()的函数,该函数返回cv::Mat。
void copy(){cvImage = &decode();}

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

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

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

最佳答案

您在那里使用指针会产生不确定的行为。不要将它们与Mats一起使用!

不要cv::Mat *cvImage;
DO cv::Mat cvImage;
cv::Mat被引用,那些指针将破坏它们。

提醒一句:

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 *,而不是获取临时地址

    垫*解码(){
    Mat * m =新Mat(100,100,CV_UC8);
    ...
    返回m;
  • 让我们复制旧版本

    无效copy(){
    如果(cvImage)删除cvImage;
    cvImage =解码();
  • 关于opencv - OpenCV和C++:全局cv::Mat对象返回错误的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15677122/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com