gpt4 book ai didi

c++ - 如何将像素数据的所有权传递给 cv::Mat

转载 作者:太空狗 更新时间:2023-10-29 23:51:17 25 4
gpt4 key购买 nike

我正在创建一个 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/

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