2

我正在尝试对我公司的项目进行性能升级。该项目依赖于 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 列......需要帮助。提前致谢!!!!

4

2 回答 2

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);
于 2018-09-06T14:03:27.180 回答
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_ptror std::shared_ptr

于 2016-04-14T02:09:20.793 回答