2017-02-27 184 views
0

我計算該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個關鍵點,這就是爲什麼我認爲這可能是問題。

回答

1

發生錯誤是因爲代碼檢查圖像的大小,並且Surf無法正常使用小圖片。

其實在文件opencv/opencv_contrib/modules/xfeatures2d/src/surf.cuda.cpp中,構造函數SURF_CUDA_Invoker有幾個斷言,就像這個錯誤中顯示的斷言一樣。

爲什麼Surf有這個問題?因爲它是一個設計約束。基本上處理小圖像意味着使用較小的描述符導致信息不足。

如果你想進一步你可以檢查other question或一些關於衝浪的文檔。

+0

那麼他們可以簡單地返回0個關鍵點,因爲它發生在沒有有意義的信息的小圖像的其他descirpotrs(如非GPU SURF) – justHelloWorld

+0

我還沒有開發足夠的其他變種,但我同意你的看法,有更好的方法來做到這一點。另外,當你使用大量圖像並且其中一些足夠小以激活斷言並使程序崩潰時,這很煩人,但是,就是這樣......我們必須檢查衝浪前的每個圖像的大小。 – MarcosBernal