1 工效组合展示

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

2.1 工具软件安装

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

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

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

3.1 IMA-DS借力

给出PYTHON虚拟环境OCR文字识别的编码及其运行过程,包括汉字,WINDPWS环境,非COnDA,使用本机连接的网络摄像机。

3.2 运行环境构造

3.3 编码实现

import numpy as np

import cv2, easyocr, time, sys

# ========== 配置区域 ==========

# 海康USB摄像头索引(根据实际情况调整)

# 0 = 内置摄像头,1 = 第一个外接USB摄像头,以此类推

CAMERA_INDEX = 1 

# OCR 配置

OCR_LANG = ['ch_sim', 'en'] # 简体中文 + 英文

OCR_INTERVAL = 2.0 # 识别间隔(秒),CPU模式建议≥2秒保证性能

CONFIDENCE_THRESHOLD = 0.5 # 置信度阈值

# 显示配置

WINDOW_NAME = "Hikvision USB Camera OCR (CPU Mode)"

BOX_COLOR = (0, 255, 0) # 绿色检测框

TEXT_COLOR = (0, 255, 0) # 绿色文字

BG_COLOR = (0, 0, 0) # 文字背景黑色

FONT_SCALE = 0.6

THICKNESS = 2

# =============================

def find_hik_camera(max_index=10): # 动寻找海康USB摄像头索引,返回首个或None

print("正在扫描USB摄像头...")

for i in range(max_index):

cap = cv2.VideoCapture(i, cv2.CAP_DSHOW) # Windows下使用DSHOW优化

if cap.isOpened():

# 读取一帧确认可用

ret, frame = cap.read()

if ret and frame is not None:

height, width = frame.shape[:2]

print(f" [索引 {i}] 可用 - 分辨率: {width}x{height}")

cap.release()

return i

cap.release()

return None

def preprocess_frame(frame): # 图像预处理:提升OCR识别率,CPU模式,识别前轻量级优化

# 转为灰度图

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

# 自适应直方图均衡化(CLAHE)

clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))

enhanced = clahe.apply(gray)

# 轻微降噪

denoised = cv2.fastNlMeansDenoising(enhanced, h=10)

# 返回3通道图像(EasyOCR需要)

return cv2.cvtColor(denoised, cv2.COLOR_GRAY2BGR)

def main():

print(f"正在初始化 EasyOCR[CPU模式],首次运行会下载模型...")

print("模型下载约100-200MB,请保持网络畅通") 

# 初始化 OCR Reader(CPU模式)

reader = easyocr.Reader( OCR_LANG, 

gpu=False, # 显式指定CPU模式

model_storage_directory=None, # 使用默认模型路径

download_enabled=True # 允许自动下载模型

)

print("✅ OCR引擎初始化完成![12](@ref)")

# 1. 自动扫描海康USB摄像头

cam_index = find_hik_camera()

if cam_index is None:

print("❌ 未找到任何USB摄像头")

print(" 请检查:")

print(" 1. 摄像头USB连接是否正常")

print(" 2. 设备管理器中是否识别为图像设备")

sys.exit(1) 

print(f"✅ 海康USB摄像头已找到,使用索引: {cam_index}")

# 2. 打开摄像头(使用CAP_DSHOW减少延迟[3]

cap = cv2.VideoCapture(cam_index, cv2.CAP_DSHOW)

if not cap.isOpened():

print(f"❌ 无法打开摄像头索引 {cam_index}")

sys.exit(1)

# 3. 尝试设置分辨率(根据实际摄像头支持情况调整)

cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)

cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)

cap.set(cv2.CAP_PROP_FPS, 30)

# 获取实际分辨率

actual_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))

actual_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

actual_fps = cap.get(cv2.CAP_PROP_FPS)

print(f"�� 相机分辨率: {actual_width}x{actual_height} | 帧率: {actual_fps:.1f}fps[3]")

# 4. 创建显示窗口

cv2.namedWindow(WINDOW_NAME, cv2.WINDOW_NORMAL)

cv2.resizeWindow(WINDOW_NAME, 640, 480)

print("�� 开始实时识别...")

print("操作提示:")

print(" 'q' - 退出程序")

print(" 's' - 保存当前帧")

print(" 'p' - 暂停/继续识别")

print(" 'd' - 显示调试信息") 

last_ocr_time = 0; frame_count = 0; paused = False; show_debug = False

try:

while True:

# 读取帧

ret, frame = cap.read()

if not ret:

print("⚠️ 无法读取帧,重试中...")

time.sleep(1)

continue

current_time = time.time()

frame_count += 1

# 准备显示图像

display_frame = frame.copy()

# 如果未暂停且到达识别间隔

if not paused and (current_time - last_ocr_time) >= OCR_INTERVAL:

# 预处理:提升文字清晰度

processed_frame = preprocess_frame(frame) 

# 执行OCR识别(传入预处理后的图像)

results = reader.readtext(processed_frame) 

# 绘制识别结果

for (bbox, text, confidence) in results:

if confidence < CONFIDENCE_THRESHOLD:

continue 

# 提取边界框坐标

points = np.array(bbox, dtype=np.int32)

top_left = tuple(points); bottom_right = tuple(points[2]) 

# 绘制矩形框

cv2.rectangle(display_frame, top_left, bottom_right, BOX_COLOR, THICKNESS) 

# 准备显示文字

label = f"{text} ({confidence:.2f})" 

# 获取文字大小

(text_width, text_height), _ = cv2.getTextSize(

label, cv2.FONT_HERSHEY_SIMPLEX, FONT_SCALE, THICKNESS ) 

# 绘制文字背景

cv2.rectangle( display_frame,(top_left[0], top_left[1] - text_height - 10),

(top_left[0] + text_width, top_left[1]), BG_COLOR, -1 ) 

# 绘制文字

cv2.putText( display_frame, label, (top_left[0], top_left[1] - 5),

cv2.FONT_HERSHEY_SIMPLEX, FONT_SCALE, TEXT_COLOR, THICKNESS ) 

# 控制台输出

print(f"[帧 {frame_count}] 识别: '{text}' | 置信度: {confidence:.3f}") 

last_ocr_time = current_time

# 显示调试信息

if show_debug:

fps = 1.0 / (current_time - last_ocr_time + 0.001) if current_time > last_ocr_time else 0

info_lines = [ f"帧数: {frame_count}", f"帧率: {actual_fps:.1f}",

f"OCR间隔: {OCR_INTERVAL}s", f"状态: {'暂停' if paused else '运行中'}", ]

y_offset = 30

for line in info_lines:

cv2.putText( display_frame, line, (10, y_offset),

cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1 )

y_offset += 25

# 显示状态指示

status_text = "⏸️ PAUSED" if paused else "▶️ RECOGNIZING"

cv2.putText( display_frame, status_text, (actual_width - 200, 30),

cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 255) if paused else (0, 255, 0), 2 )

# 显示图像

cv2.imshow(WINDOW_NAME, display_frame)

# 按键处理

key = cv2.waitKey(1) & 0xFF

if key == ord('q'):

print("�� 用户退出")

break

elif key == ord('s'):

timestamp = time.strftime("%Y%m%d_%H%M%S")

filename = f"ocr_capture_{timestamp}.jpg"

cv2.imwrite(filename, display_frame)

print(f"�� 已保存: {filename}")

elif key == ord('p'):

paused = not paused

print(f"{'⏸️ 暂停识别' if paused else '▶️ 继续识别'}")

elif key == ord('d'):

show_debug = not show_debug

print(f"{'�� 显示调试信息' if show_debug else '�� 隐藏调试信息'}")

except KeyboardInterrupt:

print("\n⛔ 用户中断") 

finally:

# 资源释放

cap.release(); cv2.destroyAllWindows(); print("✅ 程序结束,资源已释放")

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

- 属性名称:当前颜色

- 数据类型:string

- 长度:10

- 命令名称:设置颜色

- 下发参数名称:color

- 数据类型:string

- 长度:10

根据以上“智能吸顶灯”信息,参考“温湿度计”产品创建的方式,完成“智能吸顶灯”产品的创建,其中命令 在命令列表中创建,创建方式和属性类似。 智能吸顶灯产品创建完成如下:

4.2 设备实例化应用

4.2.1 温湿度计设备注册及模拟测试

打开浏览器,访问如下链接下载MQTT设备模拟器zip包。

https://obs-pipeline.obs.cn-north-4.myhuaweicloud.com/sdkDeploy/simulator/MQTT_Simulator.zip

解压已下载的MQTT_Simulator.zip 包。进入解压后的目录,双击device_demo_mqttnet.exe 运行MQTT设备模拟器。

填写对接参数后,单击“Connect”按钮:

- SSL Connection:勾选则使用8883端口,不勾选则使用1883端口;

- Server Address:设备接入服务实例的设备侧MQTT(S)接入地址;

- Device ID:填写注册设备成功后生成的设备ID;

- Device Secret:填写注册设备时使用的设备秘钥

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

JSON 消息如下所示,需要输入属性名、属性值和服务ID:

{"services":[{"properties":{"temperature":23,"humidity":35},"service_id":"T&H","event_time":null}]}

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

5.1 应用项目创建

5.2 代码托管操作

5.3 构建任务设立

5.4 项目构建实现

5.5 项目部署运行

Logo

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

更多推荐