Raspberry Pi OCR - 嘉立创EDA开源硬件平台

编辑器版本 ×
标准版 Standard

1、简单易用,可快速上手

2、流畅支持300个器件或1000个焊盘以下的设计规模

3、支持简单的电路仿真

4、面向学生、老师、创客

专业版 professional

1、全新的交互和界面

2、流畅支持超过3w器件或10w焊盘的设计规模,支持面板和外壳设计

3、更严谨的设计约束,更规范的流程

4、面向企业、更专业的用户

专业版 Raspberry Pi OCR

简介:OCR点读翻译笔提供扫描翻译功能,小巧便于携带,方便实用。 用树莓派Zero 2 W做为主控。

开源协议: GPL 3.0

(未经作者授权,禁止转载)

已参加:星火计划2023

创建时间: 2023-10-09 09:25:11
更新时间: 2024-03-14 09:38:30
描述

项目说明

  • 使用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  #  换源方法,我也是从这学的,里面讲得详细点

sudo apt-get update

树莓派端安装各种库

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/

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 降库可以解决报错

凡是报错信息为AttributeError: 'xxxx' object has no attribute 'yyyy'的,都可以考虑一下是因为该库版本与所使用代码不匹配造成的。通常是版本太低造成的
 
在调试过程中,程序有时找不到摄像头
ls -l /dev/video*
这条命令会列出所有以 /dev/video 开头的设备文件及其相关信息,每行对应一个摄像头。通常情况下,video0 是第一个摄像头,video1 是第二个,以此类推。
历史记录残留:过去曾经连接过的摄像头设备虽然现在已经断开连接,但设备节点可能仍然保留在 /dev 目录下。
为了确定哪些是实际可用的摄像头,可以尝试逐个测试这些设备节点,或者使用 v4l2-ctl --list-devices 或 udevadm info 等命令来查看设备详情及关联的物理设备信息。
同时,你也可以尝试重启树莓派,因为重启通常能够清理不再使用的设备节点。
 
--------------------------------------------------------------------------------------
 

3. 外壳设计,外壳文件

 

PcuTWw1rDIBBy9ViRgikXM4LW9A1k8fDmg9TIcxO.png

 

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路径

 

 

设计图
原理图
1 /
PCB
1 /
未生成预览图,请在编辑器重新保存一次
工程成员
侵权投诉
相关工程
换一批
加载中...
添加到专辑 ×

加载中...

温馨提示 ×

是否需要添加此工程到专辑?

温馨提示
动态内容涉嫌违规
内容:
  • 153 6159 2675

服务时间

周一至周五 9:00~18:00
  • 技术支持

support
  • 开源平台公众号

MP