
Raspberry Pi OCR
简介
OCR点读翻译笔提供扫描翻译功能,小巧便于携带,方便实用。 用树莓派Zero 2 W做为主控。
简介:OCR点读翻译笔提供扫描翻译功能,小巧便于携带,方便实用。 用树莓派Zero 2 W做为主控。开源协议
:GPL 3.0
描述
项目说明
- 使用TYPE-C接口,内置锂电池供电,内置SD卡座,屏幕,WIFI和蓝牙等模块。
- 能扫描识别点读中英文,支持同步翻译,识别准确率不低于90%;
- 需支持语音交互,可实时显示扫描及翻译的内容并播报;
- 尺寸大小不超过150mm40mm30mm,并设计合适的3D外壳,材料不限;
开源协议,项目属性
本项目为首次公开,为本人原创项目。只开源在OSHWHUB.COM,项目未曾在别的比赛中获奖。
项目进度
23年7尾月竞标拿下这任务,这是最初的想法,想把树莓派游戏机也做进来,然后画板投板。
8月中板子SMT回来,开始调试硬件,补焊直插件,蛮快的。
嘉立创EDA,SMT现在越用越来顺手,公司的板子也画了好几款,新换的电脑都懒得装AD了。
9月初因为树莓派ZERO播放音频卡,跑python openCV 内存CPU占满,而e络盟一年前付款的ZERO 2W左等右等又被推迟了。
只能淘宝上重新买一块,哎,当时树莓价格还没有回落。学习的成本高啊。
11月1日0点,用openCV特征匹配进行拼接,策略是当某张图特征匹配失败时则用自己的算法拼接,两者结合提高了拼接质量、识别准确率
12月11日,上面特征匹配最终因为功底不够,转换速度奇慢,就算用PC端做运算也比树懒慢。
终于有了进展,之前的识别率一直上不去,甚至连图片拼接都有一半以上失败
新方案,抛弃编码轮,抛弃间隔抓图,改成128帧录像的方式,
把视频传送到PC端,再从视频中拆解图片,拼接图片,
提交给百度API进行图片OCR。最后把文字,及翻译结果返回到扫描笔。
接下来不断优化测试再优化。
春节放假也耗在扫描笔上了,经过了这半年时间,倒是让我这硬件工程师更加熟练python了,都玩上图片识别了。
元宵节继续整合,整理代码,开始编辑文档,也感谢阿创的通融给我延期。
2月29日0点看了又看,改了又改,终于编辑完文档了。夜猫烟鬼叩求大家多多多包含,点赞。
设计原理
0 系统框图
1.硬件部分
1.1电源部分 USB TYPE-C接口输入,IP5306做电池充电,升压成5V供给整机
1.2树莓派zero 2w 外接,
1.2.1 USB2.0 Hub 控制芯片FE1.1s,扩展三路USB接口,
挂接USB声卡用于录音,外放
挂接摄像头在OCR扫描的时候录像保存成avi文件
外置USB口(可接U盘,SD读卡器,键盘鼠标等)
1.2.2 I2C总线接磁编码传感器MT6701,用于检测滑动距离,这个删除了,
1.2.3 SPI总线接 ST7789驱动的LCD
1.2.4 GPIO接了6个按键,LCD背光控制
1.2.5 部分关键硬件,
除了下面这几个在某宝搜图买,其余的零件都是JLC贴,或者立创商城买的
摄像头 GC0380 30W 黑白 128帧 镜头选80度的
2.4寸LCD显示屏 240x320高清IPS显示屏ST7789
3.7V锂电池,603450-1200毫安[带板带端子]
ZERO 2W主板
2.软件部分
2.1 树莓派通过SD读卡器读取WIFI配置文件并更新
先在SD卡上新键wifi.conf文件,写入(字符不用引号)
SSID=你的WIFISSDI
Password=你的密码
SD插入读卡器
插到扫描笔USB2.0外扩接口
if keyVal[0] == 1: # 在树莓派启动程序后,判断按下左键则调用
def checkMedia()
读取SD读卡器中的wifi.conf文件
去更新/etc/wpa_supplicant/wpa_supplicant.conf # 注意权限问题
2.2 VNC设置及登录
树莓派 VNC Viewer 远程桌面配置教程 | 树莓派实验室 (nxez.com)
https://shumeipai.nxez.com/2018/08/31/raspberry-pi-vnc-viewer-configuration-tutorial.html
2.3 Shell登录树莓派桌面
使用VNC,
FinalShell工具
Windows X64版,下载地址:
http://www.hostbuf.com/downloads/finalshell_windows_x64.exe
使用方法
https://blog.csdn.net/muriyue6/article/details/117520456 # 详细的使用方法参考
名称: 自定义
主机: 填写你树莓排的IP,可以到路由器里查看
端口: 默认22就可以了,无需修改
备注: 自定义
方法: 密码
用户名:默认账户pi和默认密码raspberry
密码: 填写服务器的登录密码
2.4 ZEROTIER内网穿透
因为OCR扫描,视频转成文字是在PC自建的服务器上转换,利用zerotier做内网穿透,(我有外网IP服务器也可以不用内网穿透)
我在树莓派,以及自己的PC电脑都添加了zerotier穿透
树莓派安装软件
在树莓派上开一个命令窗口,运行下述命令:
curl -s https://install.zerotier.com | sudo bash
添加网络
下载安装完成后,通过下边连接服务器,将“#”换成Network ID:
sudo zerotier-cli join ################
sudo zerotier-cli join 1c33c1ced########5
通过下边这个命令可以查看连接网络:
sudo zerotier-cli listnetworks
配置自启动
sudo systemctl start zerotier-one
#启动
sudo systemctl stop zerotier-one
#停止
systemctl enable zerotier-one
#打开开机自启
systemctl disable zerotier-one
#关闭开机自启
https://blog.csdn.net/Bing_Lee/article/details/107171675 # 这里面讲得详细点
2.5 升库 换源下载可以快点
https://zhuanlan.zhihu.com/p/488143997 # 换源方法,我也是从这学的,里面讲得详细点
树莓派端安装各种库
pip install smbus2 # IIC库,最新程序用不到
pip install spidev # SPI总线驱动LCD
pip install numpy # 功能需求搬迁到PC端了
pip install requests # 百度API中用到
pip install json # 百度API中用到
pip install socket #
pip install logging # 日志
pip3 install python-vlc # 播放WAV音频
pip install alsaaudio # 播放WAV音频
pip install wave # 播放WAV音频
pip install pyaudio # 播放WAV音频
pip install pygame #播放WAV音频
安装cv2库的时候蛮折腾的,不过现在把拆图识图拼图放到了PC端,PC端相对好安装点, PC端直接CMD里
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
树莓安装openCV
成功将树莓派切换到清华大学镜像站后,安装openCV变得十分简单。
在命令行窗口输入一句指令即可从清华大学镜像站安装openCV到树莓派上:
sudo apt-get install python3-opencv
先下载.whl文件
opencv_python-4.5.5.62-cp39-cp39-linux_armv7l.whl
numpy-1.22.3-cp39-cp39-linux_armv7l.whl
pip3 install XXX.whl
安装依赖库
sudo apt-get update #安装依赖库
sudo apt-get install libhdf5-dev
sudo apt-get install libatlas-base-dev
sudo apt-get install libjasper-dev
sudo apt-get install libqt4-test
sudo apt-get install libqtgui4
2.6 最后是百度,讯飞的两个API
2.6.1 百度API实现语音合成参考
https://cloud.baidu.com/?from=console
https://blog.csdn.net/qq_38113006/article/details/105742296
获取Access Token,我直接在 【API在线调试】 中直接【调试】复制返回token存到常量
TOKEN = '24.d2ebdc4ac09d*****************92000.1704816738.282335-36477719' # 存到常量constant.py
baiduAPI.py 里主要函数讲解
def ocr(path):
"""
向百度提交图片,返回文字
:param path: 图片
:return: OCR识别的文字
"""
--------------------------------------------------------------------------------------
def tts(text):
"""
TTS转换,百度API转换效果很好,声音好听,读音准确
:param text: 文字
:return: wav(单声道,16000采样率)
"""
--------------------------------------------------------------------------------------
def vop(path):
"""
SST转换,上传WAV文件把语音转成文字
:param path: wav文件路径,单声道,16000采样率
:return: 文字
"""
--------------------------------------------------------------------------------------
def fanyi(query, from_lang, to_lang):
"""
翻译
:param query: 原文
:param from_lang: 'en'
:param to_lang: 'zh'
:return: 翻译结果
"""
--------------------------------------------------------------------------------------
2.6.2 讯飞星火GPT
星火认知大模型Web API文档
https://www.xfyun.cn/doc/spark/Web.html#_1-%E6%8E%A5%E5%8F%A3%E8%AF%B4%E6%98%8E
--------------------------------------------------------------------------------------
定义全局变量 global text # 用来接收GPT返回的答复
def getGpt(_input): # 把问题提交给讯飞星火GPT
"""
把问题写入_input, 讯飞星火GPT返回答复
:param _input: 提出问题
:return: 返回答复
"""
SparkApi.main(id,key,,,_input) # 在SparkApi.py中
getText() # 更新答复到 global text
2.7 设置py 程序文件自启动
方法 :.bashrc 配置
方法是修改 .bashrc 文件。
sudo nano /home/fengyifan/.bashrc
在 /home/pi/.bashrc 文件的末尾添加启动命令文本。
echo Running at boot
sudo python /home/pi/sample.py # 这里改成自己的.py文件路径
上面的 echo 命令用于显示 .bashrc 文件中的脚本已经开始运行。
2.8 PC端自建HTTP服务器,提供拆图识图拼图,OCR转换
Python Flask Web
Flask 是一个轻量级的基于 Python 的 Web 框架
sudo pip3 install Flask
--------------------------------------------------------------------------------------
@app.route('/api/get')
def api_get():
"""
实现HPPT中的GET应答
在浏览器中输入 http://192.168.192.168:5555/api/get?data={"user":"admin","pwd":"123456","id":"A7890"} 可返回OCR拼图,识别状态
http://192.168.192.168:5555/api/get?data={"user":"admin","pwd":"123456","type":"GPT","id":"A7890"}
:return: jsonify(reply) # 返回JSON数据{"mes":"请求的数据,转换状态"}
"""
if g_ocr_sta == 5: # 5代表转换并识别完成
reply['sta'] = "ok"
reply['mes'] = g_ocr_txt
else:
reply['sta'] = str(g_ocr_sta) # "ok"
reply['mes'] = "转换中,请等待"
--------------------------------------------------------------------------------------
@app.route('/receive-jpg', methods=['POST'])
def receive_file():
"""
实现HPPT中的POST,接受AVI视频的上传文件
获取文件名称及后缀名
:return:
"""
video_to_frames(avi_path + '/' + 'output.avi') # 把视频逐帧拆解成JPG图片
立标志 g_ocr_t = 1 # 然后t1 = threading.Thread(target=myMain) 线程中查询到标记则开始把JPG图片拼接起来.....
--------------------------------------------------------------------------------------
t1 线程中上循环大法while True:
if g_ocr_t == 1:
myF.rotateJPG(img_src, img_rot) # 旋转图片
myF.cutImg(img_rot, img_cut) # 裁剪图片 (沿着挂在中轴线上的字符,文字最外框 裁剪)
lis = myF.imgsToList(img_cut) # 图片集转拼接list,list里保存的是帧与帧之间的像素位移,位移计算请看下一段
myF.collage_img(lis, img_cut) # 拼接图像保存到img
txt = baidu.ocr(img) # 把imgt图片提交给 百度OCR识别
baidu.fanyi(txt, from_lang, to_lang) # 百度翻译
g_ocr_sta = 5
# 完成标记
--------------------------------------------------------------------------------------
def myF.imgsToList(img_cut):
"""
核心就是轮廓识别,比对前后两帧图的像素位移,然后拼图。
下面讲讲怎么识图,计算出前后两帧图片的像素位移
"""
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转灰度
binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU) # 二值化,在这选cv2.THRESH_OTSU=自动阈值
contours, h = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 检测轮廓 RETR_EXTERNAL=只检测最外层轮廓for contour in contours: # 遍历轮廓
去除小面积的轮廓
判断字符、文字是否在中轴线上,只关心落在中轴线上的文字,字符
画轮廓,画中心点
——————————————————————————————————————
好了经过上面的处理,有了有效的字符坐标
看下图,X的0点在左边,
图片的位移 _ind = A图第一个框X0(字母T) 减 B图第一个框X0(字母T)
在图片C中,绿框触0边了,过滤掉左边的第一个框(C图字母T),那么C图字母e就变成了第一个框
套用上面公式的话 _ind = B图字母T 减 C图字母e,会出现负位移, 判断出现负值则改用用B图第二个框(B图字母e) 减 去 C图字母e
_ind = A图第一个框X0(字母T) 减 B图第一个框X0(字母T)
if _ind < 0: # 负位移
# 改成用B图第二个框(B图字母e) 减 去 C图字母e
_ind = B图字母e 减 C图字母e
拼接效果,放大看,可以看到纵向的条纹,这就是帧与帧像素位移拼接的痕迹



2.9 碰到的问题汇总,注意什么,如何解决
matplotlib 降库可以解决报错
ls -l /dev/video*
历史记录残留:过去曾经连接过的摄像头设备虽然现在已经断开连接,但设备节点可能仍然保留在 /dev 目录下。
为了确定哪些是实际可用的摄像头,可以尝试逐个测试这些设备节点,或者使用 v4l2-ctl --list-devices 或 udevadm info 等命令来查看设备详情及关联的物理设备信息。
--------------------------------------------------------------------------------------
3. 外壳设计,外壳文件
4. 面板设计
在立创面板,选亚克力
实物展示
1. 实物照片:初代作品,不够精致,希望后面我做二版时,能做得漂亮点,更完善一点,也把树莓派游戏机实现。
2.单词OCR扫描识别演示视频在附件中 # WeChat_20240228225520.mp4
(真实一镜过无修剪,转换过程确实比商用的慢很多,请大家见谅,也请大虾勿喷,或者帮提出优化的思路,我改进)
3.下图也算实物展示一部分吧,此图片是在比较理想状态下,匀速移动扫描,等待漫长的转换返回的结果。
4.中文扫描演示视频在附件中 # WeChat_20240229001727.mp4
5.语音交互(GPT接入的是讯飞星火)演示视频在附件中 # WeChat_20240228234526.mp4
设计,复刻注意事项
复刻注意:
0>扫描的时候,请拿把厚点的尺子做靠山,可以让扫描笔移动得笔直一些,还有按R键后请等待半秒再移动扫描笔,谢谢
1>按键正确的型号是 编号:C318884 再加个7*3.5mm按键帽
2>去除编码器小板
3>树莓派USB D+ D- 的与底板之间的顶针对偏了
要改善的地方:
4>增加单键开关机电路,比IP5603关断得彻底一点,断电待机更久, 还有就是电池检测
5>声音喇叭选大一点,壳也大一点,现在的声音差强人意
附件文件说明:
PC端PY工程.part1.rar 拆解成part1,part2,part3,三个压缩包<50M, 密码是:oshwhub.com 密码是:oshwhub.com
真不是我想加密码,我试过改文件名,改压缩方式,试了N遍都是上传失败,估计触发了敏感词语了,加了密码才能上传成功。
树莓派程序工程New0911,解压后请放在/home/pi/Desktop/New0911路径
设计图

BOM


评论