跳到主要内容

OCR 光学字符识别

PaddleOCR 简介

PaddleOCR(简称 PPOCR)是由百度飞桨(PaddlePaddle)团队开源的一个端到端文字识别(OCR)系统,致力于提供**“从文本检测 → 方向分类 → 文本识别 → 后处理”** 的完整解决方案。 它不仅支持中英文、多语言场景,还广泛适用于文档、票据、路牌、车牌、自然场景等 OCR 应用。

本示例展示如何基于 SpacemiT 智算核,使用图片或ROS2消息作为输入,执行 OCR 模型的推理,并通过 ROS 2 发布检测结果。

环境准备

建议使用 Bianbu ROS 系统,并确保已经安装了开发依赖

安装依赖

sudo apt install python3-opencv ros-humble-cv-bridge ros-humble-camera-info-manager \
ros-humble-image-transport python3-spacemit-ort python3-pyclipper

导入 ROS2 环境

source /opt/bros/humble/setup.bash

图片推理

准备图片

cp /opt/bros/humble/share/jobot_ppocr_py/data/test.jpg .

本地保存推理结果

ros2 launch br_perception ocr_infer_img.launch.py img_path:=/home/bianbu/test.jpg

输出结果将保存在当前目录的 ocr_result.jpg 中,如图所示。

终端打印如下

参数说明

ocr_infer_img.launch.py 的参数说明

参数名称作用默认值
img_path推理时使用的图片路径data/test.jpg

使用推理服务

推理服务接受原始图像消息并返回OCR推理结果,可以通过 ros2 interface show jobot_interfaces/srv/OCRInfer 查看服务定义。

开启服务

ros2 launch br_perception ocr_service.launch.py

终端打印:

客户端代码

编写客户端代码

import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from jobot_interfaces.srv import OCRInfer
import cv2
import numpy as np


class OCRClient(Node):
def __init__(self):
super().__init__('ocr_client')
self.client = self.create_client(OCRInfer, 'ocr_infer')
while not self.client.wait_for_service(timeout_sec=1.0):
self.get_logger().info('Waiting for OCR service...')
self.get_logger().info('OCR service connected.')

def send_request(self, img_path):
req = OCRInfer.Request()

img = cv2.imread(img_path)
img_msg = Image()
img_msg.height, img_msg.width, _ = img.shape
img_msg.encoding = 'bgr8'
img_msg.step = img_msg.width * 3
img_msg.data = img.tobytes()

req.image = img_msg

future = self.client.call_async(req)
rclpy.spin_until_future_complete(self, future)
resp = future.result()

print(f"Detected {len(resp.result.boxes)} boxes.")
result_img = self.ros_img_to_cv2(resp.result_img)
cv2.imwrite('ocr_result_srv.jpg', result_img)
print("Saved OCR result image to ocr_result_srv.jpg")

def ros_img_to_cv2(self, ros_img: Image):
img = np.frombuffer(ros_img.data, dtype=np.uint8).reshape(ros_img.height, ros_img.width, 3)
return img


def main():
rclpy.init()
client = OCRClient()
client.send_request('test.jpg')
client.destroy_node()
rclpy.shutdown()


if __name__ == '__main__':
main()

注意确保这里的图像路径正确。

请求服务

客户端代码保存为 ocr_client.py

然后执行:

python3 ocr_client.py

终端打印:

结果可视化文件保存在 ocr_result_srv.jpg