c++ - 函数内部的 copyTo() 与 clone() ?

标签 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
}

最佳答案

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

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

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

相关文章:

c++ - 使用 boost 检查 std::string 是否是有效的 uuid

c++ - 什么库包含 map STL 集合?

c++ - A*算法人工智能中魔方的启发式函数

c++ - 从opencv中的像素数组创建矩阵

c++ - 使用 Regex 删除前导/尾随空格,引号除外

python - 旋转图像并裁剪黑色边框

c# - 使用 OpenCV 感知二维图像中长方体的尺寸(或突出点)

python - OpenCV python 重叠粒子大小和数量

java.lang.UnsatisfiedLinkError/tmp/javacpp94368173067/libopencv_core.so.2.4 : cannot open shared object file: No such file or directory

c++ - MFC ODBC SQLConfigDataSource() 未处理的异常