copyTo()vs clone()里面的函数?

时间:2014-05-18 06:31:08

标签: c++ opencv

我刚刚开始学习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
}

1 个答案:

答案 0 :(得分:5)

我认为解决此问题的一种方法是将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);
}

这种思考方式并不完全正确,但考虑这种行为可能有用。