工业视觉及物联网应用技术实践
实训报告--具身智能工业视觉分析与物联监护应用演练
拟制__________________________________________________________
1 工效组合展示

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



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

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




3 具身智能工业视觉识别快速编码实现
3.1 IMA-DS借力
给出python虚拟环境ocr文字识别的编码及其运行过程,包括文字,windows环境,非conda,使用本机连接的网络摄像头,适应cpu.

3.2 运行环境构造

3.3 编码实现
import os
import time
import argparse
import platform
import cv2
import numpy as np
# ====================== 默认参数 ======================
DEFAULT_CAMERA = 0
DETECT_INTERVAL = 30 # 连续模式:每多少帧识别一次
WINDOW_NAME = 'OCR Webcam (CPU)'
RESULT_DIR = 'results'
CONF_THRESHOLD = 0.25 # 低于此置信度的结果不显示
# =====================================================
def get_backend():
"""按操作系统选择合适的摄像头后端(Windows 用 DSHOW 更稳)。"""
return cv2.CAP_DSHOW if platform.system() == 'Windows' else 0
def build_engine():
"""构建 RapidOCR 引擎(强制 CPU,模型随包安装,无需联网)。"""
from rapidocr_onnxruntime import RapidOCR
print('[INFO] 正在加载 OCR 引擎(模型已随包安装,无需联网下载)...')
t0 = time.time()
engine = RapidOCR(use_cuda=False) # 明确使用 CPU
print(f'[INFO] 引擎加载完成,耗时 {time.time() - t0:.1f}s')
return engine
def ocr_frame(engine, frame):
"""对一帧做 OCR,返回 [(box, text, score), ...]。"""
# RapidOCR 接受 BGR(numpy) 图像,返回 (result, elapse)
result, _ = engine(frame)
# result 为 None 表示未识别到任何文字
return result or []
def draw_results(frame, results):
"""在画面上绘制识别到的文字框与文本。"""
for (box, text, prob) in results:
if prob < CONF_THRESHOLD:
continue
pts = np.array(box, dtype=np.int32)
cv2.polylines(frame, [pts], isClosed=True, color=(0, 200, 0), thickness=2)
x = int(min(p[0] for p in box))
y = int(min(p[1] for p in box))
label = f'{text} ({prob:.2f})'
cv2.putText(frame, label, (x, max(y - 6, 12)),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 200, 0), 2, cv2.LINE_AA)
return frame
def print_results(results):
for i, (_, text, prob) in enumerate(results, 1):
print(f' [{i}] {text} (置信度 {prob:.4f})')
def save_result(frame, results, tag):
"""把当前帧与识别文本保存到 results 目录。"""
os.makedirs(RESULT_DIR, exist_ok=True)
ts = time.strftime('%Y%m%d_%H%M%S')
img_path = os.path.join(RESULT_DIR, f'{tag}_{ts}.jpg')
txt_path = os.path.join(RESULT_DIR, f'{tag}_{ts}.txt')
cv2.imwrite(img_path, frame)
with open(txt_path, 'w', encoding='utf-8') as f:
for (_, text, prob) in results:
f.write(f'{text}\t{prob:.4f}\n')
print(f'[SAVE] 图片: {img_path}')
print(f'[SAVE] 文本: {txt_path}')
def run_image_mode(engine, image_path, no_window):
"""图片模式:读取图片 -> OCR -> 打印/保存。可在任意终端运行。"""
frame = cv2.imread(image_path)
if frame is None:
print(f'[ERROR] 无法读取图片:{image_path}')
return
print(f'[OCR] 正在识别图片:{image_path}')
t0 = time.time()
results = ocr_frame(engine, frame)
print(f'[OCR] 识别完成,共 {len(results)} 项,耗时 {time.time() - t0:.2f}s')
print_results(results)
frame = draw_results(frame, results)
save_result(frame, results, 'image')
if not no_window:
try:
cv2.imshow('OCR Result', frame)
print('[INFO] 按任意键关闭窗口...')
cv2.waitKey(0)
cv2.destroyAllWindows()
except cv2.error:
print('[INFO] 当前环境无图形界面,已跳过弹窗显示。')
def run_camera_mode(engine, camera_index):
"""摄像头模式:实时预览 + 实时/手动 OCR。"""
print('[INFO] 正在打开摄像头 ...')
cap = cv2.VideoCapture(camera_index, get_backend())
if not cap.isOpened():
print(f'[ERROR] 无法打开摄像头(编号 {camera_index})。'
f'请检查连接/占用,或修改 --camera 参数。')
return
frame_count = 0
last_results = []
continuous_mode = False
print('\n操作说明:空格=识别当前帧 | C=连续识别开关 | S=保存 | Q=退出\n')
try:
while True:
ret, frame = cap.read()
if not ret:
print('[WARN] 读取摄像头帧失败,请检查设备连接。')
break
frame_count += 1
display = frame.copy()
if continuous_mode and frame_count % DETECT_INTERVAL == 0:
t0 = time.time()
last_results = ocr_frame(engine, frame)
print(f'[OCR] 第 {frame_count} 帧识别完成,'
f'共 {len(last_results)} 项,耗时 {time.time() - t0:.2f}s')
if last_results:
save_result(frame, last_results, f'cam_{frame_count}')
display = draw_results(display, last_results)
status = '连续模式:开' if continuous_mode else '连续模式:关'
cv2.putText(display, status, (10, 25),
cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 0, 0), 2, cv2.LINE_AA)
try:
cv2.imshow(WINDOW_NAME, display)
except cv2.error:
# 无图形界面时退化为纯终端模式
key = input('输入 s 保存 / q 退出(其余跳过):').strip().lower()
if key == 'q':
break
if key == 's' and last_results:
save_result(frame, last_results, f'cam_{frame_count}')
continue
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
elif key == ord(' '):
t0 = time.time()
last_results = ocr_frame(engine, frame)
print(f'[OCR] 手动识别完成,共 {len(last_results)} 项,'
f'耗时 {time.time() - t0:.2f}s')
print_results(last_results)
elif key in (ord('c'), ord('C')):
continuous_mode = not continuous_mode
print(f'[INFO] 连续识别模式 -> {"开启" if continuous_mode else "关闭"}')
elif key in (ord('s'), ord('S')):
if last_results:
save_result(frame, last_results, f'cam_{frame_count}')
else:
print('[INFO] 暂无可保存结果,请先按空格识别一次。')
finally:
cap.release()
cv2.destroyAllWindows()
print('[INFO] 程序已退出。')
def main():
parser = argparse.ArgumentParser(
description='本机摄像头/图片 OCR 文字识别(CPU 版,RapidOCR)')
parser.add_argument('--image', help='对指定图片做 OCR(无摄像头也能跑)')
parser.add_argument('--camera', type=int, default=DEFAULT_CAMERA,
help='摄像头编号,默认 0')
parser.add_argument('--no-window', action='store_true',
help='无图形界面模式(仅打印/保存结果)')
args = parser.parse_args()
engine = build_engine()
if args.image:
run_image_mode(engine, args.image, args.no_window)
else:
run_camera_mode(engine, args.camera)
if __name__ == '__main__':
main()
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 ,数据类型:decimal,取值范围: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)