可以使用OpenCV函数cvtColor来转换矩阵吗?

Tim*_* MB 10 c++ opencv

OpenCV函数cvtColor转换矩阵的颜色空间(例如,从RGB到灰度).函数的C++签名是

void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 )
Run Code Online (Sandbox Code Playgroud)

可以使用此函数将矩阵转换到位,即使用src相同的对象dst吗?

cv::Mat mat = getColorImage();
cvtColor(mat, mat, CV_RGB2GRAY);
Run Code Online (Sandbox Code Playgroud)

(我知道无论哪种方式,因为目的地的通道数量不同于源,它仍然需要为目的地分配一个新的内存块.)

更一般地说,OpenCV API中是否有一个约定来确定何时可以以这种方式使用函数?

Giu*_*ini 8

也许现在回答已经太晚了,但我想说我不同意这里写的一些事情.
即使目标矩阵没有"相同的通道数",或者即使还没有创建dest矩阵,您也可以将相同的Mat放置为源和目标,没有问题.
OpenCV程序员彻底设计了它.
此函数的所有用户必须注意源Mat是否正确,通道数和数据类型,并记住在函数调用后它们可能会更改.

证据来自查看源代码,在2406行,只是cv::cvtColor(…)函数内的第一行,

Mat src = _src.getMat();
Run Code Online (Sandbox Code Playgroud)

调用,然后创建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.