如何确定 cv::Mat 使用的是内部数据还是外部数据?

How can I determine whether a cv::Mat is using internal or external data?

提问人:Droid Coder 提问时间:1/31/2017 更新时间:1/31/2017 访问量:899

问:

我正在将 OpenCV 与具有自己的 ref-counted 图像类的旧代码库集成。我正在添加一个构造函数,用于从 cv::Mat 创建这些图像。作为优化,我想利用 cv::Mat 的引用计数机制,并在它拥有数据时进行浅层复制。但是,当它使用外部数据时,我需要强制进行深度复制。

问题是,通过阅读文档,我看不到确定 cv::Mat 是否拥有其数据的方法。这可以做到吗(不修改 OpenCV)?

顺便说一句,如果重要的话,我正在使用 OpenCV 3.1。

C++ OpenCV 内存管理

评论

0赞 Micka 1/31/2017
你有没有看过cv::Mat的构造函数或析构函数代码,它们是如何决定Mat是保存内部数据还是外部数据?
2赞 Droid Coder 1/31/2017
我盯着mat.hpp,matrix.cpp和umatrix.cpp足够长的时间来理解它们的复杂性。
0赞 Droid Coder 2/1/2017
我错过的是opencv2/core/mat.inl.hpp。我以为一些内联函数可能隐藏在某个地方。
0赞 NeoZoom.lua 10/3/2020
@Micka:正是从这个问题和你的评论中,我想我可能知道外部数据的定义是什么:OpenCV不对其引用负责的数据。我说得对吗?
0赞 NeoZoom.lua 10/3/2020
@Micka:顺便说一句,我正在尝试阅读 OpenCV.org 提供的所有教程,这是学习OpenCV的最有效方法吗?我是 OpenCV 的新手(我使用 4.4.0 版),我只想“绘制直方图”并“了解它为什么这样做”,但我不能。我无法理解,所以我决定从头开始通读所有教程模块......calcHist

答:

7赞 O'Neil 1/31/2017 #1

使用 cv::Mat 的成员。如果 cv::Mat 使用外部数据,它应该为 0,否则您可以按如下方式获取 ref 计数器UMatData * u

img.u->refcount