为啥 OPENCV 中有这么多函数使用 InputArray 和 OutputArray 作为函数参数?

Posted

技术标签:

【中文标题】为啥 OPENCV 中有这么多函数使用 InputArray 和 OutputArray 作为函数参数?【英文标题】:Why so many functions in OPENCV use InputArray and OutputArray as function arguments?为什么 OPENCV 中有这么多函数使用 InputArray 和 OutputArray 作为函数参数? 【发布时间】:2016-05-18 11:10:52 【问题描述】:

OPENCV 中的许多函数都使用 InputArray 和 OutputArray 作为函数参数。比如OPENCV中的霍夫变换函数:

void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0 )

在函数内部,我们必须使用 InputArray 函数getMat 将其赋予真正的输入数组类型。例如,Mat image= _image.getMat()。同样,我们必须使用copyTo 函数将真正的输出数组转换为OutputArray 格式。例如,Mat(lines).copyTo(_lines)

我的问题是为什么 OPENCV 以这种方式设计其函数签名。以霍夫函数为例,如果我们使用以下函数签名:

void HoughLines(Mat &image, std::vector<Vec2f> &lines, double rho, double theta, int threshold, double srn=0, double stn=0 )

我希望这样做会更好,因为它可以消除额外的不必要的复制操作。

【问题讨论】:

相关:***.com/q/31820088/5008845 我希望这样做会更好,因为这样做可以消除额外的不必要的复制操作。实际上不涉及复制。 【参考方案1】:

来自 (http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html?highlight=inputarray#InputArray)

当您在参考手册或 OpenCV 源代码中看到一个接受 InputArray 的函数时,这意味着您实际上可以传递 Mat、Matx、向量等(参见上面的完整列表)。

cv 数组只是代理类。您可以使用 cv::Mat 变量作为输入/输出数组(您不必自己包装它们)。

【讨论】:

以上是关于为啥 OPENCV 中有这么多函数使用 InputArray 和 OutputArray 作为函数参数?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV这么简单为啥不学——2逐帧播放视频(VideoCapture函数waitKey函数0xFF == ord(‘1‘))

为啥在汇编输出中有这么多 iostream 样板文件?

为啥 C++ 中有这么多字符串类型?

为啥有这么多符号链接?

为啥块之间的 GIF 编码/解码中有这么多填充

OpenCV这么简单为啥不学——1.9cvtColor颜色空间转换(全色值效果演示)