实训报告--具身智能工业视觉分析与物联监护应用演练

拟制__________________________________________________________

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

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐