OpenCV函数cvtColor转换矩阵的颜色空间(例如,从RGB到灰度)。函数的C ++签名是
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 )
是否可以使用此函数转换矩阵,即src
与dst
相同的对象?
cv::Mat mat = getColorImage();
cvtColor(mat, mat, CV_RGB2GRAY);
(我知道无论哪种方式,因为目的地的通道数量不同于源,它仍然需要为目的地分配一个新的内存块。)
更一般地说,OpenCV API中是否有一个约定来确定何时可以以这种方式使用函数?
答案 0 :(得分:7)
回答可能为时已晚,但我想说我不同意这里写的一些事情。
即使目标矩阵没有“相同的通道数”,或者即使尚未创建目标矩阵,也可以将相同的Mat放置为源和目标,没有问题。
OpenCV程序员彻底设计了它
此函数的所有用户必须注意源Mat是否正确,通道数和数据类型,并记住在函数调用后它们可以更改。
证据来自于source code,在第2406行,只是cv::cvtColor(…)
函数内的第一行,
Mat src = _src.getMat();
调用,然后创建Mat dst(和dst = _dst = _scr)
因此,当进行就地调用时,cv::cvtColor(…)
内的情况如下:src指向旧矩阵,_src,_dst,dst都指向相同的新分配矩阵,它将是目标矩阵。
这意味着现在新的变量src和dst(不是函数调用_src和_dst中的变量)可以传递给实际的转换函数。
当函数void cv::cvtColor(…)
完成时,src被释放,_src,_dst和dst都指向相同的Mat,_dst的refcount将变为1.
答案 1 :(得分:3)
如果查看代码here,您会看到在第2420行,在create
矩阵上调用dst
。这意味着将重写数据部分以及此矩阵的标题。因此,在src
和dst
中使用相同的矩阵调用此函数可能并不可取。
至于OpenCV中的约定,看一下InputArray and OutputArray,这些似乎暗示每当函数调用与输入和输出的数据类型一起存在时,你应该使用不同的Mat
变量
答案 2 :(得分:2)
它必须在dst
调用cv::cvtColor
后包含正确转换的矩阵的意义上就地工作。但如果输入的通道数与输出通道数不同,那么矩阵的数据将被重新分配。
如果您有dst
在cvtColor
就地呼叫后没有正确转换图片的示例,请将其作为http://code.opencv.org
更一般地说,OpenCV API中是否有一个约定来确定何时可以以这种方式使用函数?
没有这样的惯例。但是您可以期望大多数基本图像处理功能可以就地工作。因此,已知所有转换,过滤器,阈值,仿射/透视变换都支持就地调用。