2012-07-06 181 views
2

您好,我有一个关于opencv的基本问题。如果我尝试与CV分配内存::垫类,我可以做到以下几点:opencv cv :: mat allocation

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); 

然后一切都很好!所以我想知道我在做什么错了?

回答

19

的主要问题是这里

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); 

现在,如果你声明的垫子如下:

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

你彩车的矩阵,分配和初始化与5.0。被调用的构造函数是第一个。

但这里

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

你送什么是0,这在C++是一种有效的指针地址。所以编译器调用预分配数据的构造函数。它不分配任何东西,并且当你想访问它的数据指针时,这也就不足为奇了,就是0或NULL。

一个解决办法是指定该第四个参数是一个浮动:

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

但是,最好是避免这种情况,通过使用CV ::标量()来初始化:

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

我相信当你做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

即你是不是创造了矩阵的任何值,与你是不是在矩阵中的值分配任何空间手段,因为您将收到一个NULL指针时做

ptrsumimg->ptr<float>(0);

+0

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