繁体   English   中英

opencv cv :: mat allocation

[英]opencv cv::mat allocation

你好,我有一个关于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);

那一切都很好! 所以我很想知道我在做什么是错的?

主要问题在这里

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

当你做cv::Mat sumimg(rows,cols,CV_32F,0);我相信你正在调用构造函数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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM