我正在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/