函数内部的copyTo()与clone()比较? 我刚刚开始学习C++和OpenCV。我试图创建自己的函数,但我不明白为什么copyTo(dst)可以工作,但当我使用dst=src.clone()时显示的输出为黑色 void testFunc(InputArray _src, OutputArray _dst){ Mat src = _src.getMat(); _dst.create(src.size(), src.type()); Mat dst = _dst.getMat(); src.copyTo(dst); // ^this works but // dst = src.clone(); doesn't }

函数内部的copyTo()与clone()比较? 我刚刚开始学习C++和OpenCV。我试图创建自己的函数,但我不明白为什么copyTo(dst)可以工作,但当我使用dst=src.clone()时显示的输出为黑色 void testFunc(InputArray _src, OutputArray _dst){ Mat src = _src.getMat(); _dst.create(src.size(), src.type()); Mat dst = _dst.getMat(); src.copyTo(dst); // ^this works but // dst = src.clone(); doesn't },c++,opencv,C++,Opencv,我认为解决这个问题的一个方法是将Mat视为指针(不太正确,但请幽默一下) 在您的示例中,您创建了指向源矩阵的Mat src。然后使用create(…)为目标创建一个矩阵,并创建指向该新矩阵的新指针Mat dst。当您使用src.copyTo(dst)时,OpenCV将src指向的数据复制到dst指向的目标中,但是当您使用赋值dst=src.clone()时,dst将被替换为src的克隆(即,指针更改到新位置) 对于基本类型,这可以转化为: struct Input { int* data; };

我认为解决这个问题的一个方法是将
Mat
视为指针(不太正确,但请幽默一下)

在您的示例中,您创建了指向源矩阵的
Mat src
。然后使用
create(…)
为目标创建一个矩阵,并创建指向该新矩阵的新指针
Mat dst
。当您使用
src.copyTo(dst)
时,OpenCV将
src
指向的数据复制到
dst
指向的目标中,但是当您使用赋值
dst=src.clone()
时,
dst
将被替换为
src
的克隆(即,指针更改到新位置)

对于基本类型,这可以转化为:

struct Input { int* data; };
struct Output { int* data; };

void testFunc(Input _src, Output _dst)
{
    int* src = _src.data;
    _dst.data = new int;
    int* dst = _dst.data;

    // src.copyTo(dst)
    *dst = *src;

    // dst = src.clone()
    dst = new int(*src);
}
这种思考方式并不完全正确,但它可能有助于思考这种行为