1 工效组合展示

组合展示:工业相机取流OCR、昇腾目标检测与IoTDA设备监控等全流程成果联调展示。

2 具身智能工业视觉获取与分析应用

2.1 工具软件安装

安装MobaXterm、FSCapture、海康MVS等工具软件。

在设备管理器中确认USB3 Vision工业相机驱动已正常识别。

为与相机直连的以太网卡手动配置同网段IP(192.168.137.101)。

使用昇腾一键制卡工具选择镜像并将系统烧录至Atlas 200I DK A2的SD卡。

【补充步骤】将烧制完成的SD卡插入Atlas 200I DK A2开发板并上电启动。

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

打开MVS客户端,枚举并连接GigE/USB接口的工业相机。

在MobaXterm中新建SSH会话,以root登录Atlas开发板(192.168.137.100)。

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

SSH成功登录Atlas 200I DK A2,进入昇腾开发环境。

在开发板上启动JupyterLab并获取带token的访问链接。

运行昇腾目标检测样例,摄像头画面实时框出person、tv等目标并显示置信度。

3 具身智能工业视觉识别快速编码实现

3.1 IMA-DS借力

给出PYTHON虚拟环境OCR文字识别的编程及其运行过程,包括汉字,WINDOWS环境,非COnDA,使用本机连接的网络摄像机,注意我的计算机没有独立GPU

借助AI助手生成Python虚拟环境OCR方案的技术选型说明(venv+OpenCV+RapidOCR)。

3.2 运行环境构造

cd dtctOCR

:: 1. 进入项目目录

D:

:: 2. 激活虚拟环境

venv\Scripts\activate

【补充步骤】若虚拟环境尚未创建,需先执行 python -m venv venv 创建虚拟环境。

:: 3. 安装依赖(国内镜像加速)

python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

:: 4. 运行实时识别

python ocr_hikvision_industrial.py

3.3 编码实现

# -*- coding: utf-8 -*-
import sys
import threading
from ctypes import *

import cv2
import numpy as np
from rapidocr_onnxruntime import RapidOCR

# MVS 的 Python 接口目录(你的真实路径)
MVS_PATH = r"C:\Program Files (x86)\MVS\Development\Samples\Python\MvImport"
USE_GET_IMAGE_BUFFER = True
DETECT_EVERY_N = 5
OCR_SCALE = 0.5

sys.path.append(MVS_PATH)
from MvCameraControl_class import *
from PixelType_const import *
from PixelType_header import *

g_bExit = False
ocr = None
last_result = None


def init_ocr():
    global ocr
    print("正在加载 OCR 模型(模型已内置,无需联网下载)...")
    =   ("OCR 模型加载完成")


def frame_to_bgr(stFrameInfo):
    st = stFrameInfo.stFrameInfo
    nWidth, nHeight = st.nWidth, st.nHeight
    enPixelType = st.enPixelType
    nFrameLen = st.nFrameLen
    buf = string_at(stFrameInfo.pBufAddr, nFrameLen)
    raw = np.frombuffer(buf, dtype=np.uint8)
    if enPixelType == PixelType_Gvsp_Mono8:
        return cv2.cvtColor(raw.reshape(nHeight, nWidth), cv2.COLOR_GRAY2BGR)
    elif enPixelType == PixelType_Gvsp_BayerRG8:
        return cv2.cvtColor(raw.reshape(nHeight, nWidth), cv2.COLOR_BayerRG2BGR)
    elif enPixelType == PixelType_Gvsp_BayerGB8:
        return cv2.cvtColor(raw.reshape(nHeight, nWidth), cv2.COLOR_BayerGB2BGR)
    elif enPixel == PixelType_Gvsp_BayerGR8:
        return cv2.cvtColor(raw.reshape(nHeight, nWidth), cv2.COLOR_BayerGR2BGR)
    elif enPixelType == PixelType_Gvsp_BayerBG8:
        return cv2.cvtColor(raw.reshape(nHeight, nWidth), cv2.COLOR_BayerBG2BGR)
    elif enPixelType == PixelType_Gvsp_RGB8_Packed:
        return cv2.cvtColor(raw.reshape(nHeight, nWidth, 3), cv2.COLOR_RGB2BGR)
    elif enPixelType == PixelType_Gvsp_BGR8_Packed:
        return raw.reshape(nHeight, nWidth, 3).copy()
    else:
        print("未处理的像素格式:", hex(enPixelType))
        return None


def do_ocr(frame):
 last, = frame.shape[:2]
    small = cv2.resize(frame, (int(w * OCR_SCALE), int(h * OCR_SCALE)))
    result, _ = ocr(small)
    if not result:
        return
    back = 1.0 / OCR_SCALE
    restored = []
    for box, text, score in result:
        new_box = [[p[0] * back, p[1] * back] for p in box]
        restored.append([new_box, text, score])
        print(f"{text}  ({score:.2f})")
    last_result = restored


def work_thread(cam):
    global g_bExit
    stFrameInfo = MV_FRAME_OUT()
    memset(byref(stFrameInfo), 0, sizeof(stFrameInfo))
    frame_count = 0
    while not g_bExit:
        if USE_GET_IMAGE_BUFFER:
            ret = cam.MV_CC_GetImageBuffer(stFrameInfo, 1000)
        else:
            ret = cam.MV_CC_GetOneFrameTimeout(byref(stFrameInfo), 1000)
        if ret == 0 and stFrameInfo.pBufAddr:
            frame = frame_to_bgr(stFrameInfo)
            if frame is not None:
                frame_count += 1
                if frame_count % DETECT_EVERY_N == 0:
                    do_ocr(frame)
                if last_result:
                    for box, text, score in last_result:
                        pts = np.array(box, dtype=np.int32)
                        cv2.polylines(frame, [pts], True, (0, 255, 0), 2)
                cv2.imshow("OCR - Hikvision Industrial Camera", frame)
            cam.MV_CC_FreeImageBuffer(stFrameInfo)
        else:
            print("取图失败 ret =", ret)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break


def main():
    global g_bExit
    init_ocr()
    deviceList = MV_CC_DEVICE_INFO_LIST()
    ret = MvCamera.MV_CC_EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE, deviceList)
    if ret != 0 or deviceList.nDeviceNum == 0:
        print("未找到相机:请确认已连接,并已关闭海康 MVS 客户端")
        return
    print(f"发现 {deviceList.nDeviceNum} 台相机,连接第一台 ...")
    stDeviceList = cast(deviceList.pDeviceInfo[0], POINTER(MV_CC_DEVICE_INFO)).contents
    cam = MvCamera()
    if cam.MV_CC_CreateHandle(stDeviceList) != 0:
        print("创建句柄失败"); return
    if cam.MV_CC_OpenDevice(MV_ACCESS_Exclusive, 0) != 0:
        print("打开设备失败(相机可能被 MVS 客户端占用,请先关闭 MVS)"); return
    if cam.MV_CC_StartGrabbing() != 0:
        print("开始取流失败"); return
    print("取流成功,按 q 退出")
    t = threading.Thread(target=work_thread, args=(cam,))
    t.start(); t.join()
    g_bExit = True
    cam.MV_CC_StopGrabbing()
    cam.MV_CC_CloseDevice()
    cam.MV_CC_DestroyHandle()
    cv2.destroyAllWindows()
    print("已退出")


if __name__ == "__main__":
    main()

3.4 运行测试

运行OCR程序,USB摄像头识别中文“扬天”并在控制台输出识别结果与置信度。

对工业相机采集的产品标签画面进行OCR,逐行识别特性参数并输出置信度。

4 IoTDA中转空间构建

4.0 IoTDA构造

在华为云“我的凭证”页面查看IAM用户与项目信息,为访问IoTDA做准备。

【补充步骤】进入IoTDA控制台,开通并选择标准版实例,记录设备接入域名。

4.1 产品及其模型构建

4.1.1 温湿度计

创建“温湿度计”产品并定义T&H服务的temperature、humidity属性。

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

4.1.2 吸顶灯

创建“智能吸顶灯”产品并定义Light/Color服务及turn_power命令。

产品信息:产品名称:智能吸顶灯,协议类型: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 温湿度计设备注册及模拟测试

注册温湿度计设备并确认其在线,物模型数据显示温度23、湿度35。

在MQTT.fx中配置Broker地址、端口8883及设备连接参数。

【补充步骤】使用华为云MQTT建连参数生成工具,依据设备ID与密钥生成ClientID、用户名和密码。

通过MQTT.fx向属性上报Topic发布temperature、humidity模拟数据。

在IoTDA消息跟踪中确认设备属性上报成功。

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

注册吸顶灯设备并确认在线,物模型显示intensity、POWERRate、Color属性值。

用建连参数生成工具生成ClientID并配置吸顶灯的MQTT.fx连接参数。

发布Light服务的intensity、POWERRate属性模拟数据。

发布Color服务的“white”颜色属性模拟数据。

消息跟踪显示吸顶灯鉴权与属性上报全部成功。

在在线调试中以命令下发方式下发Light命令(turn=1500、power=30)。

【补充步骤】设备侧需订阅命令下发Topic($oc/devices/{设备ID}/sys/commands/#)方可接收命令。

5 CodeArts智慧路灯快速构建与部署

5.1 应用项目创建

按模板创建项目,选择IoT_Streetlight_Demo智慧路灯Demo模板。

5.2 代码托管操作

模板自动创建代码仓库myIotSmartLight并完成代码托管。

进入编译构建页面,准备新建构建任务。

5.3 构建任务设立

新建构建任务并选择Maven构建模板。

配置Maven构建步骤、工具版本及打包命令。

执行构建任务,各构建步骤全部成功完成。

5.4 项目构建实现

构建日志显示Maven构建及jar包上传软件发布库均成功。

安装java,并在高级系统设置中部署环境变量

在cmd执行java -version验证JDK安装成功。

【补充步骤】先在“高级系统设置→环境变量”中新建JAVA_HOME并将%JAVA_HOME%\bin加入Path。

从构建产物中下载huawei-0.0.1-SNAPSHOT.jar。

5.5 项目部署运行

用java -jar命令本地运行Spring Boot路灯应用。

【补充步骤】在浏览器访问应用地址(如 http://localhost:8080)即可打开路灯控制页面。

浏览器打开路灯应用页面,可远程控制灯开关并查看环境亮度。

Logo

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

更多推荐