基于视频结构化的应用中, 目标在经过跟踪算法后, 会得到一个唯一标识和它对应的运动轨迹, 利用这两个数据我们可以做一些后续工作: 测速 (交通类应用场景), 计数(交通类应用场景, 安防类应用场景) 以及行为检测(交通类应用场景, 安防类应用场景). 我会写三篇文章依次介绍这三个主题.
(1)目标跟踪之速度计算
(2)目标跟踪之计数
(3)目标跟踪之行为检测
后面会陆续添加链接.
本篇文章以交通类应用场景为例, 介绍车辆断面计数方法.
人工计数方式
设想一个场景, 你蹲在地下通道旁边, 要统计穿过这条通道最近 5 分钟的人流量, 你实际的做法是什么? 目光是停留在一个人身上, 从 TA 进入通道直到离开吗? 当然不是, 因为这样的话你根本没有那么多双眼睛. 正常人会在通道中某个位置想象出来一条虚拟分界线, 目光紧盯这条线附近区域即可, 有人跨线计数就加一. 他们是不会关注这条直线两边稍远区域的目标, 因为那里有什么, 有多少目标都不会影响最终的计数结果.
如上图, 对于 A 区域和 B 区域范围内的目标, 观察者是不需要考虑的, 只有经过黄色虚拟计数线的目标才会纳入计数范畴. 在 A 和 B 区域出现的目标停留, 调头等都不影响最终的计数结果.
自动计数原理
自动计数原理其实跟人工计数一致, 计数算法应该同样假设出一条虚拟的分界线, 目标穿过这条虚拟的分界线时, 总计数加一. 前面提到过, 目标经过跟踪算法处理后, 会得到一个唯一目标标识和对应的运动轨迹坐标点集合, 通过这两个数据可以很快判断某个目标是否穿越某条直线. 2D 平面中判断一个点 (X,Y) 在一条直线 (X1, Y1)(X2, Y2) 左侧还是右侧的算法很简单, 下面是对应代码:
- // check if point at one side of line
- bool LeftOfLine(Point p, Point p1, Point p2)
- {
- if (p1.X == p2.X)
- {
- return p.X < p1.X;
- }
- if (p1.Y == p2.Y)
- {
- return p.Y < p1.Y;
- }
- if (p2.X < p1.X)
- {
- Point tmp = p2;
- p2 = p1;
- p1 = tmp;
- }
- int ret = (p2.Y - p.Y) * (p2.X - p1.X) - (p2.Y - p1.Y) * (p2.X - p.X);
- return ret < 0;
- }
上面代码可以判断点 P 是否在 P1 和 P2 组成直线的左侧, 如果是返回 True, 否则返回 False.(直线左侧和右侧并不太恰当, 在实际使用过程中, 如果 P1 和 P2 已经确定, 该方法返回 True 代表点在直线的一侧, 返回 False 代表点在直线的另一侧). 目标刚出现时, 我们通过以上方法判断它在直线的某一侧(方法返回结果为 A), 目标在移动过程中, 会不断得到新的位置点(轨迹点集合中最新的一点), 我们还是通过以上方法来判断目标在直线的某一侧(方法返回结果为 B), 如果 A!=B, 说明目标跨越了直线, 此时计数应该加一. 已经参与计数的目标设置一个 Flag, 后面不再参与计数逻辑.
下面给出 5 种情况, 说明自动计数逻辑中, 目标参与计数和不参与计数的规则:
(1)理想情况下, 目标从监控画面底部 P1 进入时, 即可被检测算法检测到, 并被跟踪算法跟踪到, 之后连续跟踪, 直到离开监控区域, 从 P2 处消失. 目标跨域虚拟计数线(图中红色虚线), 计数生效.
(2)检测算法准确性不高, 目标到特定位置 P1 才被检测到, 直到离开监控区域, 从 P2 处消失. 目标跨域虚拟计数线, 计数生效.
(3)检测算法准确性不高, 目标还未跨越虚拟计数线就不能被检测到了. 计数不生效.
(4)检测算法准确性不高, 或者跟踪算法准确性不高, 目标虽然被跟踪到, 但是跟踪到的轨迹并不是连续的, 并且轨迹刚好在虚拟计数线那里断掉了. 计数不生效.
(5)检测算法准确性不高, 目标轨迹没有跨域虚拟计数线, 这个情况跟 (3) 一致.
注意, 以上举例都是假设目标从监控画面底部进入视野(去向), 当目标从监控画面顶部进入视野时(来向), 情况类似.
影响自动计数准确性的因素
根据前面的讨论, 其实影响自动计数准确性的因素很好归纳:
(1)检测算法准确性. 目标如果还未跨越虚拟计数线时, 检测算法就检测不到该目标了, 那么计数肯定丢失;
(2)跟踪算法准确性. 跟踪算法效果不好时, 目标轨迹不连续, 很可能刚好在虚拟计数线那里断掉;
(3)虚拟计数线的位置. 虚拟计数线不能太远, 很多检测算法对远处的小目标检测效果不理想; 当然也不能太近, 我们在计数时, 为了过滤错误的检测目标, 要求必须保证目标轨迹点的数量要大于某个值, 比如目标在跨越计数线时, 要求目标轨迹点集合中的点数量大于 25(必须被连续跟踪超过 1 秒, 假设 FPS 为 25), 如果虚拟计数线太近, 目标从监控画面下方进入时并且速度很快, 那么它不会被连续跟踪超过 1 秒.
以上是目标跟踪中关于计数的详细说明, 有问题留言私信皆可.
来源: https://www.cnblogs.com/xiaozhi_5638/p/11010749.html