我正在定义一个问题:我有两张照片,例如两张带有1欧元硬币的照片。
我如何比较两个图像以得到“是的,它们都包含一个1欧元硬币”?当然,如果第二张图片包含2欧元硬币,则测试应返回false。
我尝试过openCV方法,但是没有那么精确的方法。
此外,机器学习方法也不适用,因为目标是在没有任何其他数据库的情况下识别两个图像中的两个对象。
最佳答案
这在很大程度上取决于您所拥有的图像类型,但是如果它是清晰自上而下的图像,则可以使用金色带/中心来区分它们。
首先,根据金色来制作面膜。 (您可能必须使颜色范围更具体-我有一张简单的图像。我使用this convenient script确定颜色范围。)接下来,去除一些噪点,然后检测轮廓。没有子轮廓或父轮廓的轮廓是2欧元硬币的牢固中心。 1个硬币的范围是有一个 child 但没有 parent 的轮廓。与 parent 但没有 child 的轮廓是1欧元硬币的中心,将被忽略。
€2被抽成红色,€1被抽成蓝色。
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()