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);
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函数处理外部数据.外部数据不会自动解除分配,因此您应该对其进行处理.