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 项目部署运行

Logo

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

更多推荐