我計算該Oxford dataset(5000K圖像)依次調用下面的方法SURF描述符:SURF_CUDA誤差而計算描述符和關鍵點
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]);
}
它成功地計算描述符的圖像的部分(I打印的描述符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個關鍵點,這就是爲什麼我認爲這可能是問題。
那麼他們可以簡單地返回0個關鍵點,因爲它發生在沒有有意義的信息的小圖像的其他descirpotrs(如非GPU SURF) – justHelloWorld
我還沒有開發足夠的其他變種,但我同意你的看法,有更好的方法來做到這一點。另外,當你使用大量圖像並且其中一些足夠小以激活斷言並使程序崩潰時,這很煩人,但是,就是這樣......我們必須檢查衝浪前的每個圖像的大小。 – MarcosBernal