【電賽學習筆記】MaixCAM 的OCR圖片文字識別

前言

本文是對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操作系統的普及和應用,用戶對于系統性能和穩定性的要求越來越高。然而,許多用戶往往忽視了一個至關重要的方面——磁盤維護。磁盤作為計算機系統中負責數據存儲和讀取的…