c++ - OpenCV GPU SURF ROI 错误?

标签 c++ opencv gpu surf

我在装有 OpenCV 3.0 的 Win 8.1 64 位机器上使用 VS2012 C++/CLI。

我正在尝试实现 SURF 的 GPU 版本。

当我不指定 ROI 时,我没有问题。因此,以下行没有问题并检测到完整图像中的关键点:

surf(*dImages->d_gpuGrayFrame,cuda::GpuMat(),Images->SurfKeypoints);

但是,指定 ROI 的努力会导致崩溃。例如,我通过顶部、左侧和底部、右侧坐标指定 ROI(我知道这在非 GPU 代码中有效)。在 GPU 代码中,如果 ROI 比源图像本身小,则以下代码会导致崩溃(如果 ROI 与源图像大小相同,则不会崩溃)。

int theight = (Images->LoadFrameClone.rows-Images->CropBottom) - Images->CropTop ;
int twidth = (Images->LoadFrameClone.cols-Images->CropRight)-Images->CropLeft ;

Rect tRect = Rect(Images->CropLeft,Images->CropTop,twidth,theight);
cuda::GpuMat tmask = cuda::GpuMat(*dImages->d_gpuGrayFrame,tRect);

surf(*dImages->d_gpuGrayFrame,tmask,Images->SurfKeypoints);  // fails on this line

我知道 tmask 的大小不为零,并且底层图像是正确的。据我所知,唯一的问题是在 SURF GPU 调用中指定 ROI。关于为什么会发生这种情况的任何线索?

谢谢

最佳答案

我在 OpenCV 3.1 中遇到了同样的问题。据推测,SURF 算法不适用于具有通过设置 ROI 引入的步长或步幅的图像。我没有尝试掩蔽以查看这是否有所作为。

解决方法是将 ROI 复制到另一个连续的 GpuMat。内存到内存的复制在 GPU 上几乎是免费的(我的 GTX780 以 142 GB/秒的速度进行设备到设备的内存复制),这使得这种黑客行为不那么令人讨厌。

GpuMat src;                           // filled with some image
GpuMat srcRoi = GpuMat (src, roi);    // roi within src
GpuMat dst;
srcRoi.copyTo (dst);
surf(dst, GpuMat(), KeypointsGpu, DescriptorsGpu);

关于c++ - OpenCV GPU SURF ROI 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32837211/

相关文章:

c++ - [[maybe_unused]] 和构造函数

c++ - 如何在windows中使用柯南的SDL2

OpenCV 填充缺失像素

android - OpenCV4Android示例中如何使用Camera flash Tutorial-1 Camera Preview

android - 如何使用 javacv/opencv 在 android 中将音频与视频集成?

python - 迭代一段时间后,前向传递速度变慢 10000 倍

cuda - 将 SSE/AVX 单元与 GPU 核心进行比较公平吗?

c++ - C++ 中的对象变量保存值,而不是对象引用

c++ - 在map中存储派生类的成员函数指针

opencl - 在英特尔集成 GPU 上进行 GP 开发时,我可以选择哪些技术?