一次跑通:工业相机 OCR + 昇腾目标检测 + 华为云物联网
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)即可打开路灯控制页面。

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


所有评论(0)