『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 397|回复: 3

[技术探讨] frigate实现人员进出统计

[复制链接]

2

主题

48

帖子

500

积分

高级会员

Rank: 4

积分
500
金钱
452
HASS币
0
发表于 2025-1-2 14:18:03 | 显示全部楼层 |阅读模式
本帖最后由 dante210402 于 2025-1-2 14:37 编辑

通过订阅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"
}

统计人员进出大致有两个想法

  1. 通过标志位type(new或end)来判断人员进出。比如摄像头部署在客厅,我在画面中定义了xuanguanciwo两个区域,当events发布来的信息type是new,进入的区域有xuanguan,则认定是有人从外面回到家里了;当events发布来的信息type是end,进入的区域是ciwo,则可以认定是有人从客厅进入了次卧;至于type是update时,直接丢弃,因为被追踪的人员还在移动。
  2. 通过追踪人员的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事件 -> 根据感兴趣的区域分流 -> 如果需要短时开放则加入闭锁规则 -> 进行计算人员加减 -> 导入之前数据 -> 数据更新发布



游客,如果您要查看本帖隐藏内容请回复

flow

flow

ha实体1

ha实体1

ha实体2

ha实体2

frigate人员统计.rar

2.52 KB, 下载次数: 0

nodered_flow

回复

使用道具 举报

2

主题

9

帖子

73

积分

注册会员

Rank: 2

积分
73
金钱
64
HASS币
0
发表于 2025-1-7 04:05:50 | 显示全部楼层
感谢分享,正需要呢。
回复

使用道具 举报

12

主题

337

帖子

1800

积分

金牌会员

Rank: 6Rank: 6

积分
1800
金钱
1463
HASS币
0
发表于 2025-1-7 08:45:23 | 显示全部楼层
这玩意儿主要是统计不准。有时车来了或车走了不识别,有时乱识别。人员也是,如果两个人有一部分重叠了,它就只识别一个人。反正就是勉强能用,但不精确.
回复

使用道具 举报

13

主题

189

帖子

1267

积分

金牌会员

Rank: 6Rank: 6

积分
1267
金钱
1078
HASS币
0
发表于 2025-1-7 08:56:04 | 显示全部楼层
买个爱奈斯新出的电子围栏,蓝牙标记很准
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2025-2-3 03:13 , Processed in 0.139381 second(s), 29 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表