C++ OpenCV函数cvtColor能否用于就地转换矩阵?

C++ OpenCV函数cvtColor能否用于就地转换矩阵?,c++,opencv,C++,Opencv,OpenCV函数用于转换矩阵的颜色空间(例如,从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函数用于转换矩阵的颜色空间(例如,从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中是否有一个约定来确定何时可以以这种方式使用函数?

如果您查看代码,您将看到在第2420行,在矩阵
dst
上调用了
create
。这意味着数据部分以及该矩阵的标题将被重写。因此,不建议在
src
dst
中使用相同的矩阵调用此函数


至于OpenCV中的一个约定,请看一下,这些似乎表明,无论何时函数调用作为输入和输出的数据类型存在,您可能应该使用不同的
Mat
变量。

它必须在调用
cv::cvtColor
dst
将包含正确转换的矩阵的意义上正常工作。但如果输入通道数与输出通道数不同,则矩阵数据将重新分配

如果您有一个样本,
dst
在调用
cvtColor
后没有正确转换的图像,请在

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


没有这样的惯例。但是您可以预期大多数基本的图像处理功能都可以正常工作。因此,所有的转换、过滤器、阈值、仿射/透视转换都支持就地调用。

也许现在回答已经太迟了,但我想说的是,我不同意这里写的一些内容。
即使目的地矩阵没有“相同数量的通道”,或者即使尚未创建目的地矩阵,您也可以毫无问题地将相同的Mat放置为源和目的地。
OpenCV程序员彻底设计了它。
此函数的所有用户都必须注意源Mat是否正确,通道数和数据类型是否正确,并且记住,在函数调用后,他们可能会更改

证据来自于在第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。

当源和目标具有相同数量的通道时,可以完成此操作。e、 从RGB到YUV,从RGB到YCbCr,或者从RGB到YCbCr,等等……嗯,我明白你的意思了。但是当一个矩阵被转换成一个输入阵列时,它可能会收到一个新的头?提供一个新的头是用指针创建的。此外,查看_InputArray的头表明getMat()函数还返回具有自己头的Mat,而不是对相同头数据的引用。是的。。。确切地所以你可能应该使用不同的Mat变量。。。如果您不清楚标题在哪里更改以及数据在哪里,调试这些应用程序可能会有点棘手。是的,我同意这一点,尽管我目前没有时间实际测试它。但正如我所看到的,通过InputArray传递等同于通过cv::Mat传递值,这意味着两个矩阵指向同一组数据。如果需要重新分配,则这不会影响指向原始数据的原始矩阵标题。是,重新分配后,新矩阵为目标矩阵,而源矩阵为临时矩阵,在函数结束时将丢失。我刚刚对它进行了测试,这个就地方案在OpenCv框架中似乎很常见(几乎是一个标准)。