我在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个关键点,这就是我认为这可能是问题的原因。
答案 0 :(得分:1)
发生错误是因为代码检查图像的大小,而Surf对小图像无法正常工作。
实际上在文件opencv/opencv_contrib/modules/xfeatures2d/src/surf.cuda.cpp中,构造函数SURF_CUDA_Invoker有几个断言,如此错误中显示的断言。
为什么Surf有这个问题?因为,这是一个设计约束。基本上使用小图像意味着使用较小的描述符导致没有足够的信息。
如果您想要更进一步,可以查看此other question或一些有关冲浪的文档。