我刚开始学习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
}
Run Code Online (Sandbox Code Playgroud)
我认为解决这个问题的一种方法是将其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);
}
Run Code Online (Sandbox Code Playgroud)
这种思考方式并不完全正确,但考虑这种行为可能有用.