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

Is it safe to use the same variable as input and output in C++ OpenCV?

本文关键字:输入 输出 安全 是否 变量 OpenCV c++      更新时间:2023-10-16

很多OpenCV函数被定义为

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

如果我想处理和覆盖同一张图片,我可以这样做吗:

function(myImg, myImg);

这样做安全吗?

感谢

编辑:

我要求OpenCV中的标准函数,如threshold, blur等。所以我认为它们应该得到相应的执行,对吗?

是的,在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> 3.2中的findConturs),某些函数可能会在内部clone src图像以保证正确的行为。
  • 不同的图像,create将创建一个新的矩阵dst而不修改src

文档说明此默认行为不成立。

一个值得注意的例子是findContours,它修改了src矩阵。您通常在输入中传递src.clone()来处理这个问题,这样只有克隆的矩阵被修改,而不是从您克隆的矩阵。

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


感谢Fernando Bertoldi审阅答案

EDIT:现在问题已经更新了,我意识到这是相当不相关的。但是,我将把它留在这里,以防有人搜索相关问题。


在c++中,这种情况是否安全取决于所讨论的函数体。如果直接对同一个变量进行读写,可能会遇到一些严重的逻辑问题。

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

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

简而言之,这完全取决于你的函数的实现。