gpt4 book ai didi

c++ - Mat& 与 Mat opencv 2 c++

转载 作者:搜寻专家 更新时间:2023-10-31 01:01:46 26 4
gpt4 key购买 nike

好吧,我对将 Mat 传递给函数并检索它有点困惑那么让我们说有什么区别

 void GetFrame(Mat& frame)
Vs
void GetFrame(Mat frame)
Vs
Mat GetFrame()

更新:

在哪个版本中,对函数体内框架的更改将导致传递给函数的原始框架发生变化

最佳答案

稍加小心,您可以让所有 3 个版本都工作并做同样的事情,但我会尝试解释细节。

首先,Mat 对象实际上只是一个小标题,其中包含有关真实数据的元数据(例如,行数和列数)以及指向实际数据的指针。大多数情况下,该指针实际上是一个智能指针,带有引用计数,可以被多个Mat对象共享,当最后一个剩余的Mat对象停止指向时自动删除给它。 (Mat 对象也可以指向它不拥有的数据,即如果你有一些数据是从不同的库/API 获得的,并且想要重用相同的内存而不是复制它.)

1。通过引用版本

函数的第 1 版可能是最简单的。调用者的 Mat 对象被引用复制,这显然意味着对 Mat 对象的元数据(包括(智能)指针)的任何修改都会返回时对调用者可见。底层数据将明显反射(reflect)函数所做的任何修改。

2。按值传递版本

在函数的版本 2 中(按值传递 Mat 对象),Mat 表示的小 header 被复制并传递给函数。复制是浅层的:复制元数据和(智能)指针,但底层数据由调用者的 Mat 对象和被调用者的 Mat 对象共享。您必须注意的部分是,如果函数修改了复制的 frame 对象的元数据,调用者将看不到这些更改

因此,例如,如果您传递一个空的 Mat,您可能会对结果感到惊讶:首先,空的 Mat 的元数据被复制。当函数调用类似 frame.create(newRows, newCols, newType); 时,create 函数将分配一个新的内存块,因为 frame.rows ! = newRowsframe.cols != newColsframe.type() != newType,以及(被调用方单独的)frame 元数据被更新以反射(reflect)新分配的数据。当函数返回时,它的 frame 对象将保存对智能指针的唯一引用,因此数据将被自动丢弃。调用者仍然只有一个空 header 。

但是,如果传递给函数的 Mat 对象已经具有正确的尺寸和类型,则 frame.create() 将不执行任何操作,这意味着被调用者对基础数据所做的任何修改对调用者都是可见的。

3。按值返回版本

第三个版本与第二个版本类似,不同之处在于函数调用时不是复制元数据,而是函数分配一个它认为合适的 Mat,并且元数据(包括指向底层数据的指针)在返回时被复制回调用者。底层数据会保留下来并且可供调用者访问。

总结

如果您事先不知道数据的大小和类型,则不能使用按值传递。如果您确实知道大小/类型,则可以使用按值传递,并且将使用预分配的内存。

如果可能,按引用传递将使用预先分配的内存,或分配新内存,无论哪种情况,调用者都将始终看到新的 header /数据。

按值返回也将始终正常工作,但它确实必须在每次调用时重新分配新内存,这可能是不可取的。

关于c++ - Mat& 与 Mat opencv 2 c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28382628/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com