c++ - 可以使用 OpenCV 函数 cvtColor 就地转换矩阵吗?

标签 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);

(我知道无论哪种方式,由于目的地的 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/

相关文章:

c++14 - vec.begin() 和 begin(vec) 之间有什么区别

c++ - 从 vector 的 vector 创建一个板

c# - 从 C# 到非托管 C++ 库中执行 DllImport 时出现 MSBuild 4.0 依赖性问题

c++ - 霍夫线变换 - 45 度角的伪影

c++ - 在 C++ 中绘图

algorithm - 将曲线图案与图像的边缘相匹配

c++ - 架构x86_64的 undefined symbol : linker error

c++ - 为什么 std::accumulate 对于标准数组会有这样的行为?

python - 蝴蝶图像的特征提取

python - 使用 OpenCV 将从 Deepstream 管道提取的帧保存到视频中