在c++ OpenCV中使用相同的变量作为输入和输出是否安全?
Is it safe to use the same variable as input and output in C++ OpenCV?
很多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
因此,如果src
和dst
为:
- 相同的图像,
create
实际上不会做任何事情,并且修改有效地就地。如果操作不能到位(例如OpenCV> 3.2中的findConturs
),某些函数可能会在内部clone
src
图像以保证正确的行为。 - 不同的图像,
create
将创建一个新的矩阵dst
而不修改src
。
文档说明此默认行为不成立。
一个值得注意的例子是findContours
,它修改了src
矩阵。您通常在输入中传递src.clone()
来处理这个问题,这样只有克隆的矩阵被修改,而不是从您克隆的矩阵。
从OpenCV 3.2, findContours
不修改输入图像。
感谢Fernando Bertoldi审阅答案
EDIT:现在问题已经更新了,我意识到这是相当不相关的。但是,我将把它留在这里,以防有人搜索相关问题。
在c++中,这种情况是否安全取决于所讨论的函数体。如果直接对同一个变量进行读写,可能会遇到一些严重的逻辑问题。
但是,如果您在覆盖原始值之前使用临时变量来保存原始值,则应该没有问题。
如果你正在使用数组,这是一个巨大的警告。如果您试图将数组的全部内容存储在一个临时变量中,那么您必须注意您存储的是实际的数组,而不仅仅是指向它的指针。在许多情况下,通常建议将单个值临时存储在数组中(例如在swap函数中)。然而,在这方面我不能给出更多的建议,因为这完全取决于你想做什么。
简而言之,这完全取决于你的函数的实现。
相关文章:
- 字符的输入/输出操作
- C++ 中文件输入输出中的长长 v/s int
- 要求用户输入C++输出文件名
- 在C++中重载输入/输出运算符
- 从用户获取输入/输出
- 如何选择waveIn/waveOut函数C++使用的输入/输出设备
- C++击球平均值程序使用输入/输出文件打印名称,平均值,最高/最低平均值时遇到麻烦
- 从 2 位输入输出 4 位数字年份
- 标准输入输出操作如何C++完成
- Windows 中应用程序的每秒输入/输出操作数
- 如何初始化可以设置为默认数组并将输入/输出作为数组的类函数?
- 输入/输出和类
- 使用 Octave GNU 访问输入/输出文件
- (C++)分解这个简单的输入/输出代码:
- TensorFlow模型:如何从原始爱好文件中识别输入/输出节点名称
- 干净取消在输入/输出调用中被阻止的 std::线程
- 将线程之间的标准输入/输出重定向
- 输入/输出异或字符串的 C++ 问题
- C++输入/输出错误
- C++输入输出