一、实践目标
本项目在行空板上外接USB摄像头,通过摄像头来识别人物名字。
二、知识目标
学习使用pytesseract库进行文字识别的方法。
三、实践准备
硬件清单:
软件使用:Mind+编程软件x1
四、实践过程
1、硬件搭建
1、将摄像头接入行空板的USB接口。
2、通过USB连接线将行空板连接到计算机。
2、软件编写
第一步:打开Mind+,远程连接行空板
第二步:在“行空板的文件”中新建一个名为AI的文件夹,在其中再新建一个名为“基于行空板的pytesseract传统人物识别”的文件夹,导入本节课的依赖文件。
第三步:编写程序
在上述文件的同级目录下新建一个项目文件,并命名为“main.py”。
示例程序:
- # -*- coding: UTF-8 -*-
-
- # MindPlus
- # Python
- import sys
- sys.path.append("/root/mindplus/.lib/thirdExtension/nick-pytesseract-thirdex")
- # from pinpong.board import Board
- from pinpong.board import Board,Pin
- from pinpong.extension.unihiker import *
- # from pinpong.libs.dfrobot_speech_synthesis import DFRobot_SpeechSynthesis_I2C
- import time
- import cv2
- import pytesseract
- from PIL import Image,ImageFont,ImageDraw
- import os
- import numpy as np
-
-
- Board().begin()
- # p_gravitysynthesis = DFRobot_SpeechSynthesis_I2C()# 语音合成
- # p_gravitysynthesis.begin(p_gravitysynthesis.V2)
- def drawChinese(text,x,y,size,r, g, b, a,img):
- font = ImageFont.truetype("HYQiHei_50S.ttf", size)
- img_pil = Image.fromarray(img)
- draw = ImageDraw.Draw(img_pil)
- draw.text((x,y), text, font=font, fill=(b, g, r, a))
- frame = np.array(img_pil)
- return frame
-
- pytesseract.pytesseract.tesseract_cmd = r'/usr/bin/tesseract'
- cap = cv2.VideoCapture(0)
- cap.set(cv2.CAP_PROP_FRAME_WIDTH, 240)
- cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 320)
- cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)
- cv2.namedWindow('cvwindow',cv2.WND_PROP_FULLSCREEN)
- cv2.setWindowProperty('cvwindow', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
- while not cap.isOpened():
- continue
- print("start!")
- ShiBieNaRong = ''
- img_word1 = ''
- img_word2 = ''
-
- while True:
- cvimg_success, img_src = cap.read()
- cvimg_h, cvimg_w, cvimg_c = img_src.shape
- cvimg_w1 = cvimg_h*240//320
- cvimg_x1 = (cvimg_w-cvimg_w1)//2
- img_src = img_src[:, cvimg_x1:cvimg_x1+cvimg_w1]
- img_src = cv2.resize(img_src, (240, 320))
- cv2.imshow('cvwindow', img_src)
- key = cv2.waitKey(5)
- if key & 0xFF == ord('b'): # Press the "a" key on Unihiker will stop the program.
- print("退出视频")
- break
- # if (button_a.is_pressed()==True):
- elif key & 0xFF == ord('a'):
- ShiBieNaRong = []
- try:
- if not os.path.exists("/root/image/pic/"):
- print("The folder does not exist,created automatically")
- os.system("mkdir -p /root/image/pic/")
- except IOError:
- print("IOError,created automatically")
- break
- cv2.imwrite("/root/image/pic/image.png",img_src)
- time.sleep(0.2)
- img = Image.open('/root/image/pic/image.png')
- ShiBieNaRong = pytesseract.image_to_string(img, lang='chi_sim')[0:2]
- print(ShiBieNaRong)
-
-
- img_src = drawChinese(text=str(ShiBieNaRong),x=10, y=20,size=25,r= 50,g=200,b=0,a=0,img=img_src)
- cv2.imshow('cvwindow', img_src)
-
- cap.release() # Release usb camera. # 释放摄像头
- cv2.destroyAllWindows() # Destory all windows created by opencv. # 关闭所有窗口
复制代码
3、运行调试
第一步:安装依赖库
运行pytesseract目录下1-Install_dependency.py程序文件,安装各个依赖库。
第二步:运行主程序
运行“main.py”程序,可以看到初始时屏幕上显示着摄像头拍摄到的实时画面,将摄像头画面对准任务名字,如这里为孔子,然后按下板载按键a,将此帧图像拍摄保存,之后自动识别图像上的文字,在Mind+软件终端,我们可以看到识别到的中文结果。
Tips:拍摄的图片保存在/root/image/pic这个路径下。
4、程序解析
这段程序通过使用OpenCV库调用摄像头,实时从摄像头读取图像,然后使用Tesseract进行OCR识别并将结果显示在图像上。具体流程如下:
①初始化:程序启动时,会导入所需的库,初始化UNIHIKER开发板,配置Tesseract命令路径,打开默认的摄像头设备,并设置摄像头的分辨率和缓冲区大小。接着,创建一个全屏窗口用于显示图像。
②定义函数:定义一个用于在图像上绘制中文字符的函数drawChinese。
③主循环:程序进入一个无限循环,在每次循环中,程序会执行以下操作:
· 从摄像头读取一帧。如果读取失败,则继续下一次循环。
· 检查按键事件:
· 如果按下'b'键,程序退出循环。
· 如果按下'a'键,程序捕获当前图像并保存到指定路径,然后使用Tesseract识别图像中的中文字符,并将结果打印到终端。
· 在图像上绘制识别到的中文字符,并在窗口中显示处理后的图像。
④结束:当主循环结束时,程序会释放摄像头设备,并关闭所有OpenCV窗口。
五、知识园地
1. 了解pytesseract库
pytesseract 是 Tesseract OCR 引擎的 Python 封装库,用于从图像中提取文本。它提供了简便的接口,使得在 Python 程序中能够轻松实现光学字符识别(OCR)。
功能
1. 图像文字识别:从各种图像格式(如 PNG、JPEG、BMP 等)中提取文本。
2. 多语言支持:能够识别多种语言的文本。
3. 布局分析:处理复杂文档布局,包括多列文本和表格。
4. 位置信息提取:提供识别到的字符或单词在图像中的位置坐标。
5. 多种输出格式:支持纯文本、字典格式、HOCR(HTML OCR)格式等。
特点
1. 开源免费:基于开源的 Tesseract OCR 引擎,免费使用。
2. 跨平台:支持 Windows、macOS 和 Linux 系统。
3. 高准确性:Tesseract 引擎经过多年的开发和优化,具有较高的识别准确性。
4. 易于集成:提供简单的 Python 接口,便于与其他 Python 项目和库集成。
|