Opencv Mat内存管理

fee*_*ree 3 c++ opencv image-processing

内存管理对于图像类至关重要.在opencv中,图像类cv::Mat具有精细的内存管理方案.假设我已经拥有自己的图像类SelfImage:

class SelfImage
{
  public:
    int width_;
    int height_;
    unsigned char *pPixel_;    
};
Run Code Online (Sandbox Code Playgroud)

首先,我将把所有图像像素内容放到这个类中:

SelfImage myImage;
myImage.width_ = 300;
myImage.height_ = 200;
myImage.pPixel_ = new [300*200];
for(int i=0; i<300*200; i++)
      myImage.pPixel_[i] = i%200;
Run Code Online (Sandbox Code Playgroud)

然后我的问题是如何以cv::Mat一种非常有效的方式将这个类转换为一个解决方案,我有一个解决方案:

  cv::Mat mat;
    mat.create( myImage.height_, myImage.width_, CV_8UC1);
    mat.data = myImage.pPixel_;
Run Code Online (Sandbox Code Playgroud)

我不知道这是否是一个很好的解决方案.如果cv::Mat::create函数也会分配内存,那么上面的代码就有内存泄漏的危险.有任何想法吗?

编辑 我必须说清楚,如果我可以使用cv::Mat::create方法但是与类共享内存会很好SelfImage.原因是定义了一个函数来执行图像类转换作业void TransImageType(const SelfImage &geo_img, cv::Mat &mat);

BCo*_*nic 7

cv::Mat 有一个构造函数,您可以在其中指定用户数据:

Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)
Run Code Online (Sandbox Code Playgroud)

文档说明了以下关于这个data论点:

指向用户数据的指针.采用数据和步骤参数的矩阵构造函数不分配矩阵数据.相反,它们只是初始化指向指定数据的矩阵标头,这意味着不会复制任何数据.此操作非常有效,可用于使用OpenCV函数处理外部数据.外部数据不会自动解除分配,因此您应该对其进行处理.