您好我有一个关于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);
并且在这里我得到一个Null指针!但如果我最终这样做:
cv::Mat sumimg;
sumimg.create(rows,cols,CV_32F);
sumimg.setTo(0);
float* sumimgrowptr = sumimg.ptr<float>(0);
然后一切都很好!所以我很想知道我在做什么是错的?
答案 0 :(得分:20)
主要问题在这里
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) );
答案 1 :(得分:1)
我相信当你Mat(int _rows, int _cols, int _type, void* _data, size_t _step=AUTO_STEP)
和cv::Mat sumimg(rows,cols,CV_32F,0);
时,你正在调用构造函数cv::Mat* ptrsumimg = new cv::Mat(rows,cols,CV_32F,0);
。
请参阅文档:http://opencv.willowgarage.com/documentation/cpp/basic_structures.html#mat
即。您没有为矩阵创建任何值,意味着您没有为矩阵中的值分配任何空间,并且因此在执行时会收到NULL
指针
ptrsumimg->ptr<float>(0);