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

最佳答案

我认为解决此问题的一种方法是将Mat视为指针(不是很正确,但暂时让我感到幽默)。

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

对于基本类型,这可以翻译为:

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);
}

这种思考方式并不完全正确,但对于思考此行为可能会很有用。

关于c++ - 函数内部的copyTo()vs clone()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23719218/

10-13 07:11