【问题标题】:opencv cv::mat allocationopencv cv::mat 分配
【发布时间】:2012-07-06 11:58:09
【问题描述】:

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

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

【问题讨论】:

    标签: c++ opencv allocation


    【解决方案1】:

    主要问题在这里

    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。

    解决方法是指定第四个参数为浮点数:

    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

      即您没有为矩阵创建任何值,这意味着您没有为矩阵中的值分配任何空间,因此您在执行时会收到 NULL 指针

      ptrsumimg-&gt;ptr&lt;float&gt;(0);

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      • 1970-01-01
      • 2012-12-04
      相关资源
      最近更新 更多