许多OpenCV函数定义为
function(InputArray src, OutputArray dst, otherargs..)
因此,如果我想处理并覆盖相同的图像,我可以这样做:
function(myImg, myImg);
这样做是否安全?
由于
我要求OpenCV中的标准函数如threshold
,blur
等。所以我认为它们应该相应地实现,对吧?
答案 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
所以,如果src
和dst
是:
create
实际上没有做任何事情,而且修改实际上是就地。如果操作无法就地(例如,OpenCV中的clone
> 3.2),某些功能可能会src
内部findConturs
图像,以保证正确的行为。create
会在不修改dst
的情况下创建新的矩阵src
。文档说明此默认行为不会保留的位置。
一个值得注意的例子是 findContours
,它修改了src
矩阵。您应对此通常在输入中传递src.clone()
,以便仅修改克隆的矩阵,但不修改您克隆的矩阵。
从OpenCV 3.2开始,findContours
不会修改输入图像。
感谢Fernando Bertoldi审核答案
答案 1 :(得分:2)
编辑:现在问题已经更新,我意识到这是无关紧要的。但是,我会留在这里,以防有人搜索相关问题。
通常使用C ++,这种情况是否安全实际上取决于所讨论功能的主体。如果您直接读取和写入相同的变量,最终可能会遇到一些严重的逻辑问题。
但是,如果您在覆盖之前使用临时变量来保存原始值,那么它应该没问题。
如果您正在使用数组,那么会发出巨大的警告。如果您尝试将数组的全部内容存储在临时变量中,则必须注意存储实际数组,而不仅仅是指向它的指针。在许多情况下,通常建议暂时将单个值存储在数组中(例如在交换函数中)。但是,我不能在这方面给出更多进一步的建议,因为这完全取决于你想要做什么。
简而言之,这一切都取决于你的功能的实现。