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

时间:2013-03-11 16:36:45

标签: c++ opencv

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

void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 )

是否可以使用此函数转换矩阵,即srcdst相同的对象?

cv::Mat mat = getColorImage();
cvtColor(mat, mat, CV_RGB2GRAY);

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

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

3 个答案:

答案 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。这意味着将重写数据部分以及此矩阵的标题。因此,在srcdst中使用相同的矩阵调用此函数可能并不可取。

至于OpenCV中的约定,看一下InputArray and OutputArray,这些似乎暗示每当函数调用与输入和输出的数据类型一起存在时,你应该使用不同的Mat变量

答案 2 :(得分:2)

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

如果您有dstcvtColor就地呼叫后没有正确转换图片的示例,请将其作为http://code.opencv.org

的错误提交
  

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

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