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