前言

本文是对MaixPy官方文档 MaixCAM MaixPy 实现 OCR 图片文字识别 - MaixPy 的项目实践整理与拓展,侵权即删。

功能介绍

OCR是MaixCAM中功能强大的数字文字识别模块,可以做到轻松的识别各种数字与文字。

OCR官方例程解析

工程源码

from maix import camera, display, image, nn, appmodel = "/root/models/pp_ocr.mud"
ocr = nn.PP_OCR(model)cam = camera.Camera(ocr.input_width(), ocr.input_height(), ocr.input_format())
disp = display.Display()image.load_font("ppocr", "/maixapp/share/font/ppocr_keys_v1.ttf", size = 20)
image.set_default_font("ppocr")while not app.need_exit():img = cam.read()objs = ocr.detect(img)for obj in objs:points = obj.box.to_list()img.draw_keypoints(points, image.COLOR_RED, 4, -1, 1)img.draw_string(obj.box.x4, obj.box.y4, obj.char_str(), image.COLOR_RED)disp.show(img)

拆解

把整段代码拆成“零基础小白语言”,一行一行嚼碎了解释。
读完你就能知道:“这段程序到底在干嘛?每个括号里的东西是什么意思?”


🔑 先记住 3 个角色

角色作用比喻
摄像头拍照眼睛
PP_OCR认字大脑里的“识字老师”
屏幕把结果给你看画板

🧩 逐行讲解

1️⃣ 把“识字老师”请进门
from maix import camera, display, image, nn, app
  • 告诉 Python:我要用 摄像头、屏幕、画图、识字老师、退出按钮 这 5 个工具包。

model = "/root/models/pp_ocr.mud"
  • 识字老师的“教材”放在板子里的 /root/models/pp_ocr.mud

  • .mud 就是 MaixPy 的模型文件(提前烧好的)。

ocr = nn.PP_OCR(model)
  • ocr 就是这位老师的名字。

  • nn.PP_OCR(...):用刚才那本教材,创建出识字老师。


2️⃣ 打开眼睛(摄像头)
cam = camera.Camera(ocr.input_width(), ocr.input_height(), ocr.input_format())
  • ocr.input_width():老师告诉我们“照片必须宽 320 像素”(举例)。

  • ocr.input_height():照片必须高 320 像素。

  • ocr.input_format():照片必须是 RGB888 格式。

  • 摄像头就按这三条要求拍照。


3️⃣ 准备画板(屏幕)
disp = display.Display()
  • 把板载 LCD 初始化成“画板”,后面用 disp.show(...) 把图刷上去。


4️⃣ 换一支能写中文的笔
image.load_font("ppocr", "/maixapp/share/font/ppocr_keys_v1.ttf", size=20)
image.set_default_font("ppocr")

先把字体文件加载进来并取名 "ppocr",再告诉系统“以后写字默认就用它”。
这样后面 draw_string 写中文时就不会缺字或乱码。

  • load_font:把 ppocr_keys_v1.ttf 这张“字体卡片”装进内存,取名叫 "ppocr"

  • set_default_font:后面写字都默认用这张卡片,字号 20。

  • 把它想象成 ​“给电脑安装并设置默认输入法”​ 的三步:


    ① 把字体文件装进内存
    image.load_font("ppocr", "/maixapp/share/font/ppocr_keys_v1.ttf", size = 20)
    参数白话解释类比
    "ppocr"给这套字体起个“小名”,后面写字时直接叫这个小名把「搜狗拼音」安装后,系统里出现一个叫“搜狗”的输入法
    "/maixapp/share/font/ppocr_keys_v1.ttf"字体文件真正存放的位置输入法安装包在硬盘上的路径
    size = 20默认字号 20 像素安装时把默认字体大小调成 20 号

    执行完这行,内存里就多了一套叫 "ppocr" 的字体,字号默认 20。


    ② 把这套字体设为“默认”
    image.set_default_font("ppocr")
  • 以后所有 draw_string(...) 如果不另外指定,就用刚才那套 "ppocr" 字体

  • 就像 Windows 里把“搜狗”设为默认输入法,以后打字不用每次手动切换。


5️⃣ 无限循环:拍照 → 认字 → 画画 → 显示
while not app.need_exit():
  • 一直循环,直到你按 Home 键或 IDE 停止。

  • app.need_exit() 就像“有人按了暂停键吗?”


5.1 拍照
    img = cam.read()
  • 摄像头立即拍一张图,存到变量 img 里。


5.2 交给老师认字
    objs = ocr.detect(img)
  • ocr.detect(img):老师看图,返回 一堆“字对象” 列表 objs

  • 每个对象里包含:

    • 字的内容(obj.char_str()

    • 字的方框 4 个顶点 (obj.box)


5.3 把每个字框出来并写字
    for obj in objs:
  • 对每一个识别到的字,做下面两件事。

        points = obj.box.to_list()
  • 把字的 4 个角坐标变成列表,例如 [x1,y1,x2,y2,x3,y3,x4,y4]

        img.draw_keypoints(points, image.COLOR_RED, 4, -1, 1)
  • 在 4 个角上画红色小圆点(“红点钉”)。
    参数:

    • points:要画的点

    • image.COLOR_RED:颜色红

    • 4:点大小 4 像素

    • -1:实心填充

    • 1:线宽 1(此处实心所以忽略)

        img.draw_string(obj.box.x4, obj.box.y4, obj.char_str(), image.COLOR_RED)
  • 在方框右下角 (x4, y4) 写文字本身。
    参数:

    • obj.box.x4, obj.box.y4:文字左上角坐标

    • obj.char_str():识别到的文字(如“你”、“好”)

    • image.COLOR_RED:红色


5.4 把画好的图给屏幕
    disp.show(img)
  • 把整幅图立即刷到 LCD,你就能看到红框红字。


🎯 一句话总结

摄像头不停拍照 → PP_OCR 认字 → 程序把每个字用红框标出来并写上字本身 → 屏幕实时显示。

OCR应用拓展

本部分将实现,通过OCR识别文字然后通过串口协议通讯发送到MSPM0G3507单片机。

串口通讯部分内容可查看【电赛学习笔记】MaxiCAM 项目实践——与单片机的串口通信-CSDN博客

from maix import camera, display, image, nn, app, uart, time
import struct
from serial_protocol import SerialProtocol   # 同目录下的协议类# ---------- 初始化 OCR ----------
model = "/root/models/pp_ocr.mud"
ocr = nn.PP_OCR(model)# ---------- 初始化摄像头 ----------
cam = camera.Camera(ocr.input_width(), ocr.input_height(), ocr.input_format())
disp = display.Display()# ---------- 加载中文字体 ----------
image.load_font("ppocr", "/maixapp/share/font/ppocr_keys_v1.ttf", size=20)
image.set_default_font("ppocr")# ---------- 初始化串口 ----------
device = "/dev/ttyS0"              # UART1:IO15(TX)  IO16(RX)
serial = uart.UART(device, 115200)
proto  = SerialProtocol()          # 协议打包/解包工具while not app.need_exit():img = cam.read()objs = ocr.detect(img)# 本地可视化(可选)for obj in objs:points = obj.box.to_list()img.draw_keypoints(points, image.COLOR_RED, 4, -1, 1)img.draw_string(obj.box.x4, obj.box.y4, obj.char_str(), image.COLOR_RED)# 串口发送:改为索引遍历MAX_SEND = 3for idx in range(min(MAX_SEND, len(objs))):obj = objs[idx]text_utf8 = obj.char_str().encode('utf-8')payload = struct.pack('<H', idx) + text_utf8packet = proto.encode(payload)serial.write(packet)print(packet.hex(' '))disp.show(img)time.sleep_ms(50)

下面把 整段代码 拆成 “一句话一行” 的幼儿园级别讲解,每个括号、每个参数都说明白。你可以直接对着代码看注释。


0️⃣ 工具箱:把要用的“工具”搬进来

from maix import camera, display, image, nn, app, uart, time
  • 告诉 Python:我要用 摄像头、屏幕、画图、神经网络、退出按钮、串口、延时 这些工具。

import struct
  • 用来把数字/文字 打包成字节,方便串口发送。

from serial_protocol import SerialProtocol
  • 把我们自己写的“串口协议”小工具请进来,负责加帧头、校验、帧尾


1️⃣ 初始化“识字老师”

model = "/root/models/pp_ocr.mud"
  • OCR 老师的“教材”文件路径(提前烧在板子里)。

ocr = nn.PP_OCR(model)
  • 用这本教材 创建 OCR 识别器对象,名字叫 ocr


2️⃣ 打开“眼睛”和“画板”

cam = camera.Camera(ocr.input_width(), ocr.input_height(), ocr.input_format())
  • 摄像头拍照尺寸与老师要求一致:
    ocr.input_width() → 宽(如 320)
    ocr.input_height() → 高(如 224)
    ocr.input_format() → 像素格式(RGB/BGR)

disp = display.Display()
  • 初始化屏幕,准备把图刷上去。


3️⃣ 换一支“能写中文的笔”

image.load_font("ppocr", "/maixapp/share/font/ppocr_keys_v1.ttf", size=20)
  • 把字体文件 ppocr_keys_v1.ttf 装进内存,给它起小名叫 "ppocr",字号 20。

image.set_default_font("ppocr")
  • 以后写字默认都用 "ppocr" 这套字体。


4️⃣ 打开“嘴巴”(串口)

device = "/dev/ttyS0"
  • 告诉系统:我要用 UART1(板子上 IO15=TX,IO16=RX)。

serial = uart.UART(device, 115200)
  • 把串口波特率设成 115200,8N1,准备说话。

proto = SerialProtocol()
  • 实例化“协议打包器”,负责给每句话加 帧头 AA、校验和、帧尾 55


5️⃣ 主循环:一直干到死循环

while not app.need_exit():
  • 如果没人按“停止”键,就一直循环。


5.1 拍照
img = cam.read()
  • 摄像头立刻拍一张图,存进变量 img


5.2 让“识字老师”看图
objs = ocr.detect(img)
  • 把图交给 ocr 识别,返回一个 OCR_Objects 列表,里面每条是一个字/一行文字。


5.3 本地画画(可选,但看得见)
for obj in objs:
  • 对识别到的 每个文字块 做下面两件事。

    points = obj.box.to_list()
  • 四边形框 的四个顶点变成 [x1,y1,x2,y2,x3,y3,x4,y4]

    img.draw_keypoints(points, image.COLOR_RED, 4, -1, 1)
  • 在四个角画 红色实心小圆点(大小 4 像素)。

    img.draw_string(obj.box.x4, obj.box.y4, obj.char_str(), image.COLOR_RED)
  • 在右下角 写文字本身,颜色红色。


5.4 串口发送:最多发 3 条
MAX_SEND = 3
  • 每帧最多发 3 条文字,防止串口拥堵。

for idx in range(min(MAX_SEND, len(objs))):
  • 实际条数取 “3 与识别数量” 的较小值,避免越界。

    obj = objs[idx]
  • 拿第 idx 条文字对象。

    text_utf8 = obj.char_str().encode('utf-8')
  • 把文字转成 UTF-8 字节流(1 个汉字 3 字节左右)。

    payload = struct.pack('<H', idx) + text_utf8
  • 小端 16 位序号(2 字节)+ 文字字节流 → 组成 payload。

    packet = proto.encode(payload)
  • 用协议类给 payload 加帧头、长度、校验、帧尾

    serial.write(packet)
  • 把完整的 协议帧 通过 UART1 发出去。

    print(packet.hex(' '))      # 调试用
  • 在控制台打印十六进制,肉眼检查帧格式。


5.5 把画好的图刷到屏幕
disp.show(img)
  • 把带红框红字的图像显示到 LCD。

time.sleep_ms(50)
  • 每帧后休息 50 毫秒,让 CPU 喘口气;可删。


🎯 一句话总结

摄像头拍照 → OCR 认字 → 画框写字 → 用协议打包 → 串口发出 → 屏幕显示
逐字、逐参数、逐括号都拆完了,直接复制即可跑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/93593.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/93593.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/93593.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在生成式引擎优化(GEO)中取得成功

如果你希望您的内容出现在 AI Overviews、ChatGPT 和 Gemini 中&#xff1f;以下是设置 GEO 广告系列的方法。 任何好的 GEO 活动的第一步是创造一些东西实际上想要链接到或引用。 GEO 策略组件 想象一些你合理预期不会直接在 ChatGPT 或类似系统中找到的体验&#xff1a; 例如…

WPFC#超市管理系统(3)商品管理

超市管理系统6. 商品管理6.1 添加商品6.1 商品管理主界面6.3 修改商品6. 商品管理 将前文中的GoodsView全部改成和数据库一致的ProductView新增枚举类型商品类型ProductType.cs namespace 超市管理系统.Enums {public enum ProductType{水果类,休闲食品类,粮油类,饮料类,日用…

openwrt中br-lan,eth0,eth0.1,eth0.2

CPU是QCA9558 有两个以太网接口 这个好像没有外接交换机直接印出来的 openwrt中br-lan,eth0,eth0.1,eth0.2 https://blog.csdn.net/f2157120/article/details/119460852 这个哥用的是 链接: DomyWifi DW33D 路由器 CPU是QCA9558 有两个以太网接口 因为CPU没集成千兆交换&…

RAG实战指南 Day 29:RAG系统成本控制与规模化

【RAG实战指南 Day 29】RAG系统成本控制与规模化 开篇 欢迎来到"RAG实战指南"系列的第29天&#xff01;今天我们将深入探讨RAG系统的成本控制与规模化部署策略。当RAG系统从原型阶段进入生产环境时&#xff0c;如何经济高效地扩展系统规模、控制运营成本成为关键挑…

React 中获取当前路由信息

在 React 中获取当前路由信息&#xff0c;根据使用的路由库不同&#xff08;如 React Router v5/v6 或 Next.js&#xff09;&#xff0c;方法也有所区别。以下是常见场景的解决方案&#xff1a;1. 使用 React Router v6 获取当前路径&#xff08;pathname&#xff09;、查询参数…

Sklearn 机器学习 随机森林 网格搜索获取最优参数

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Sklearn 机器学习:随机森林 + 网格搜索获取最优参数实战指南 在构建机器学习模型时,…

力扣-101.对称二叉树

题目链接 101.对称二叉树 class Solution {public boolean check(TreeNode l, TreeNode r) {if (l null && r null)return true;if ((l null && r ! null) || (r null && l ! null))return false;if (l.val ! r.val)return false;return check(l…

从句--02-1--done,doing ,prep 做定语

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录定语1.done&#xff08;过去分词&#xff09;做定语一、过去分词作定语的位置二、过去分词作定语的语义特点三、过去分词作定语与现在分词作定语的区别四、过去分词作…

JVM全面解析

摘要&#xff1a;JVM是Java程序运行的核心环境&#xff0c;负责解释执行字节码并管理内存。其核心功能包括类加载与验证、字节码执行优化、内存管理与垃圾回收&#xff08;GC&#xff09;、跨平台支持及安全性保障。JVM架构包含程序计数器、虚拟机栈、本地方法栈、堆和方法区等…

SDC命令详解:使用write_script命令进行输出

相关阅读 SDC输出命令https://blog.csdn.net/weixin_45791458/category_12993272.html?spm1001.2014.3001.5482 write_script命令用于将设计中的属性设置命令输出为脚本文件&#xff08;其实它并不是一个SDC命令&#xff0c;归为此类只是为了方便管理&#xff09;&#xff0c…

‌CASE WHEN THEN ELSE END‌

‌CASE WHEN THEN ELSE END‌ 是SQL中实现条件逻辑的核心表达式&#xff0c;支持单字段匹配和多条件判断&#xff0c;适用于数据处理、分类统计等场景。‌基本语法形式‌SQL中CASE表达式有两种标准形式&#xff1a;1‌ 简单CASE表达式‌&#xff08;字段直接匹配&#xff09;C…

飞单诱因:管理漏洞与人性交织

飞单看似是 “员工个人行为”&#xff0c;实则是餐厅管理、激励机制、外部环境等多重因素共同作用的结果。要根治飞单&#xff0c;需先理清背后的 “动力源”—— 员工为何选择冒险&#xff1f;一、“收入失衡”&#xff1a;薪资与付出不匹配的 “补偿心理”基层员工&#xff0…

工作笔记-----FreeRTOS中的lwIP网络任务为什么会让出CPU

工作笔记-----FreeRTOS中的lwIP网络任务为什么会让出CPU Author: 明月清了个风Date&#xff1a; 2025.7.30Ps:最近接触了在FreeRTOS中使用lwIP实现的网络任务&#xff0c;但是在看项目代码的过程中出现了一些疑问——网络任务的优先级为所有任务中最高的&#xff0c;并且任务框…

在 CentOS 系统上安装 Docker

在 CentOS 系统上安装 Docker&#xff0c;可按以下步骤操作&#xff1a;一、卸载旧版本&#xff08;如存在&#xff09;bashsudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-…

【CVPR2025】FlowRAM:用区域感知与流匹配加速高精度机器人操作策略学习

文章目录FlowRAM&#xff1a;用区域感知与流匹配加速高精度机器人操作策略学习一、问题出在哪里&#xff1f;方法部分&#xff1a;从结构到机制&#xff0c;详解 FlowRAM 的内部设计逻辑1. 动态半径调度器&#xff1a;自适应注意力机制在 3D 感知中的实现2. 多模态编码器与序列…

图片查重从设计到实现(5)Milvus可视化工具

要通过网页&#xff08;Web&#xff09;访问和管理 Milvus 向量数据库&#xff0c;可以使用官方提供的 Milvus Web UI 工具&#xff0c;这是一款可视化管理界面&#xff0c;支持查看集合、向量数据、执行基本操作等功能。以下是具体的部署和访问方法&#xff1a; 一、部署 Milv…

Linux-awk与sed

文章目录一、AWK1. awk 是什么&#xff1f;2. awk 的基础语法2.1 选项2.2 模式2.3 动作3. awk 的内置变量4. 典型应用场景及示例4.1 打印特定列4.2 条件筛选4.3 使用正则表达式4.4 统计行数4.5 字段操作4.6 使用内置函数4.7 多文件处理4.8 使用自定义变量5. 高级应用&#xff1…

文件加密工具(勒索病毒加密方式)

语言&#xff1a;C# WPF功能&#xff1a;文件加/解密本程序不提供下载&#xff0c;该程序新手操作不当&#xff0c;可能会导致文件加密后无法解密问题&#xff0c;解密需要独立私钥private.key文件支持&#xff0c;没有私钥加密文件是无法被解密的。更新&#xff1a;2025年7月3…

IOC实现原理源码解析

Spring三级缓存流程图singletonObjects&#xff08;一级缓存&#xff09;&#xff1a;缓存经过了完整生命周期的Bean&#xff1b;arlySingletonobjects&#xff08;二级缓存&#xff09;&#xff1a;缓存未经过完整生命周期的Bean&#xff0c;如果某个Bean出现了循环依赖&#…

笔记本电脑磁盘维护指南:WIN11系统磁盘维护完全手册

1. 引言 在当今数字化时代,笔记本电脑已经成为我们工作、学习和娱乐不可或缺的重要工具。随着Windows 11操作系统的普及和应用,用户对于系统性能和稳定性的要求越来越高。然而,许多用户往往忽视了一个至关重要的方面——磁盘维护。磁盘作为计算机系统中负责数据存储和读取的…