我目前正在构建一个基本上相当于搜索引擎和网络漫画库的交叉点,这些漫画专注于引用来源和给予作者信用。
我正试图找出一种搜索图像的方法来查找其中的字符。
例如:
假设我将红色字符和绿色字符保存为Red Man和Green Man,我如何确定图像是否包含其中一个。
这不需要100%识别或任何东西这是我想要创建的更多功能,我只是不知道从哪里开始。我已经做了很多谷歌搜索图像识别,但没有找到很多帮助。
对于它的价值,我宁愿使用Python来做到这一点。
答案 0 :(得分:28)
对于任何偶尔发现这种情况的人。
可以使用template matching完成此操作。总结(我的理解),模板匹配寻找另一个图像中一个图像的精确匹配。
以下是如何在Python中执行此操作的示例:
import cv2
from cv2 import cv
method = cv.CV_TM_SQDIFF_NORMED
# Read the images from the file
small_image = cv2.imread('small_image.png')
large_image = cv2.imread('large_image.jpeg')
result = cv2.matchTemplate(small_image, large_image, method)
# We want the minimum squared difference
mn,_,mnLoc,_ = cv2.minMaxLoc(result)
# Draw the rectangle:
# Extract the coordinates of our best match
MPx,MPy = mnLoc
# Step 2: Get the size of the template. This is the same size as the match.
trows,tcols = small_image.shape[:2]
# Step 3: Draw the rectangle on large_image
cv2.rectangle(large_image, (MPx,MPy),(MPx+tcols,MPy+trows),(0,0,255),2)
# Display the original image with the rectangle around the match.
cv2.imshow('output',large_image)
# The image is only displayed if we call this
cv2.waitKey(0)
答案 1 :(得分:21)
由于Moshe's answer仅涵盖匹配给定图片中仅包含一次的模板。以下是一次匹配几个的方法:
import cv2
import numpy as np
img_rgb = cv2.imread('mario.png')
template = cv2.imread('mario_coin.png')
w, h = template.shape[:-1]
res = cv2.matchTemplate(img_rgb, template, cv2.TM_CCOEFF_NORMED)
threshold = .8
loc = np.where(res >= threshold)
for pt in zip(*loc[::-1]): # Switch collumns and rows
cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)
cv2.imwrite('result.png', img_rgb)
(注意:我更改并修复了原始代码中的一些'错误' )
<强>结果:强>
答案 2 :(得分:1)
OpenCV有一个你可以看到的Python界面。如果字符不会改变太多,您可以尝试使用matchTemplate函数。
Here是他们的官方教程(该教程是使用C ++接口编写的,但您应该能够很好地了解如何在Python中使用该函数)。