如何用python轻松实现图片搜索

826 阅读5分钟

image search with python

这是我第二次写关于如何用python做图片搜索。第一篇博文。我写的那篇博文引起了很多人的兴趣,甚至到今天我还经常收到人们对它的评论或到github repo来寻求帮助。所以我想是时候进行一次复习了。

Python imagesearch现在是一个pip-eable包

我做了一些工作,把这个库作为一个包。为了让你能直接使用管道库。这比我说 "把文件复制到你的项目中 "这样的废话要好得多。 现在,它就像做.NET一样容易。

pip3 install python-imagesearch

上述方法可能会失败,或者你将无法使用这个库,因为你需要额外的包,这取决于你的操作系统。

Linux

sudo pip3 install python3-xlib
sudo apt-get install -y scrot python3-tk python3-dev python3-opencv -y

MacO

brew install opencv

Windows

不需要额外的安装步骤🙂

快速入门

用python做图像搜索的最简单的例子是这样的。

from python_imagesearch.imagesearch import imagesearch

只需在屏幕上搜索一个出现的图片 "github.png",并打印其X/Y位置

#mc_embed_signup{background:#fff; clear:left; font:14px Helvetica,Arial,sans-serif; width:100%;}/*在你的网站样式表或这个样式块中添加你自己的Mailchimp表单样式覆盖。 我们建议将这个块和前面的CSS链接移到你的HTML文件的头部。*/

订阅更多信息(我保证不会发送垃圾邮件)。

其他功能

图像搜索区

在屏幕的特定矩形上执行图像搜索,这对加快搜索速度非常有用,因为要搜索的屏幕空间会更少。
它还有助于将搜索集中在屏幕的某一特定部分,以减少出现假阳性的机会。

pos = imagesearcharea("./github.png", 0, 0, 800, 600)
if pos[0] != -1:
    print("position : ", pos[0], pos[1])
else:
    print("image not found")

输入。
image:图像文件的路径(支持的类型见opencv imread
) precision:越高,容忍度越低,发现的假阳性越少 默认为0.8im
:一个PIL图像,如果你打算搜索同一个不变的区域的几个元素,就很有用

输出。
如果找到的元素是一个数组[x,y],则为该元素的左上角坐标,如果没有,则为[-1,-1]。

区域抓取器

对优化imagesearcharea或imagesearch的调用很有用,通过获得一个已经处理过的图像,你可以在它上面进行多次搜索,速度也会略有提高。 下面是一个例子

# non -optimized way :
time1 = time.clock()
for i in range(10):
    imagesearcharea("./github.png", 0, 0, 800, 600)
    imagesearcharea("./panda.png", 0, 0, 800, 600)
print(str(time.clock() - time1) + " seconds (non optimized)")

# optimized way :

time1 = time.clock()
im = region_grabber((0, 0, 800, 600))
for i in range(10):
    imagesearcharea("./github.png", 0, 0, 800, 600, 0.8, im)
    imagesearcharea("./panda.png", 0, 0, 800, 600, 0.8, im)
print(str(time.clock() - time1) + " seconds (optimized)")

# sample output :

# 0.5233619831305721 seconds (non optimized)
# 0.4075934110084374 seconds (optimized)

输入:一个包含要捕捉的区域的4个坐标的元组 元组应包含坐标:topx, topy, bottomx, bottomy

**输出:**所选区域的PIL图像。

图像搜索_循环

连续搜索屏幕上的图像,直到找到为止,对于制作一个等待脚本直到X图像出现非常有用。例如,等待加载屏幕的结束。

from python_imagesearch.imagesearch import imagesearch_loop

pos = imagesearch_loop("./github.png", 1)
print("position : ", pos[0], pos[1])

输入。
image:图像文件的路径(支持的类型见opencv imread)
time:找不到图像后的等待时间(秒)
precision:越高,容忍度越低,发现的误报越少 默认为0.8

输出。
如果找到的元素的左上角坐标,作为一个数组[x,y]。

imagesearch_numLoop

连续搜索屏幕上的图像,直到找到它或达到最大样本数。

from python_imagesearch.imagesearch import imagesearch_numLoop

输入
image:图像文件的路径(支持的类型见opencv imread)
time:找不到图像后的等待时间
maxSamples:函数超时前的最大样本数
precision:越高,容忍度越低,发现的误报越少 默认为0.8

输出:元素的左上角坐标,如果找到的元素是一个数组[x,y] 。

imagesearch_region_loop

与imagesearch_loop非常相似,只是它适用于区域。

from python_imagesearch.imagesearch import imagesearch_region_loop

输入。
image:图像文件的路径(支持的类型见opencv imread
)time:找不到图像后的等待时间
x1:左上角x值y1
:左上角y值x2
:右下角x值y2
:右下角y值eprecision
:越高,容忍度越低,发现的假阳性越少默认为0.8

输出。
元素的左上角坐标,作为一个数组[x,y]。

图像搜索_count

计算屏幕上有多少个图像出现的次数。

from python_imagesearch.imagesearch import imagesearch_count

输入。
image:目标图像文件的路径(支持的类型见opencv imread
) precision:越高,容忍度越低,发现的误报越少 默认为0.9

输出。
一个给定的图像在屏幕上出现的次数。
可以选择一个输出图像,所有出现的图像都用红色的轮廓框起来。

从文件夹搜索图像

对一个文件夹中的所有图片进行图像搜索。 这个函数是由kadusalles完成的。

from python_imagesearch.imagesearch import imagesearch_count

results = str(imagesearch_from_folder('./', 0.8))
print(results)

输入。
path: 包含图片的文件夹(支持的图片类型是jpg、gif、png和jpeg
) precision: 越高,容忍度越低,发现的误报越少 默认是0.9

输出。
一个包含所有图像的字典,其中键是图像路径,值是它的位置。

#mc_embed_signup{background:#fff; clear:left; font:14px Helvetica,Arial,sans-serif; width:100%;}/*在你的网站样式表或这个样式块中添加你自己的Mailchimp表单样式覆盖。 我们建议将这个块和前面的CSS链接移到你的HTML文件的头部。*/

订阅更多信息(我保证不会发送垃圾邮件)。

结语

就这样吧!现在你应该能够轻松地用python进行图片搜索了。如果你对实际的代码感兴趣,或者想贡献自己的力量,请到github仓库来:github.com/drov0/pytho…。如果你喜欢我的文章,请到brokencode.io

The postHow to easily image search with pythonappeared first onMartin Lees.