cv :: cuda :: setTo()是否有其他选择?

时间:2018-07-18 08:58:32

标签: c++ opencv

cv :: cuda :: setTo(Scalar,mask)还是cv :: setTo(Scalar,mask)是否有替代选择?我在使用此工具时遇到了一个问题:

buffer.conv_square.setTo(abs_threshold, buffer.buff, stream);

其中缓冲区是cv :: cuda的结构,缓冲区中的所有Mats都是GpuMats。 buffer.conv_square和buffer.buff是CV_32,而abd_threshold是浮点数。

问题是掩码缓冲区.buff只能是CV_8U,因此我必须将其从CV_32F转换为CV_8U。但是当我这样做

buffer.buff.convertTo(buffer.buff, CV_8U, 255);

我总是会出错

OpenCV Error: Gpu API call (unspecified launch failure) in cv::cudev::grid_transform_detail::TransformDispatcher<true, Policy>::call

即使当我尝试异步调用时,该错误也不会再次显示,但是下一个函数将是一个错误。

有人知道如何解决该问题或通过其他功能避免该问题吗?

1 个答案:

答案 0 :(得分:0)

对于cv :: cuda :: setTo(标量,掩码),您可以使用Masked Set functions of npp

Npp32f val[3] = { 0.0f, 0.0f, 0.0f };
NppiSize nis = { img.cols, img.rows };
nppiSet_32f_C3MR(val, img.ptr<Npp32f>(), static_cast<int>(img.step), nis, mask.ptr<Npp8u>(), static_cast<int>(mask.step));