OpenCV中的cv::Mat内存分配问题

3

你好,我有一个关于OpenCV的基本问题。如果我想使用cv::Mat类分配内存,我可以这样做:

cv::Mat sumimg(rows,cols,CV_32F,0);
float* sumimgrowptr = sumimg.ptr<float>(0);

但是我得到了一个错误的指针(Null)。在互联网上有些人使用以下方法:

cv::Mat* ptrsumimg = new cv::Mat(rows,cols,CV_32F,0);
float* sumimgrowptr = ptrsumimg->ptr<float>(0);

这里我也得到了一个空指针返回值!但是如果我最终执行以下操作:

            cv::Mat sumimg;
            sumimg.create(rows,cols,CV_32F);
            sumimg.setTo(0);
            float* sumimgrowptr = sumimg.ptr<float>(0);

那么一切都很好!所以我想知道我所做的有什么问题吗?

2个回答

25

主要问题在这里

cv::Mat sumimg(rows,cols,CV_32F,0);

OpenCV 提供了多个矩阵构造函数。其中两个声明如下:

cv::Mat(int rows, int cols, int type, SomeType initialValue);

并且

cv::Mat(int rows, int cols, int type, char* preAllocatedPointerToData);

现在,如果你按照以下方式声明一个Mat:

cv::Mat sumimg(rows,cols,CV_32F,5.0);

您得到一个由浮点数构成的矩阵,该矩阵已分配并初始化为5.0。所调用的构造函数是第一个构造函数。

但在这里

cv::Mat sumimg(rows,cols,CV_32F,0);

你发送的是一个0,在C++中是一个有效的指针地址。因此编译器会调用预分配数据的构造函数。它不会分配任何内容,当你想要访问它的数据指针时,它是0或NULL。

一种解决方案是指定第四个参数为float类型:

cv::Mat sumimg(rows,cols,CV_32F,0.0);

但最好的做法是避免这种情况,可以使用cv::Scalar()进行初始化:

cv::Mat sumimg(rows,cols,CV_32F, cv::Scalar::all(0) );

2
我相信你在执行cv::Mat sumimg(rows,cols,CV_32F,0);cv::Mat* ptrsumimg = new cv::Mat(rows,cols,CV_32F,0);时是调用了构造函数Mat(int _rows, int _cols, int _type, void* _data, size_t _step=AUTO_STEP)
请参阅文档:http://opencv.willowgarage.com/documentation/cpp/basic_structures.html#mat 也就是说,你没有为矩阵创建任何值,这意味着你没有为矩阵内的值分配任何空间,因此当执行ptrsumimg->ptr<float>(0);时会收到一个null指针。

链接对我无效,但我找到了这个:http://docs.opencv.org/modules/core/doc/basic_structures.html#Mat - Pascal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接