opencv - 计算描述符和关键点时出现SURF_CUDA错误

标签 opencv computer-vision surf

我正在Oxford dataset(5000k图像)上计算SURF描述符,依次调用以下方法:

void SURF_CUDAOpenCV::ComputeDescriptors(cv::Mat &img, cv::Mat1f &descriptors){
    cv::cuda::GpuMat imgGpu;
    std::vector<float> f_descriptors;
    std::vector<cv::KeyPoint> keypoints;
    imgGpu.upload(img);
    if(imgGpu.empty())
        throw std::runtime_error("Error uploading gpuImg");
    surf_cuda(imgGpu, cv::cuda::GpuMat(), keypoints, f_descriptors);
    descriptors = cv::Mat1f((int) f_descriptors.size()/surf_cuda.descriptorSize(), surf_cuda.descriptorSize(), f_descriptors[0]);
}

它成功地计算了部分图像的描述符(我在surf_cuda(...)之后打印了描述符行和cols),但是由于以下错误而突然停止:
OpenCV Error: Assertion failed (layer_rows - 2 * min_margin > 0) in SURF_CUDA_Invoker, file /home/luca/ParallelOpenCV/opencv_contrib/modules/xfeatures2d/src/surf.cuda.cpp, line 134
error: /home/luca/ParallelOpenCV/opencv_contrib/modules/xfeatures2d/src/surf.cuda.cpp:134: error: (-215) layer_rows - 2 * min_margin > 0 in function SURF_CUDA_Invoker

为什么会这样?

我注意到了一件奇怪的事情:
出现错误的图像是直到那一刻为止所看到的最小行数。通常至少有200多行(但通常是300、400行),但是在这种情况下,“只有” 117行。也许这是问题吗?我记得使用经典的cv::xfeatures::SURF它为一张非常小的图像检测到0个关键点,这就是为什么我认为这可能是问题所在。

最佳答案

发生错误是因为代码检查图像的大小,并且Surf无法在小图像上正常工作。

实际上,在文件opencv/opencv_contrib/modules/xfeatures2d/src/surf.cuda.cpp中,构造函数SURF_CUDA_Invoker具有多个断言,如此错误中所示的断言。

为什么Surf有这个问题?因为,这是一个设计约束。基本上,使用小图像意味着使用较小的描述符,从而导致没有足够的信息。

如果您想走得更远,可以查看此other question或一些有关冲浪的文档。

关于opencv - 计算描述符和关键点时出现SURF_CUDA错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42492060/

相关文章:

opencv - 在OpenCV中给定前景轮廓的情况下,如何生成仅前景图像?

c++ - 反射镜角度的解析法

python - 如何创建一个带有双重for循环和分配条件的列表?

C++ OpenCV 使用 vector<Point> 作为矩阵的索引

matlab - Matlab 计算机视觉工具箱功能是如何制作/编写的?

c++ - Hessian 最小阈值对 SurfFeatureDetector 函数意味着什么?

matlab - 如何在 MATLAB 中为曲面的不同侧面选择不同的颜色

python - 如何将大数据集从 CSV 加载到 keras

java - Canny 边缘检测不检测 100% 水平/未旋转的线

python - 如何使用 Python 和 OpenCV 增强图像然后将其转换为二进制图像?