技术|ONVIF 摄像头视频读取,YiEDGE 拉流,RV1126 实现推理
目录
在边缘计算视频分析方面,
ONVIF
协议实现了摄像头管理,YiEDGE
实现了拉流和图片输出,YiEVAS
模块 Pyairknn 实现推理。
ONVIF 协议
开放型网络视频接口论坛(英语:Open Network Video Interface Forum,简称ONVIF),是一个国际开放型网络视频产品标准网络接口开发论坛.
- IPC 摄像头必须支持 ONVIF 协议;
- 实现自动多摄像头并行处理性能要求;
- ONVIF Device Manager,用这个软件连接摄像头查看。
YiEDGE 边缘计算框架
YiEDGE 框架基于 EdgeX 框架做了深层次定制,实现了更加自动化的功能,增加了南向设备接口协议,增加了北向云平台接口协议。
管理 ONVIF 摄像头
- 采用 device onvif camera 设备层协议,对接各种支持 ONVIF 的摄像头设备;
- 定期探测网络中的 IPC;
- 轮训摄像头状态,获取 streamuri 地址;
创建被管理摄像头
这里以 HK 摄像头为例,
10s
轮训一次。
{
"apiVersion": "v2",
"statusCode": 200,
"device": {
"created": 1676646639846,
"modified": 1676646710817,
"id": "9a9a3276-cf19-4e01-908c-801a520ba5be",
"name": "IPC-HK",
"adminState": "UNLOCKED",
"operatingState": "UP",
"labels": [
""
],
"serviceName": "device-onvif-camera",
"profileName": "onvif-camera",
"autoEvents": [
{
"interval": "10s",
"onChange": false,
"sourceName": "StreamUri"
}
],
"protocols": {
"Onvif": {
"Address": "192.168.123.183",
"DeviceStatus": "UpWithAuth",
"FirmwareVersion": "V5.7.3 build 220315",
"FriendlyName": "HIKVISION DS-IPC-T12HV3-IA",
"HardwareId": "88",
"LastSeen": "Fri Feb 17 15:11:50 UTC 2023",
"MACAddress": "c0:6d:ed:eb:cb:59",
"Manufacturer": "HIKVISION",
"Model": "DS-IPC-T12HV3-IA",
"Port": "80",
"SerialNumber": "DS-IPC-T12HV3-IA20220913AACHK56293791"
}
}
}
}
streamUri 信息内容
[
{
"id": "c88007b8-4316-451c-87b4-2dec7f1f540d",
"origin": 1676646870752047000,
"deviceName": "IPC-HK",
"resourceName": "StreamUri",
"profileName": "onvif-camera",
"valueType": "Object",
"value": "",
"objectValue": {
"MediaUri": {
"InvalidAfterConnect": false,
"InvalidAfterReboot": false,
"Timeout": "PT60S",
"Uri": "rtsp://192.168.123.183:554/Streaming/Channels/0?transportmode=unicast&profile=Profile_1"
}
}
}
]
同步到 Message Bus
- 以上信息都会同步到数据总线;
- 可以自定义轮训时间;
- 筛选需要通告总线的 IPC;
YiEVAS 系统
eKuiper 作为 pipeline 引擎
大概模式如下:
|source输入->|rule规则引擎->|sink输出->|
|:----|:----|:----|
|onvif 通告获取|拉流,抓帧,推理|结果输出|
ONVIF 通告获取
stream
这里,直接用 EdgeX 数据总线即可。
{
"Name" : "EdgeXStream",
"Options" : {
"format" : "json",
"type" : "edgex"
},
"Statement" : null,
"StreamFields" : null,
"StreamType" : 0
}
rule-onvif-camera
从 stream 获取信息,并解析 StreamUri 通告给拉流处理。
SELECT
"true" as isRetImg,
(json_path_query(StreamUri, "$")->MediaUri)->Uri AS rtspUrl,
meta(deviceName) as deviceName
FROM EdgeXStream
where meta(profileName) = "onvif-camera"
StreamUri 解析结果
{
"deviceName": "IPC-HK",
"isRetImg": "true",
"rtspUrl": "rtsp://192.168.123.183:554/Streaming/Channels/0?transportmode=unicast&profile=Profile_1"
}
拉流,抓帧,推理
拉流
- 通过 eKuiper video plugin:目前这个方式只能固定将 URI 写入配置文件,测试可以用,实际没有使用价值。
- 通过 YiEVAS application 实现:此处为商业代码和功能,有需要的可以咨询我们的热线: 18616669123
抓帧
- 可以通过图片帧,输出到 总线或 mqtt broker,进行按图片推理,也方便其他应用进行二次处理;
- 还可以直接拉流时对图片帧进行推理,效率很高,不经过总线的方式进行转发,前提是其他应用不需要视频流和图片;
def get_frame(self):
cap = cv2.VideoCapture(rtspUri)
ret, frame = cap.read()
if ret:
image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
outputs = rknn_lite.inference(inputs=[image])
return outputs
else:
return None
推理
- 可以单独对图片进行推理,通过总线获取图片帧;
- 也可以在拉流过程中直接推理,具体看业务需要。
结果输出
此处结果与前面的系列文章结果类似,都是以输出到云平台为主。