在C ++ OpenCV中使用相同的变量作为输入和输出是否安全?

时间:2015-10-06 16:30:28

标签: c++ opencv arguments

许多OpenCV函数定义为

function(InputArray src, OutputArray dst, otherargs..)

因此,如果我想处理并覆盖相同的图像,我可以这样做:

function(myImg, myImg);

这样做是否安全?

由于

编辑:

我要求OpenCV中的标准函数如thresholdblur等。所以我认为它们应该相应地实现,对吧?

2 个答案:

答案 0 :(得分:8)

是的,在OpenCV中它是安全的。

在内部,功能如:

void somefunction(InputArray _src, OutputArray _dst);

会做类似的事情:

Mat src = _src.getMat();
_dst.create( src.size(), src.type() );
Mat dst = _dst.getMat();

// dst filled with values

所以,如果srcdst是:

  • 相同的图片,create实际上没有做任何事情,而且修改实际上是就地。如果操作无法就地(例如,OpenCV中的clone> 3.2),某些功能可能会src内部findConturs图像,以保证正确的行为。
  • 不同的图片,create会在不修改dst的情况下创建新的矩阵src

文档说明此默认行为不会保留的位置。

一个值得注意的例子是findContours,它修改了src矩阵。您应对此通常在输入中传递src.clone(),以便仅修改克隆的矩阵,但不修改您克隆的矩阵。

从OpenCV 3.2开始,findContours不会修改输入图像。

感谢Fernando Bertoldi审核答案

答案 1 :(得分:2)

编辑:现在问题已经更新,我意识到这是无关紧要的。但是,我会留在这里,以防有人搜索相关问题。

通常使用C ++,这种情况是否安全实际上取决于所讨论功能的主体。如果您直接读取和写入相同的变量,最终可能会遇到一些严重的逻辑问题。

但是,如果您在覆盖之前使用临时变量来保存原始值,那么它应该没问题。

如果您正在使用数组,那么会发出巨大的警告。如果您尝试将数组的全部内容存储在临时变量中,则必须注意存储实际数组,而不仅仅是指向它的指针。在许多情况下,通常建议暂时将单个存储在数组中(例如在交换函数中)。但是,我不能在这方面给出更多进一步的建议,因为这完全取决于你想要做什么。

简而言之,这一切都取决于你的功能的实现。