OpenCV GPU SURF ROI error?

OpenCV GPU SURF ROI error?

本文关键字:error ROI SURF GPU OpenCV      更新时间:2023-10-16

我在win8.1 64位机器上使用VS2012 c++/CLI与OpenCV 3.0。

我正在尝试实现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以142gb/秒的速度进行设备到设备的内存复制),这使得这种攻击不那么令人讨厌。

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