我正在创建一个 cv::Mat,传递我在外部分配的像素数据。
cv::Mat myMatrix(vImageResult.height,
vImageResult.width,
CV_8UC1,
vImageResult.data);
我希望 cv::Mat 获得字节的所有权(即创建一个 refCount 并在达到零时释放字节)。但是,那文档 http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-mat says
接受数据和步骤参数的矩阵构造函数不分配矩阵数据。相反,它们只是初始化指向指定数据的矩阵头,这意味着不复制任何数据。该操作非常高效,可用于使用 OpenCV 函数处理外部数据。外部数据不会自动释放,因此您应该小心处理。
- 如果我释放底层
vImageResult.data
立即,我会在某处遇到错误的访问崩溃。
- 如果我不释放底层
vImageResult.data
那么数据就会泄露。
有没有办法传递所有权?
你不能。
cv::Mat 不知道如何分配内存(malloc、new 等),因此不知道如何释放它。
如果您自己分配数据,您可以随时调用cv::Mat::create(...)
分配你需要的内存,然后传递指针myMatrix.data
到您用来加载数据的任何函数。
如果您指的是通过视频捕获流或外部库提供给您的预分配内存,那么您就不走运了。
安德烈亚斯的解决方案可以工作,但如果频繁使用,可能会很慢。
折衷方案可能是包装cv::Mat
在你自己的类型中:
struct MyMat
{
cv::Mat mat;
MyMat(int width, int height, int format, char *data)
: mat(height, width, format, data){}
~MyMat() { delete [] mat.data; }
};
注意:故意不尝试子类化 cv::Mat。它没有虚拟析构函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)