通过订阅frigate/events
实现人员跟踪,通过追踪人员从某个区域进入或离开,实现人员统计。下面是一个订阅到的状态发布信息,
{
"before": {
"id": "1735738278.928413-miar90",
...
# befor是人员上次状态,after是人员最后一次更新的状态,key都是一样的
},
"after": {
# 追踪人员id,随机生成,当type为end后消失,人员再次出现会以新的id命名
"id": "1735738278.928413-miar90",
"camera": "camera_1",
"frame_time": 1735738283.75554,
"snapshot": {
"frame_time": 1735738281.725868,
"box": [
1201,
186,
1419,
793
],
"area": 132326,
"region": [
748,
130,
1620,
1002
],
"score": 0.97265625,
"attributes": []
},
"label": "person",
"sub_label": null,
"top_score": 0.934326171875,
"false_positive": false,
"start_time": 1735738278.928413,
"end_time": 1735738287.708307,
"score": 0.71435546875,
# 人员位置坐标标记,可能是人员检测方框的对角线
"box": [
1523,
84,
1676,
596
],
"area": 78336,
"ratio": 0.298828125,
"region": [
1253,
33,
1909,
689
],
"stationary": false,
"motionless_count": 1,
"position_changes": 1,
# 所追踪的人员当前所在区域,区域是自己frigate中画好的,实际调试过程中current_zones可能为空。
"current_zones": [],
# 所追踪的人员进入过的区域。
"entered_zones": [
"xuanguan"
],
"has_clip": true,
"has_snapshot": false,
"attributes": {},
"current_attributes": []
},
# 标志位,有new(所追踪的人员第一次出现)、end(所追踪的人员最后一次出现)、update(更新追踪人员位置)三类
"type": "new"
}
统计人员进出大致有两个想法
- 通过标志位type(new或end)来判断人员进出。比如摄像头部署在客厅,我在画面中定义了
xuanguan
和ciwo
两个区域,当events发布来的信息type是new,进入的区域有xuanguan
,则认定是有人从外面回到家里了;当events发布来的信息type是end,进入的区域是ciwo
,则可以认定是有人从客厅进入了次卧;至于type是update时,直接丢弃,因为被追踪的人员还在移动。
- 通过追踪人员的box坐标来判断人员进出。比如当人员最后一次出现在画面中的box坐标是
[XX, XX, XX, XX]
,则判断该坐标在监控画面中的位置是否满足你预设想的区域,来确认人员是否进、出了某场所。这种方案可能得有点数学功底,我懒得搞了,第一种方案基本能满足个人需求。
实现步骤
提前部署好frigate、mqtt服务器和ha集成,frigate可以参考官网文档https://docs.frigate.video/或论坛。
这里我以全屋人员数量统计为例,发布2个统计人员进出的mqtt实体供ha发现
第一个是全屋人员统计传感器,用于统计人员数量
msg.payload =
{
"unique_id": "PEOPLE_COUNTER_CAMERA_house_01",
"name": "全屋人数",
"icon": "mdi:counter",
"unit_of_measurement": "人",
"state_topic": "PEOPLE_COUNTER_CAMERA/house/01/state",
"device": {
"identifiers": "frigate人员统计",
"manufacturer": "Dante",
"model": "PEOPLE_COUNTER_1.0",
"name": "frigate人员统计",
"sw_version": "1.0"
}
};
msg.topic = "homeassistant/sensor/PEOPLE_COUNTER_CAMERA_house_01/config"
第二个是闭锁统计的二元传感器,不是必须的,根据家庭布局而定。因为我家入户门北面还有一个常关闭的洗衣房,当有人进入洗衣房并把门关上,根据上述的分析,frigate将认定人员离家了,所以仅在入户门打开的时候短时开放统计全屋人员数量信息,其余时间不统计,引入一个闭锁变量。
msg.payload =
{
"unique_id": "PEOPLE_COUNTER_CAMERA_enable_01",
"name": "闭锁玄关",
"device_class": "lock",
"state_topic": "PEOPLE_COUNTER_CAMERA/enable/01/state",
"device": {
"identifiers": "frigate人员统计",
"manufacturer": "Dante",
"model": "PEOPLE_COUNTER_1.0",
"name": "frigate人员统计",
"sw_version": "1.0"
}
};
msg.topic = "homeassistant/binary_sensor/PEOPLE_COUNTER_CAMERA_enable_01/config"
然后给两个变量随便赋一个初始值,因为后面我要在nodered中引入这几个ha实体,比如
msg.payload = "2";
msg.topic = "PEOPLE_COUNTER_CAMERA/house/01/state"
msg.payload = "ON";
msg.topic = "PEOPLE_COUNTER_CAMERA/enable/01/state"
具体流程如如下:先接收mqtt的frigate/events事件 -> 过滤掉update事件 -> 根据感兴趣的区域分流 -> 如果需要短时开放则加入闭锁规则 -> 进行计算人员加减 -> 导入之前数据 -> 数据更新发布