Как найти ориентацию изображения в сцене с Flann Feature Matching в OpenCV

Итак, я смог получить совпадения в характерных точках на двух изображениях, одном изображении запроса и другом изображении сцены, например:

flann = cv2.FlannBasedMatcher(index_params,search_params)
matches = flann.match(des1,des2)

Теперь, когда у меня есть совпадение, как я узнаю, как изображение запроса ориентируется в изображении сцены. Могу ли я узнать угол или масштаб на основе этих совпадений?

Я вижу distance собственность на совпадение - но я не понимаю, как мы можем использовать это, чтобы найти ориентацию.

0 ответов

Расстояние - это расстояние между точками в "векторном пространстве дескриптора". Это не расстояние "X,Y".

Напомнить о процессе:

  • найти ключевые точки на обеих картинках
  • Оценка "совпадений" = расстояние между клавишами, сравниваемое по парам
  • Удалить плохие совпадения (соотношение, перекрестная проверка...)
  • Используйте расчет гомографии, чтобы оценить преобразование, используемое между двумя изображениями (перевод, вращение...)
  • При необходимости отфильтруйте гомографию = "Эта матрица преобразования выглядит / выглядит не очень хорошо".

    def ransac_filter(matches, pic1, pic2):
    MIN_MATCH_COUNT = 10
    good = []
    transformation_matrix = None
    
    if len(matches) > MIN_MATCH_COUNT:
        src_pts = np.float32([pic1.key_points[m.queryIdx].pt for m in matches]).reshape(-1, 1, 2)
        dst_pts = np.float32([pic2.key_points[m.trainIdx].pt for m in matches]).reshape(-1, 1, 2)
    
        # Find the transformation between points
        transformation_matrix, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
    
        # Get a mask list for matches = A list that says "This match is an in/out-lier"
        matchesMask = mask.ravel().tolist()
    
        # Filter the matches list thanks to the mask
        for i, element in enumerate(matchesMask):
            if element == 1:
                good.append(matches[i])
    
        pic1.transformation_matrix = transformation_matrix
        pic1.matchesMask = matchesMask
    
    else:
        logger = logging.getLogger()
        logger.info("not enough matches")
    
    return good, transformation_matrix
    

Несколько вдохновленный от: https://docs.opencv.org/3.1.0/d1/de0/tutorial_py_feature_homography.html

Другие вопросы по тегам