Сопоставление шаблонов одного шаблона с несколькими исходными изображениями - PullRequest
0 голосов
/ 28 января 2020

Template Source Image 1 Source Image 2

У меня есть шаблон "X" (символ), который вырезан "Image1". Я использую метод matchTemplate () OpenCV, чтобы сопоставить шаблон «X» с «Image1», и он делает это успешно. Тем не менее, у меня есть другое изображение под названием «Image2», которое содержит символ X, но когда я использую шаблон «X» для сопоставления с «Image2», он показывает недопустимое совпадение. Любая помощь будет высоко ценится.


def match_template(img_path, img_template_path):
    if img_path is not None:
        img = cv.imread(img_path, 0)
        if img is not None:
            template = cv.imread(img_template_path, 0)
            temp_h, temp_w, img_h, img_w = None, None, None, None

            if len(img.shape) > 2:
                print("This image is in color..")
                print("Converting it into a grayscale image")
                img = cv.cvtColor(src=img, code=cv.COLOR_BGR2GRAY)
            else:
                temp_w, temp_h = template.shape[::-1]
                img_w, img_h = img.shape[::-1]
            # ims = cv.resize(img, (960, 540))

            if temp_h and img_h is not None:
                if temp_w < img_w and temp_h < img_h:
                    res = cv.matchTemplate(img, template, cv.TM_SQDIFF)
                    # loc = np.where(res >= 0.9)
                    min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)

                    threshold = 0.9
                    match = False

                    if np.max(res) > threshold:
                        match = True

                    # Take minimum since we are using TM_SQDIFF
                    if match is True:
                        top_left = min_loc
                        bottom_right = (top_left[0] + temp_w, top_left[1] + temp_h)
                        cv.rectangle(img=img, pt1=top_left, pt2=bottom_right, color=(0, 255, 0), thickness=5)
                        # plt.subplot(121), plt.imshow(res, cmap='gray')
                        # plt.title('Matching Result'), plt.xticks([]), plt.yticks([])
                        plt.imshow(img, cmap='gray')
                        plt.title('Detected Point'), plt.xticks([]), plt.yticks([])
                        plt.show()
                        print("Coordinates of the plotted image are ", top_left, " ", bottom_right)
                        cv.waitKey(0)
                    else:
                        print("Template not matched with the image")
                else:
                    print("Template height and width must be less than origninal image's height and width \n")
            else:
                print("Image heigth and template height are None")
        else:
            print("Image not read successfully!!")
    else:
        print("Image path not provided")

1 Ответ

0 голосов
/ 28 января 2020

Прежде всего, TemplateMatching работает только в изображениях практически одинаково. Небольшие изменения в нужных объектах, включенных в новые кадры, могут создать трудности для хорошего соответствия.

В вашем случае первый пример работает правильно, потому что вы только что обрезали шаблон из него. Как и в случае с примерами, все было в точности так: Пример 1 и Пример 2 .

Я не предлагаю использовать только TemplateMatching. Функция matchShape также очень эффективна. Вы можете получить массивы контуров вашего шаблона (например, символ x контур) и сравнить их с другими контурами. Я предлагаю вам поддержать функцию TemplateMatching с другими OpenCV структурными функциями .

Те же проблемы также упоминаются в этих сообщениях: здесь и также здесь

...