Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何查找包含在图像中的图像?_Python_Image Processing_Opencv - Fatal编程技术网

Python 如何查找包含在图像中的图像?

Python 如何查找包含在图像中的图像?,python,image-processing,opencv,Python,Image Processing,Opencv,我目前正在建立一个基本上相当于一个搜索引擎和一个网络漫画画廊之间的交叉点,它专注于引用来源和给作者评分 我正试图找到一种方法来搜索一幅图像,以找到其中的字符 例如: 假设我将红色字符和绿色字符保存为“红色人”和“绿色人”,如何确定图像是否包含其中一个字符 这不需要100%的认可,或者这是我想创建的一个附加功能,我只是不确定从哪里开始。我在谷歌上搜索了很多图像识别,但没有发现有什么帮助 无论如何,我更愿意使用Python来实现这一点。OpenCV有一个Python接口,您可以查看它。如果是字符,

我目前正在建立一个基本上相当于一个搜索引擎和一个网络漫画画廊之间的交叉点,它专注于引用来源和给作者评分

我正试图找到一种方法来搜索一幅图像,以找到其中的字符

例如:

假设我将红色字符和绿色字符保存为“红色人”和“绿色人”,如何确定图像是否包含其中一个字符

这不需要100%的认可,或者这是我想创建的一个附加功能,我只是不确定从哪里开始。我在谷歌上搜索了很多图像识别,但没有发现有什么帮助


无论如何,我更愿意使用Python来实现这一点。

OpenCV有一个Python接口,您可以查看它。如果是字符,不要更改太多,可以尝试使用该函数


是他们的官方教程(教程是用C++接口编写的,但是你应该能从Python中找到一个好的用法。

< P>对于任何在将来遇到这个问题的人来说。

这可以通过以下方式完成。总结一下(我的理解),模板匹配会在另一个图像中查找一个图像的精确匹配

下面是一个如何在Python中执行此操作的示例:

import cv2

method = cv2.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)
As仅包含与给定图片中仅包含一次的模板匹配的内容。以下是如何同时匹配多个:

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)
(注意:我更改并修复了原始代码中的一些“错误”)

结果:


来源:

看一看,我不知道sikuli将如何用于此。Sikuli看起来严格适用于GUI界面。这些是用户上传到web服务器上的图片。Sikuli不仅仅是GUI的。从技术上讲,您可以使用它运行任何您想要的Jython脚本。您可以编写一个脚本,打开用户图像,然后查找要查找的图像模式。这只是一个初步的想法。然而,Sikuli不支持图像中的缩放或旋转…您可以使用动态缩放变量模板匹配。看看和,我同意Moshe,但我认为应该是
cv2.matchtemplate(大图像、小图像、方法)
。另外,这里还有一个很好的python中的信息源。奇怪的是,cv2的
导入cv
引发了
导入错误:无法导入名称“cv”
,而
导入cv2
效果很好…解决方案:好,因为我使用的是Py3,它实际上使用OpenCV3,尽管它仍然以
cv2
的形式导入,所以有些东西已经更改了位置/名称。如果其中一个图像在另一个图像中以低不透明度的形式出现,它会工作吗。(输入图像中的一个图像在另一个图像中带有水印。)FWIW,我在这里使用了你的代码来测试其他东西,我觉得行
w,h=template.shape[:-1]
应该是
h,w=template.shape[:-1]
,至少与我的测试图像一致(在3组图像中是一致的),只要从他的答案中的源链接抓取源代码即可;它是最新的,很有效。这是最好的