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

时间:2017-02-27 17:28:00

标签: 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(...)之后打印了描述符行和列)但它突然停止并出现此错误:

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个关键点,这就是我认为这可能是问题的原因。

1 个答案:

答案 0 :(得分:1)

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

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

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

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