aircv不能读取中文路径文件名的解决方法( 错误提示 raise RuntimeError("file: '%s' not exists" % filename))

前序

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 <module>
    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

 看到ac.imread是基于cv2.imread,cv2.imread也是不支持中文路径和文件名的,这么就好办了。

改代码如下:

# -*- 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]

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值