aircv是codeskyblue 基于python-opencv2在 https://github.com/NetEaseGame/aircv提交的库,是一款基于Python-opencv2的目标定位。codeskyblue于2017年4月24日最后一次更新支持opencv3。我个人很喜欢这个库,可以实现从一张图中找出局部特征图,可以找多图。
用法示例
import aircv as ac
imsrc = ac.imread('youimage.png') # 原始图像
imsch = ac.imread('searched.png') # 带查找的部分
1.SIFT查找图像
print ac.find_sift(imsrc, imsch)
# - when Not found
@return None
# 之前是返回的 []
# - when found
@return {'point': (203, 245), 'rectangle': [(160, 24), (161, 66), (270, 66), (269, 24)], 'confidence': 0.09}
# point: 查找到的点
# rectangle: 目标图像周围四个点的坐标
# confidence: 查找图片匹配成功的特征点 除以 总的特征点
2.SIFT多个相同的部分查找
print ac.find_all_sift(imsrc, imsch, maxcnt = 0)
# - when not found
@return []
# - when found
@return [{..}, {..}]
# {..}的内容跟SIFT查找到单个图像的格式一样
maxcnt是可选参数,限制最多匹配的数量。
3.直接匹配查找图像
print ac.find_template(imsrc, imsch)
4.查找多个相同的图片,如在图形1中查找图形2
print ac.find_all_template(imsrc, imsch)
最近用用aircv发现出错,代码如下:
# -*- coding: utf-8 -*-
import aircv as ac
import numpy as np
#从temp.jpeg里找出无信号.jpeg
imsrc = ac.imread('F:\\temp.jpeg')#读源图
imobj = ac.imread('F:\\无信号.jpeg')#读目标图
pos = ac.find_template(imsrc, imobj)
print(pos)
出错如下:
Traceback (most recent call last):
File "C:\Program Files\Python35\program\temp.py", line 10, in
imobj = ac.imread('F:\\无信号.jpeg')#读目标图
File "c:\Program Files\Python35\lib\site-packages\aircv\__init__.py", line 87, in imread
raise RuntimeError("file: '%s' not exists" % filename)
RuntimeError: file: 'F:\无信号.jpeg' not exists
[Finished in 0.8s]
从错误信息上看是F:\无信号.jpeg不存在,但是F:\是存在无信号.jpeg文件的,出错源于aircv\__init__.py", line 87
把F:\无信号.jpeg改为1.jpeg运行正常。打开__init__.py查看80-88行代码如下:
def imread(filename):
'''
Like cv2.imread
This function will make sure filename exists
'''
im = cv2.imread(filename)
if im is None:
raise RuntimeError("file: '%s' not exists" % filename)
return im
改代码如下:
# -*- coding: utf-8 -*-
import cv2
import aircv as ac
import numpy as np
imsrc = ac.imread('F:\\temp.jpeg')#读目标图
imobj = cv2.imdecode(np.fromfile('F:\\无信号.jpeg',dtype=np.uint8),-1)#读取中文路径及名称
pos = ac.find_template(imsrc, imobj)#查找目标图中出现的源特征图
print(pos)
要让cv2.imread支持中文路径和文件名,就需要用cv2.imdecode(np.fromfile(pathfile,dtype=np.uint8),-1)方式读取。
查资料得知:
OpenCV中的imdecode函数是从指定的内存缓存中读一幅图像,imencode是将一幅图像写进内存缓存中。imread是从指定文件载入一幅图像,imwrite是保存一幅图像到指定的文件中。imread和imdecode内部是通过ImageDecoder类来进行图像解码。write和encode内部是通过ImageEncoder类来进行图像编码。
疑问:以上说明imdecode读取图像难道更快?但是会占用更多内存? imread读取图像会I/O 高占用?本人没有找到测试这两种方法 谁更快?谁更低CPU占用?谁更低IO占用?谁更低内存占用?也希望哪位大神能解释清楚。如果弄清楚了原理,就可以加中文字符判断,相应处理。
函数如下
#检验是否含有中文字符
def isChineseChar(char):
for c in s:
if ('\u4e00' <= c <= '\u9fa5'):
return True
return False
print(isChineseChar("Great 中华人民共和国"))
True
[Finished in 0.2s]