批量图片识别¶
需求¶
需求伪不伪,没关系。主要是练习了Coding.
批量识别图片文字:
- 拍照的信息,从来不看的。你问我,我问谁去?
- 放手机里面睡觉也挺好的。说不定啥时就用上了:)
- 再告诉你一个秘密,其实,我就练习一下Python。连这份文件都在睡觉 o_o z Z
目前的解决方案¶
- 成熟的OCR软件:天若OCR,PandaOCR,OneNote
- 直接的图片搜索: 印象笔记
- 其他类手机应用: 白描。。。
- 问题:要么不适合批量操作,要么导致太过混乱。
用途¶
- 撰写笔记
- 整理图片信息
实现¶
#!usr/bin/python
# coding:utf-8
import sys
import json
import base64
import re
import os
# 导入Python3 模块
from urllib.request import urlopen
from urllib.request import Request
from urllib.error import URLError
from urllib.parse import urlencode
from urllib.parse import quote_plus
# 防止https证书校验不正确
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
# Python3 应用标识
IS_PY3 = sys.version_info.major == 3
# Baidu AI
API_KEY = 'fUr6iukVECdKe4llMB4KvTN1'
SECRET_KEY = 'TxtW3oNqG765lRGGtuoAcXZnVUWVrPCM'
OCR_URL = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic"
""" TOKEN start """
TOKEN_URL = 'https://aip.baidubce.com/oauth/2.0/token'
def fetch_token():
"""
Function: 获取 Token
return: None
"""
params = {'grant_type': 'client_credentials',
'client_id': API_KEY,
'client_secret': SECRET_KEY}
post_data = urlencode(params)
if (IS_PY3):
post_data = post_data.encode('utf-8')
req = Request(TOKEN_URL, post_data)
try:
f = urlopen(req, timeout=5)
result_str = f.read()
except URLError as err:
print(err)
if (IS_PY3):
result_str = result_str.decode()
result = json.loads(result_str)
if ('access_token' in result.keys() and 'scope' in result.keys()):
if not 'brain_all_scope' in result['scope'].split(' '):
print ('please ensure has check the ability')
exit()
return result['access_token']
else:
print ('please overwrite the correct API_KEY and SECRET_KEY')
exit()
def fetch_filelist():
"""
Function: 获取当前路径文件列表
return: fileslist
"""
def read_file(image_path):
"""
Function: 读取文件
return: 文件流
"""
# f = None
# try:
# f = open(image_path, 'rb')
# return f.read()
# except:
# print('read image file fail')
# return None
# finally:
# if f:
# f.close()
with open(image_path, "rb") as f:
return f.read()
# 调用远程服务
def request(url, data):
""""
Function: 调用远程服务
return: None
"""
req = Request(url, data.encode('utf-8'))
# has_error = False
try:
f = urlopen(req)
result_str = f.read()
if (IS_PY3):
result_str = result_str.decode()
return result_str
except URLError as err:
print(err)
def save_file(filename, text):
"""
Function: 保存文件识别内容到文档
@Parm filename: 识别文件名称
@Parm text: 识别内容
return: None
"""
# 获取程序文件目录
filepath = sys.path[0]
# 构建文件
file = "%s/file_content.txt" % filepath
# 写入文件
with open(file, "a") as f:
f.write(filename)
f.write("\n")
f.write(text)
f.write("\n" * 2)
print("Well Done!")
def OCR(image_file):
"""
Function: 图像识别
"""
# 获取access token
token = fetch_token()
# 拼接通用文字识别高精度url
image_url = OCR_URL + "?access_token=" + token
# print("image_url: ", image_url)
# 读取图片
file_content = read_file(image_file)
# print("file_content: ", file_content)
# 调用文字识别服务
result = request(image_url, urlencode({'image': base64.b64encode(file_content)}))
# 解析返回结果
text = ""
result_json = json.loads(result)
for words_result in result_json["words_result"]:
text = text + words_result["words"]
# 打印文字
# print(text)
# 保存文本
save_file(image_file, text)
def main():
"""
Function: 主函数
Return: None
"""
# 获取当前文件路径
filepath = sys.path[0]
for filename in os.listdir(filepath):
# print(filename)
# 匹配图片文件
if(re.match(r'.*.[png, jpg]$', filename)):
print(filename)
# 构建完整路径
image_file = "%s/%s" % (filepath, filename)
# print(image_file)
# 识别图片文本
OCR(image_file)
else:
print("文件 %s 不符合识别格式" % filename)
if __name__ == '__main__':
main()
用法¶
1, 复制文件AarOCR.py 到目标文件夹。
2,运行程序,结果输出:当前文件夹下的文件/文件夹列表识别状态, 并在本地文件夹中得到文件file_content.txt
3,复制文件file_content.txt内容即可。
其他¶
- 该文件重复执行将会在上次执行之后,追加内容。
-
本文件采用百度AI SDK 接口实现。关于接口是我个人免费的,用得不多,就不再加蜜了。若有读者尝试,可自行申请或者每月用太多。
-
目前,程序抓取文本要么不换行,要么每识别的成段内容之间都要换行:
text = text + words_result["words"]。 因此无法达到目前成熟产品如:天若OCR,PandaOCR 那般🐂x。导致整理的时候校对工作做得累人,特别是日狗的图表。