Сравните две картинки, чтобы определить, есть ли внутри один и тот же объект - PullRequest
0 голосов
/ 08 ноября 2019

Я определяю проблему: у меня есть две фотографии, например, две фотографии с монетой в 1 евро. Как я могу сравнить два изображения, чтобы получить «да, они содержат монету в 1 евро»? конечно, тест должен вернуть значение false, если второе изображение содержит монету в 2 евро.

Я пробовал методы openCV, но нет ничего более точного. Кроме того, подход ML не подходит, так как цель состоит в том, чтобы распознать два объекта на двух изображениях без какой-либо другой базы данных.

1 Ответ

2 голосов
/ 08 ноября 2019

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

Сначала создается маска на основезолотистый цвет. (Вам, вероятно, придется сделать цветовую гамму более специфичной - у меня было простое изображение. Я использовал этот удобный скрипт для определения цветовой гаммы.) Затем некоторый шум удаляется, а затем обнаруживаются контуры. Контуры, не имеющие дочернего или родительского контура, являются твердым центром монеты стоимостью 2 евро. Контуры с ребенком, но без родителя - это полоса монеты в 1 евро. Контуры с родителем, но без ребенка, являются центром монеты в 1 евро и игнорируются.

€ 2 рисуется красным, 1 евро синим.

enter image description here

import cv2
import numpy as np
# load image
img = cv2.imread("E1E2.jpg")
# Convert to HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# define range wanted color in HSV
lower_val = np.array([0,25,0]) 
upper_val = np.array([179,255,255])

# Threshold the HSV image to get only goldish colors
mask = cv2.inRange(hsv, lower_val, upper_val)

# remove noise
kernel = np.ones((5,5))
mask_open = cv2.morphologyEx(mask,cv2.MORPH_OPEN,kernel)
mask_close = cv2.morphologyEx(mask_open,cv2.MORPH_CLOSE,kernel)

# find contours
contours, hier = cv2.findContours(mask_close,cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)

# loop through contours, check hierarchy, draw contours
for i, cnt in enumerate(contours):
    (prev, nxt, child, parent) = hier[0][i]
    if child == -1 and parent == -1 :
        # €2
        cv2.drawContours(img, [cnt],0,(0,0,255), 3)
    if child != -1 and parent == -1 :
        # €1
        cv2.drawContours(img, [cnt],0,(255,0,0), 3)

# display image
cv2.imshow("Res", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...