python - 比较两张图片以确定里面是否有相同的物体

标签 python opencv image-processing

我正在定义一个问题:我有两张照片,例如两张带有1欧元硬币的照片。
我如何比较两个图像以得到“是的,它们都包含一个1欧元硬币”?当然,如果第二张图片包含2欧元硬币,则测试应返回false。

我尝试过openCV方法,但是没有那么精确的方法。
此外,机器学习方法也不适用,因为目标是在没有任何其他数据库的情况下识别两个图像中的两个对象。

最佳答案

这在很大程度上取决于您所拥有的图像类型,但是如果它是清晰自上而下的图像,则可以使用金色带/中心来区分它们。

首先,根据金色来制作面膜。 (您可能必须使颜色范围更具体-我有一张简单的图像。我使用this convenient script确定颜色范围。)接下来,去除一些噪点,然后检测轮廓。没有子轮廓或父轮廓的轮廓是2欧元硬币的牢固中心。 1个硬币的范围是有一个 child 但没有 parent 的轮廓。与 parent 但没有 child 的轮廓是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()

关于python - 比较两张图片以确定里面是否有相同的物体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58767441/

相关文章:

python - 如何解码 matplotlib 的 Colormap 中的颜色映射?

python - 为多个文件添加扩展名(Python3.5)

python - 找到矩形的角

c - 如何在c中打开几个jpg图像?

python - TypeError : src is not a numpy array, 既不是标量。无流

python - 一旦 Futures 开始,你如何杀死它们?

python - 类型转换原始字符串python

c++ - 用 if 语句检测蓝线

macos - 无法在Mac上安装OpenCv:/usr/local中没有文件

Java:检查图像是否移动