基于视频结构化的应用中,目标在经过跟踪算法后,会得到一个唯一标识和它对应的运动轨迹,利用这两个数据我们可以做一些后续工作:测速(交通类应用场景)、计数(交通类应用场景、安防类应用场景)以及行为检测(交通类应用场景、安防类应用场景)。我会写三篇文章依次介绍这三个主题。

(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秒。

以上是目标跟踪中关于计数的详细说明,有问题留言私信皆可。

最新文章

  1. Monitoring Processes with Supervisord
  2. 使用PowerShell解三道测试开发笔试题
  3. How to Call SharePoint 2013 API Service to Query The Lists
  4. js正则验证手机号
  5. android中的4种点击事件
  6. fsockopen
  7. JavaScript学习心得(五)
  8. Java 获取今天之前的七天 的日期
  9. apache 上配置多个django工程
  10. UpdatePanel + 弹出框
  11. 替换 window.location当中的某个参数的值(而其它值不变)JS代码
  12. (转载)Linux查看文件编码格式及文件编码转换
  13. 如何让CSS区别IE版本
  14. python3中socket套接字的编码问题解决
  15. C++引用形参,函数返回多个值
  16. MyEclipse弹出提示窗口
  17. Linux下Shell重定向
  18. [蓝桥杯]PREV-27.历届试题_蚂蚁感冒
  19. CART决策树
  20. IDEA中配置Maven+spring MVC+tomcat

热门文章

  1. JS的innerText和innerHTML
  2. win10应用程序添加到开机启动项的两种解决办法
  3. Sublime text追踪函数插件:ctags[转载]
  4. VS生成Cordova for Android应用之Gradle
  5. p标签内不能嵌套div(注解)
  6. API HOOK介绍 【转】
  7. Win10的UWP之进度条
  8. PRML Chapter3
  9. HOLLOW_BRUSH等价于NULL_BRUSH,都代表透明化刷
  10. Delphi-网络编程-第一个网络方面作品(UDP聊天程序)