工业视觉识别与华为云loT、CodeArts综合实训报告
·
1 工效组合展示

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




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

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





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

3.2 运行环境构造
python -m venv venv ← 建一个"独立房间"(虚拟环境)
venv\Scripts\activate.bat ← "进房间"(激活)
pip install --upgrade pip ← 升级"下载工具"
pip install -r requirements.txt ← 按清单一次性"买齐工具"
3.3 编码实现

Run文件夹内容
@echo off
setlocal
chcp 65001 >nul
set PYTHONIOENCODING=utf-8
REM === Camera source ===
REM USB webcam : use 0 (first camera). If it opens the wrong camera (e.g. laptop built-in), try 1 or 2.
REM IP camera : use full RTSP URL, e.g. rtsp://admin:pass@192.168.1.64:554/Streaming/Channels/101
set CAMERA=0
call venv\Scripts\activate.bat
python ocr_camera.py --url "%CAMERA%"
Pause
ocr_camera文件夹内容
import argparse
import datetime
import os
import sys
import time
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
# 让 Windows 控制台正确显示中文
try:
sys.stdout.reconfigure(encoding="utf-8")
except Exception:
pass
# ------------------- 字体 -------------------
def load_chinese_font(size: int = 20):
"""加载 Windows 系统中文字体,用于在图像上绘制中文"""
candidates = [
"C:/Windows/Fonts/msyh.ttc", # 微软雅黑
"C:/Windows/Fonts/simhei.ttf", # 黑体
"C:/Windows/Fonts/simsun.ttc", # 宋体
"C:/Windows/Fonts/Deng.ttf", # 等线
]
for path in candidates:
if os.path.exists(path):
try:
return ImageFont.truetype(path, size)
except Exception:
continue
try:
return ImageFont.load_default(size)
except TypeError:
return ImageFont.load_default()
# ------------------- 绘制 -------------------
def draw_ocr_results(frame, results, font):
"""在视频帧上绘制 OCR 检测框与文字(支持中文)"""
rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
pil = Image.fromarray(rgb)
draw = ImageDraw.Draw(pil)
for box, (text, score) in results:
pts = [(int(float(p[0])), int(float(p[1]))) for p in box]
draw.polygon(pts, outline=(0, 255, 0), width=2)
label = f"{text} {score:.2f}"
x, y = pts[0]
y = max(0, y - 24)
bbox = draw.textbbox((x, y), label, font=font)
draw.rectangle(bbox, fill=(0, 0, 0))
draw.text((x, y), label, font=font, fill=(0, 255, 0))
return cv2.cvtColor(np.array(pil), cv2.COLOR_RGB2BGR)
# ------------------- OCR 结果解析 -------------------
def parse_ocr_result(raw):
"""解析 PaddleOCR 2.x 的返回结果,统一成 [(box, (text, score)), ...]"""
lines = []
if not raw:
return lines
# raw 通常是 [ [ [box], (text, score) ], ... ] 或 [[...]]
data = raw[0] if isinstance(raw, list) and raw else raw
for item in data:
if not isinstance(item, (list, tuple)) or len(item) < 2:
continue
box = item[0]
info = item[1]
if isinstance(info, (list, tuple)) and len(info) >= 2:
text, score = info[0], info[1]
else:
text, score = str(info), 1.0
lines.append([box, (str(text), float(score))])
return lines
# ------------------- 摄像机 -------------------
def open_camera(url: str):
"""打开摄像机。纯数字=USB摄像头索引,rtsp=网络摄像机"""
if str(url).strip().isdigit():
# USB 摄像头,用索引打开(0 表示第一个摄像头)
return cv2.VideoCapture(int(url), cv2.CAP_ANY)
backend = cv2.CAP_FFMPEG if str(url).lower().startswith("rtsp") else cv2.CAP_ANY
cap = cv2.VideoCapture(url, backend)
if str(url).lower().startswith("rtsp"):
cap.set(cv2.CAP_PROP_BUFFERSIZE, 1) # 减小缓冲,降低延迟
return cap
def connect_camera(url: str):
"""循环尝试连接摄像机,直到成功"""
cap = open_camera(url)
while not cap.isOpened():
print("[提示] 无法连接摄像机,3 秒后重试……(请检查 RTSP 地址 / 网络 / 用户名密码)")
time.sleep(3)
cap = open_camera(url)
print("[提示] 摄像机连接成功")
return cap
# ------------------- 主流程 -------------------
def main():
parser = argparse.ArgumentParser(description="网络摄像机中文 OCR 识别")
parser.add_argument("--url", required=True,
help="RTSP 地址,如 rtsp://admin:密码@192.168.1.64:554/Streaming/Channels/101;"
"本机 USB 摄像头填 0")
parser.add_argument("--lang", default="ch", help="OCR 语言:ch=中文,en=英文(默认 ch)")
parser.add_argument("--interval", type=int, default=1,
help="每隔 N 帧做一次 OCR,N 越大越流畅但识别越不连续(默认 1)")
parser.add_argument("--save", default="", help="截图保存目录(可选),按 s 键保存当前帧")
parser.add_argument("--test", action="store_true", help="仅测试摄像机连接与画面,不做 OCR")
args = parser.parse_args()
# 初始化 OCR
ocr = None
if not args.test:
print("[提示] 正在初始化 PaddleOCR(首次运行会自动下载模型,请保持联网)……")
from paddleocr import PaddleOCR
ocr = PaddleOCR(use_angle_cls=True, lang=args.lang, show_log=False)
print("[提示] PaddleOCR 初始化完成")
font = load_chinese_font(20)
if args.save and not os.path.exists(args.save):
os.makedirs(args.save)
cap = connect_camera(args.url)
print("[提示] 已开始识别。按 q 退出;按 s 保存当前帧到截图目录")
frame_no = 0
while True:
ok, frame = cap.read()
if not ok:
print("[提示] 视频流中断,尝试重连……")
cap.release()
time.sleep(2)
cap = connect_camera(args.url)
continue
frame_no += 1
if ocr is not None and frame_no % max(1, args.interval) == 0:
try:
raw = ocr.ocr(frame, cls=True)
results = parse_ocr_result(raw)
if results:
frame = draw_ocr_results(frame, results, font)
for _, (text, score) in results:
print(f"[{score:.2f}] {text}")
except Exception as e:
print("[错误] OCR 处理失败:", e)
cv2.imshow("OCR - 按 q 退出", frame)
key = cv2.waitKey(1) & 0xFF
if key == ord("q") or key == 27: # q 或 ESC
break
if key == ord("s") and args.save:
name = os.path.join(
args.save,
datetime.datetime.now().strftime("ocr_%Y%m%d_%H%M%S_%f.jpg"),
)
cv2.imwrite(name, frame)
print("[提示] 已保存截图:", name)
cap.release()
cv2.destroyAllWindows()
print("[提示] 程序已退出")
if __name__ == "__main__":
main()
3.4 运行测试

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

4.1 产品及其模型构建
4.1.1 温湿度计

4.1.2 吸顶灯

4.2 设备实例化应用
4.2.1 温湿度计设备注册及模拟测试



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


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


5.2 代码托管操作

5.3 构建任务设立




5.4 项目构建实现

5.5 项目部署运行

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)