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);
(我知道无论哪种方式,由于目的地的 channel 数量与来源不同,它仍需要为目的地分配一个新的内存块。)
更一般地说,OpenCV API 中是否有约定来确定何时可以以这种方式使用函数?
最佳答案
也许现在回答为时已晚,但我想说我不同意这里写的一些东西。
您可以放置与源和目标完全相同的 Mat,没有问题,即使目标矩阵没有“相同数量的 channel ”,或者即使目标矩阵尚未创建。
OpenCV 程序员对其进行了彻底的设计。
此函数的所有用户必须做的是注意源 Mat 是正确的,关于 channel 数和数据类型,并记住在函数调用后它们可以更改。
证据来自于查看 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 的引用计数将变为 1。
关于c++ - 可以使用 OpenCV 函数 cvtColor 就地转换矩阵吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15343791/