分类 IoT 平台软件 下的文章

目录

在边缘计算视频分析方面,ONVIF 协议实现了摄像头管理,YiEDGE 实现了拉流和图片输出,YiEVAS 模块 Pyairknn 实现推理。

ONVIF 协议

开放型网络视频接口论坛(英语:Open Network Video Interface Forum,简称ONVIF),是一个国际开放型网络视频产品标准网络接口开发论坛.

  • IPC 摄像头必须支持 ONVIF 协议;
  • 实现自动多摄像头并行处理性能要求;
  • ONVIF Device Manager,用这个软件连接摄像头查看。

YiEDGE 边缘计算框架

YiEDGE 框架基于 EdgeX 框架做了深层次定制,实现了更加自动化的功能,增加了南向设备接口协议,增加了北向云平台接口协议。
2023-02-17T14:38:59.png

管理 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 系统

2023-02-17T14:39:36.png

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

推理

  • 可以单独对图片进行推理,通过总线获取图片帧;
  • 也可以在拉流过程中直接推理,具体看业务需要。

结果输出

此处结果与前面的系列文章结果类似,都是以输出到云平台为主。