2015-01-21 3 views
0

Я сопоставляю точки SURF от изображения к видеоролику. Я хочу проверить это на разных разрешениях, но у меня есть неприятная проблема: когда соответствующие ключевые точки рисуются на небольших разрешениях, я больше не могу видеть, что происходит в видеопотоке из-за цветных ключевых точек. Есть ли способ остановить OpenCV рисовать их на видео и показывать только гомографию?OpenCV DrawMatchesFlags - нет опции keypoint?

Я пробовал посмотреть параметры для DrawMatchesFlags, но они только меняют тип отображаемой ключевой точки, а не дают возможность их удалить. Я создаю Mat img_matches, который имеющий ключевые точки, нарисованные на нем с помощью drawMatches:

drawMatches(img_object, keypoints_object, frame, keypoints_scene, good_matches, img_matches, Scalar::all(-1), Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS); 

Я затем детектирования гомографии с помощью OpenCV findHomography функции и составления результатов с помощью:

imshow("Good Matches & Object detection", img_matches);

Как я могу удалить совпадение точки объекта на видеопотоке и показать только гомографию?

EDIT:

Обнаружение и функции рисования:

//-- Step 1: Detect the keypoints using SURF Detector 
    int minHessian = 400; 

    SurfFeatureDetector detector(minHessian); 

    std::vector<cv::KeyPoint> keypoints_object, keypoints_scene; 

    detector.detect(img_object, keypoints_object); 
    detector.detect(frame, keypoints_scene); 

    //-- Step 2: Calculate descriptors (feature vectors) 
    SurfDescriptorExtractor extractor; 

    Mat descriptors_object, descriptors_scene; 

    extractor.compute(img_object, keypoints_object, descriptors_object); 
    extractor.compute(frame, keypoints_scene, descriptors_scene); 

    //-- Step 3: Matching descriptor vectors using FLANN matcher 
    FlannBasedMatcher matcher; 
    std::vector<DMatch> matches; 
    matcher.match(descriptors_object, descriptors_scene, matches); 

    double max_dist = 0; double min_dist = 100; 

    //-- Quick calculation of max and min distances between keypoints 
    for(int i = 0; i < descriptors_object.rows; i++) 
    { double dist = matches[i].distance; 
    if(dist < min_dist) min_dist = dist; 
    if(dist > max_dist) max_dist = dist; 
    } 

    printf("-- Max dist : %f \n", max_dist); 
    printf("-- Min dist : %f \n", min_dist); 

    //-- Draw only "good" matches (i.e. whose distance is less than 3*min_dist) 
    std::vector<DMatch> good_matches; 

    for(int i = 0; i < descriptors_object.rows; i++) 
    { if(matches[i].distance < 3*min_dist) 
    { good_matches.push_back(matches[i]); } 
    } 

    Mat img_matches; 
    drawMatches(img_object, keypoints_object, frame, keypoints_scene, 
       good_matches, img_matches, Scalar::all(-1), Scalar::all(-1), 
       vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS); 

    //-- Localize the object 
    std::vector<Point2f> obj; 
    std::vector<Point2f> scene; 

    for(int i = 0; i < good_matches.size(); i++) 
    { 
    //-- Get the keypoints from the good matches 
    obj.push_back(keypoints_object[ good_matches[i].queryIdx ].pt); 
    scene.push_back(keypoints_scene[ good_matches[i].trainIdx ].pt); 
    } 

    Mat H = findHomography(obj, scene, CV_RANSAC); 

    //-- Get the corners from the image_1 (the object to be "detected") 
    std::vector<Point2f> obj_corners(4); 
    obj_corners[0] = cvPoint(0,0); obj_corners[1] = cvPoint(img_object.cols, 0); 
    obj_corners[2] = cvPoint(img_object.cols, img_object.rows); obj_corners[3] = cvPoint(0, img_object.rows); 
    std::vector<Point2f> scene_corners(4); 

    perspectiveTransform(obj_corners, scene_corners, H); 

    //-- Draw lines between the corners (the mapped object in the scene - image_2) 
    line(img_matches, scene_corners[0] + Point2f(img_object.cols, 0), scene_corners[1] + Point2f(img_object.cols, 0), Scalar(0, 255, 0), 4); 
    line(img_matches, scene_corners[1] + Point2f(img_object.cols, 0), scene_corners[2] + Point2f(img_object.cols, 0), Scalar(0, 255, 0), 4); 
    line(img_matches, scene_corners[2] + Point2f(img_object.cols, 0), scene_corners[3] + Point2f(img_object.cols, 0), Scalar(0, 255, 0), 4); 
    line(img_matches, scene_corners[3] + Point2f(img_object.cols, 0), scene_corners[0] + Point2f(img_object.cols, 0), Scalar(0, 255, 0), 4); 
+0

Не могли бы вы показать свою выявляющий и функцию рисования? Вероятно, вы должны удалить этот «drawMatches()» из своего кода, это не имеет никакого отношения к вычислению и рисованию гомографии. – pwwpche

+0

Дополнительный код добавлен, единственная проблема с удалением функции заключается в том, что она присваивает согласованные точки 'img_matches', которые используются в функции' imshow'. – Colin747

ответ

2

Изменить рисунок часть этого:

Mat img_matches; 
std::vector<DMatch> emptyVec; //Make a empty match vector so it won't be drawn. 
drawMatches(img_1, keypoints_1, img_2, keypoints_2, 
      emptyVec, img_matches, Scalar::all(-1), Scalar::all(-1), 
      vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS); 
+0

Это сработало, спасибо за вашу помощь. – Colin747

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