我正在尝试对我公司的项目进行性能升级。该项目依赖于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列的二维垫子...... 需要帮忙。在此先感谢!!!!
答案 0 :(得分:0)
我认为你最好像这样初始化你的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_ptr
或std::shared_ptr
。
答案 1 :(得分:0)
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=&m.getUMat(cv::ACCESS_RW);
试图获取由getUMat()生成的临时UMat对象的地址并将其分配给ptr。
此调用后该对象将不再存在。此外,您将丢失对new()生成的UMat对象的引用。
请考虑以下内容:
*ptr=m.getUMat(cv::ACCESS_RW);