具身智能+工业视觉:快速实现OCR识别与设备联动
1 工效组合展示

2 具身智能工业视觉获取与分析应用
2.1 工具软件安装



2.2 工业视觉环境构建与应用

2.3 昇腾工业视觉终端应用展现





3 具身智能工业视觉识别快速编码实现
3.1 IMA-DS借力

3.2 运行环境构造

3.3 编码实现
import argparse
import os
import time
import cv2
import numpy as np
# 必须在读取 RTSP 流之前设置:Windows 下用 TCP 传输更稳定、延迟更低
os.environ["OPENCV_FFMPEG_CAPTURE_OPTIONS"] = "rtsp_transport;tcp"
from PIL import Image, ImageDraw, ImageFont
from paddleocr import PaddleOCR
from config import CAMERA, OCR, RUNTIME
# ---------- 初始化 ----------
def init_ocr():
"""初始化 PaddleOCR(首次运行会自动下载模型)"""
print("[1/3] 正在初始化 PaddleOCR(首次运行需下载模型,请稍候)...")
return PaddleOCR(
lang=OCR["lang"],
use_angle_cls=OCR["use_angle_cls"],
use_gpu=OCR["use_gpu"],
show_log=OCR["show_log"],
)
def open_camera(url):
"""打开网络摄像机视频流"""
print(f"[2/3] 正在连接摄像机: {url}")
cap = cv2.VideoCapture(url, cv2.CAP_FFMPEG)
if not cap.isOpened():
return None
# 关闭内部缓冲,降低画面延迟
cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)
return cap
def load_font():
"""加载中文字体;找不到就用 PIL 默认字体"""
for path in (
RUNTIME["font_path"],
"C:/Windows/Fonts/msyh.ttc", # 微软雅黑
"C:/Windows/Fonts/simsun.ttc", # 宋体
):
if os.path.exists(path):
return ImageFont.truetype(path, 22)
return ImageFont.load_default()
# ---------- 结果绘制 ----------
def draw_chinese_text(frame, text, pos, color=(0, 255, 0), font=None):
"""用 PIL 在画面上绘制中文(OpenCV 的 putText 无法显示汉字,会变乱码)"""
rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
pil_img = Image.fromarray(rgb)
draw = ImageDraw.Draw(pil_img)
draw.text(pos, text, font=font, fill=color)
return cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR)
def draw_results(frame, results, font):
"""把识别结果(框 + 文字 + 置信度)画到画面上"""
if not results or not results[0]:
return frame
for item in results[0]:
box = item[0] # 4 个顶点 [[x,y], [x,y], [x,y], [x,y]]
text, conf = item[1] # 识别文字, 置信度
pts = np.array(box, dtype=np.int32).reshape((-1, 1, 2))
cv2.polylines(frame, [pts], True, (0, 255, 0), 2) # 绿色框
label = f"{text} {conf:.2f}"
x, y = int(box[0][0]), int(box[0][1])
frame = draw_chinese_text(frame, label, (x, max(y - 26, 4)), font=font)
return frame
def print_results(results):
"""在控制台打印识别出的文字"""
if not results or not results[0]:
return
for item in results[0]:
text, conf = item[1]
print(f" 识别: {text} (置信度 {conf:.2f})")
# ---------- 主流程 ----------
def run_camera(ocr, font):
url = CAMERA["url"]
cap = open_camera(url)
if cap is None:
print("[错误] 无法连接摄像机,请检查 config.py 里的地址、账号密码、网络。")
return
print("[3/3] 启动成功!按 q 退出。")
last_results = None
last_ocr_time = 0.0
while True:
ret, frame = cap.read()
if not ret:
print("[提示] 读取帧失败,3 秒后尝试重连...")
cap.release()
time.sleep(3)
cap = open_camera(url)
if cap is None:
print("[错误] 重连失败,继续重试...")
time.sleep(3)
continue
# 按时间间隔做 OCR,其余帧沿用上次结果,保证画面流畅
now = time.time()
if now - last_ocr_time >= RUNTIME["ocr_interval"]:
results = ocr.ocr(frame, cls=True)
last_results = results
last_ocr_time = now
print_results(results)
frame = draw_results(frame, last_results, font)
cv2.imshow(RUNTIME["window_name"], frame)
if cv2.waitKey(1) & 0xFF == ord(RUNTIME["quit_key"]):
break
cap.release()
cv2.destroyAllWindows()
def run_image(ocr, font, image_path):
"""本地图片测试模式:先验证 OCR 是否正常,再连摄像机"""
frame = cv2.imread(image_path)
if frame is None:
print(f"[错误] 无法读取图片: {image_path}")
return
results = ocr.ocr(frame, cls=True)
print_results(results)
frame = draw_results(frame, results, font)
cv2.imshow(RUNTIME["window_name"], frame)
print("按任意键关闭窗口")
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="网络摄像机 + PaddleOCR 汉字识别")
parser.add_argument(
"--source", type=str, default=None,
help="本地图片路径(用于先测试 OCR 是否正常)",
)
args = parser.parse_args()
ocr = init_ocr()
font = load_font()
if args.source:
run_image(ocr, font, args.source)
else:
run_camera(ocr, font)
3.4 运行测试


4 IoTDA中转空间构建
4.0 IoTDA构造



4.1 产品及其模型构建

4.1.1 温湿度计

产品信息:
--产品名称:温湿度计,协议类型:MQTT,数据格式:JSON,所属行业:智能家居,所属子行业:智能家居
--服务列表:
--服务ID:T&H
--属性名称:temperature,数据类型:decimal,访问权限:可读可写,取值范围:-100~100
--属性名称:humidity,数据类型:decimal,访问权限:可读可写,取值范围:0~100
4.1.2 吸顶灯

产品信息:产品名称:智能吸顶灯,协议类型:MQTT,数据格式:JSON,所属行业:智能家居,所属子行业:智能家居
服务列表:
--服务ID:Light
---属性名称:光照强度,数据类型:decimal,访问权限:可读可写,取值范围:0~5000
---属性名称:功率,数据类型:decimal,访问权限:可读可写,取值范围:0~10000
---命令名称:Light
---下发参数名称:turn,数据类型:string,长度:10
---下发参数名称:power,数据类型:string,取值范围:0~10000 --服务ID:Color
---属性名称:crtColor,数据类型:string,长度:10
---命令名称:setColor,数据类型:string,长度:10
4.2 设备实例化应用

4.2.1 温湿度计设备注册及模拟测试



4.2.2 吸顶灯设备注册及模拟测试




5 CodeArts智慧路灯快速构建与部署
5.1 应用项目创建


5.2 代码托管操作


5.3 构建任务设立


5.4 项目构建实现

5.5 项目部署运行



鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐



所有评论(0)