2013-09-04 1 views
0

Я использую OpenCV 2.4.6.0 с Cuda 5.5 на Ubuntu 12.04 После выполнения кода я получаю следующее сообщение об ошибке, когда выполнение достигаетBruteForceMatcher_GPU согласовань Ошибка

atcher.knnMatch(descriptors_test_GPU, descriptors_tmp_GPU, matches, 2); 

OpenCV Error: Assertion failed (func != 0) in knnMatchSingle, file /root/opencv-2.4.6.1/modules/gpu/src/brute_force_matcher.cpp, line 497 

Terminate называется кинув экземпляр ' резюме :: Exception» что) (: /root/opencv-2.4.6.1/modules/gpu/src/brute_force_matcher.cpp:497: ошибка: (-215) = 0 функ функция knnMatchSingle

Код образца! здесь:

Mat image = imread(argv[1]); 
resize(image, image, Size(600,450), 0, 0, INTER_CUBIC); 
Mat image_gray; 
getGray(image, image_gray); 

ORB_GPU orb(1000); 

GpuMat descriptors_test_GPU, frame_g(image_gray); 
vector<KeyPoint> keypoints_test_CPU; 

GpuMat fullmask(frame_g.size(), CV_8U, 0xFF); 

orb(frame_g, GpuMat(), keypoints_test_CPU, descriptors_test_GPU); 

Mat descriptors_test_CPU_Mat(descriptors_test_GPU); 

vector<Point2f> objs_corners(4); 
BruteForceMatcher_GPU< L2<float> > matcher; 

VideoCapture cap; 
Mat currentFrame_c; 
vector< vector<DMatch> > matches; 
matches.clear(); 

if (cap.open(argv[2])) { 
    do 
    { 
     cap >> currentFrame_c; 
     resize(currentFrame_c, currentFrame_c, Size(600,450), 0, 0, INTER_CUBIC); 
     getGray(currentFrame_c, currentFrame_c); 

     GpuMat currentFrame(currentFrame_c); 
     //Get the corners from the object 
     objs_corners[0] = cvPoint(0,0); 
     objs_corners[1] = cvPoint(currentFrame.cols, 0); 
     objs_corners[2] = cvPoint(currentFrame.cols, currentFrame.rows); 
     objs_corners[3] = cvPoint(0, currentFrame.rows); 

     //cout<<endl<<objs_corners[0]<<" "<<objs_corners[1]<<" "<<objs_corners[2]<<" "<<objs_corners[3]<<endl; 
     GpuMat keypoints_tmp_GPU, descriptors_tmp_GPU; 
     vector<KeyPoint> keypoints_tmp_CPU; 
     orb(currentFrame, GpuMat(), keypoints_test_CPU, descriptors_tmp_GPU); 
     GpuMat trainIdx, distance; 

     matcher.knnMatch(descriptors_test_GPU, descriptors_tmp_GPU, matches, 2); 

     std::vector<DMatch > good_matches; 

     for(int k = 0; k < min(descriptors_test_CPU_Mat.rows-1,(int) matches.size()); k++) //THIS LOOP IS SENSITIVE TO SEGFAULTS 
     { 
      if((matches[k][0].distance < 0.6*(matches[k][1].distance)) && ((int) matches[k].size()<=2 && (int) matches[k].size()>0)) 
      { 
       good_matches.push_back(matches[k][0]); 
      } 
     }      

     matcher.clear(); 

    } while (!currentFrame_c.empty()); 
} 

Я не могу понять, я даже не использую knnMatchSingle. Если я удалю строку, код работает.

+0

То же самое утверждение func! = 0 выбрано для любой функции соответствия, которую я использую. –

ответ

4

ORB дескриптор экстрактор возвращает 8-разрядные дескрипторы. Используйте Hamming расстояние для этого дескрипторы:

BruteForceMatcher_GPU<Hamming> matcher; 
matcher.knnMatch(descriptors_test_GPU, descriptors_tmp_GPU, matches, 2); 

BruteForceMatcher_GPU с L2 норма поддерживает только плавать дескрипторов (например, от SURF).

+0

Спасибо, миллион, что решила мою ошибку !. Но теперь число совпадений совпадает с размером ключевых точек. –

+1

Ожидается поведение. BruteForceMatcher находит для каждой ключевой точки в первом наборе ближайших ключевых точек из второго набора, поэтому размер выходного массива совпадений совпадает с количеством ключевых точек в первом наборе. – jet47

+0

Что я могу сделать, чтобы получить хорошее совпадение? Что я должен добавить? –

Смежные вопросы