- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在创建一个 cv::Mat,传递我在外部分配的像素数据。
cv::Mat myMatrix(vImageResult.height,
vImageResult.width,
CV_8UC1,
vImageResult.data);
我希望 cv::Mat 获得字节的所有权(即创建一个 refCount 并在它达到零时释放字节)。然而 documentation说
Matrix constructors that take data and step parameters do not allocate matrix data. Instead, they just initialize the matrix header that points to the specified data, which means that no data is copied. This operation is very efficient and can be used to process external data using OpenCV functions. The external data is not automatically deallocated, so you should take care of it.
vImageResult.data
,我将在某处遇到错误的访问崩溃。vImageResult.data
,那么数据就会泄漏。有没有办法传递所有权?
最佳答案
你不能。
cv::Mat 不知道您如何分配内存(malloc、new 等),因此不知道如何释放它。
如果你自己分配数据,你总是可以调用cv::Mat::create(...)
来分配你需要的内存,然后传递指针myMatrix .data
到您用来加载数据的任何函数。
如果您指的是通过视频捕获流或外部库提供给您的预分配内存,那您就不走运了。
Andreas 的解决方案可行,但如果经常使用,速度可能会很慢。
折衷方案可能是将 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。它没有虚拟析构函数。
关于c++ - 如何将像素数据的所有权传递给 cv::Mat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22511747/
我是一名优秀的程序员,十分优秀!