人流量统计-动态版
更新时间:2022-01-18
统计图像中的人体个数和流动趋势,主要适用于低空俯拍、出入口场景,以人体头肩为主要识别目标,核心功能:
- 静态人数统计:传入单帧图像,检测图片中的人体头肩,返回图中总人数。
- 动态人数统计和跟踪:传入监控视频抓拍图片序列,进行人体追踪,返回每个人体框的坐标和所属ID;并根据目标轨迹判断进出区域行为,进行动态人数统计,返回区域进出人数。同时可输出渲染结果图(含统计值和跟踪框渲染)。(注:抽祯频率需>2fps,否则无法有效跟踪,建议5fps,接口默认保证5qps,每天赠送5万次免费调用量,以便充分测试。)
渲染图示例:
Json::Value result;
std::string image;
aip::get_file_content("/assets/sample.jpg", &image);
std::string dynamic = "true";
// 调用人流量统计-动态版
result = client.body_tracking(image, dynamic, aip::null);
// 如果有可选参数
std::map<std::string, std::string> options;
options["case_id"] = "123";
options["case_init"] = "123";
options["show"] = "true";
options["area"] = "100";
// 带参数调用人流量统计-动态版
result = client.body_tracking(image, dynamic, options);
人流量统计-动态版 请求参数详情
参数名称 | 是否必选 | 类型 | 可选值范围 | 默认值 | 说明 |
---|---|---|---|---|---|
image | 是 | std::string | 图片数据的二进制字符串,可以使用aip::get_file_content函数获取 | ||
dynamic | 是 | std::string | true false |
true:动态人流量统计,返回总人数、跟踪ID、区域进出人数; false:静态人数统计,返回总人数 |
|
case_id | 当dynamic为True时,必填 | std::string | 任务ID(通过case_id区分不同视频流,自拟,不同序列间不可重复即可) | ||
case_init | 当dynamic为True时,必填 | std::string | true false |
每个case的初始化信号,为true时对该case下的跟踪算法进行初始化,为false时重载该case的跟踪状态。当为false且读取不到相应case的信息时,直接重新初始化 | |
show | 否 | std::string | true false |
false | 否返回结果图(含统计值和跟踪框渲染),默认不返回,选true时返回渲染后的图片(base64),其它无效值或为空则默认false |
area | 当dynamic为True时,必填 | std::string | 静态人数统计时,只统计区域内的人,缺省时为全图统计。 动态人流量统计时,进出区域的人流会被统计。 逗号分隔,如‘x1,y1,x2,y2,x3,y3...xn,yn',按顺序依次给出每个顶点的xy坐标(默认尾点和首点相连),形成闭合多边形区域。 服务会做范围(顶点左边需在图像范围内)及个数校验(数组长度必须为偶数,且大于3个顶点)。只支持单个多边形区域,建议设置矩形框,即4个顶点。坐标取值不能超过图像宽度和高度,比如1280的宽度,坐标值最小建议从1开始,最大到1279。 |
area参数设置说明
进出区域方向:从区域外走到区域内就是in,相反就是out,详见下方示例。
示例1: 如下图,area区域框三条边贴着图像左方边缘,从图像右方往左走到框里就是in,从图像左方往右走出框就是out,相当于只有图像中间那条线起作用。 如果想要从图像左方向右走是in,就把框画在图像右半部分,上、下、右三条边贴着图像边缘。
同理,上下方向,如果area区域框三条边贴着图像下方边缘,从图像上方往下走到框里就是in,从图像下方往上走出框就是out,相当于只有图像中间那条线起作用。如果想要从图像下方向上走是in,就把框画在图像上半部分,上、左、右三条边贴着图像边缘。
示例2: 如下图,area区域是一个不规则多边形,将画面中门口以外的部分都框起来了,蓝色箭头的方向代表in,人从门外走进区域框里,红色箭头的方向代表out,人走出区域框,走向门外。
人流量统计-动态版 返回数据参数详情
字段 | 是否必选 | 类型 | 说明 |
---|---|---|---|
person_num | 是 | int | 检测到的人体框数目 |
person_info | 否 | object[] | 每个框的具体信息 |
+location | 否 | object | 跟踪到的人体框位置 |
++left | 否 | int | 人体框左坐标 |
++top | 否 | int | 人体框顶坐标 |
++width | 否 | int | 人体框宽度 |
++height | 否 | int | 人体框高度 |
+ID | 否 | int | 人体的ID编号,ID的取值逻辑为:每个case从1开始,不同人体向上递增但不一定连续 |
person_count | 否 | object | 进出区域的人流统计 |
+in | 否 | int | 当前帧进入区域的瞬时人数,一般情况下,当人体头肩检测框刚好完全进入area区域框时,该画面帧的in计数1;如要计算某一段时间内进入区域的累计人数,可基于连续帧图片的返回结果计算得到 |
+out | 否 | int | 当前帧进入区域的瞬时人数,一般情况下,当人体头肩检测框刚好完全离开area区域框时,该画面帧的out计数1;如要计算某一段时间内进入区域的累计人数,可基于连续帧图片的返回结果计算得到 |
image | 否 | string | 结果图,含跟踪框和统计值(渲染jpg图片byte内容的base64编码,得到后先做base64解码再以字节流形式imdecode) |
渲染结果图说明
画面里刚出现的人体头肩检测框都是红色,被跟踪锁定之后会变成其他颜色(颜色随机,不同颜色没有特定规律),模型根据同颜色框的运动轨迹来判断进出移动方向;人体被跟踪锁定后,检测框上方会出现人体的ID编号,ID的取值逻辑为:每个case从1开始,不同人体向上递增但不一定连续。
人流量统计-动态版 返回示例
未检测到任何人:
{
"person_num":0,
"person_info":[]
“person_count”:
{
"in":0,
"out":0
}
}
检测到2个人,无轨迹,无人进出区域:
{
"person_num":2,
"person_info":[]
“person_count”:
{
"in":0,
"out":0
}
}
检测到2个人和2条轨迹,1人离开区域:
{
"person_num":2,
"person_info":
[
{
"ID":3
"location":
{
"left": 100,
"top": 200,
"width": 200,
"height": 400,
}
}
{
"ID": 5
"location":
{
"left": 400,
"top": 200,
"width": 200,
"height": 400,
}
}
]
“person_count”:
{
"in":0,
"out":1
}
}