【问题标题】:OpenCV 3.1 UMat assignmentOpenCV 3.1 UMat 分配
【发布时间】:2018-09-06 22:03:27
【问题描述】:

我正在尝试对我公司的项目进行性能升级。该项目依赖于 OpenCV,最近我已成功升级到 OpenCV 3.1 以使用 UMat。虽然除了基本操作我找不到完整的教程。所以我陷入了以下困境:

Mat m (width, height, type, someData, step);
cv::UMat * ptr = new cv::UMat (width, height, type);
//dont ask me why the hell we are using a pointer to the smart mat object (my project leader insists)

这不起作用

ptr->setTo (m);

这也不行:

m.copyTo(*ptr);

这些会导致异常。

ptr=&m.getUMat(cv::ACCESS_RW);

这个结果是一个二维垫子,有 0 行和 0 列... 需要帮忙。提前谢谢!!!!

【问题讨论】:

    标签: matrix opencv3.1


    【解决方案1】:

    我认为你最好像这样初始化你的cv::UMat

    cv::UMat* ptr = new cv::UMat(m.getUMat(cv::ACCESS_READ));
    std::cout << "ptr = " << std::endl << ptr->getMat(cv::ACCESS_RW) << std::endl;
    

    这样您就不必手动设置尺寸和类型。此外,如果您必须使用指针,请考虑使用一些可爱的 C++11 功能,例如 std::unique_ptrstd::shared_ptr

    【讨论】:

      【解决方案2】:

      cv::setTo() 用于将 Mat 对象设置为标量,而不是用于将数据从 Mat 复制到 UMat,这是我相信您正在尝试做的事情。

      m.copyTo(*ptr) 对我来说很好用:

      int width=2;
      int height=width;
      int someData [4] {1,2,3,4};
      int type=CV_32S;
      
      cv::Mat m (width, height, type, someData, width*sizeof(int));
      cv::UMat * ptr = new cv::UMat (width, height, type);
      cv::UMat out;
      
      m.copyTo(*ptr);
      
      cv::multiply(*ptr,*ptr, out);
      
      out.copyTo(m);
      
      std::cout<<m<<std::endl; // [1, 4; 9, 16]
      

      使用ptr=&amp;m.getUMat(cv::ACCESS_RW);,您试图获取由 getUMat() 生成的临时 UMat 对象的地址并将其分配给 ptr。 此调用后该对象将不再存在。此外,您会丢失对 new() 生成的 UMat 对象的引用。

      请考虑以下情况:

      *ptr=m.getUMat(cv::ACCESS_RW);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-02
        • 2016-03-04
        • 1970-01-01
        • 2018-08-31
        • 2019-04-16
        • 2016-04-19
        相关资源
        最近更新 更多