基于视频结构化的应用中,目标在通过跟踪算法后,会获得一个惟一标识和它对应的运动轨迹,利用这两个数据咱们能够作一些后续工做:测速(交通类应用场景)、计数(交通类应用场景、安防类应用场景)以及行为检测(交通类应用场景、安防类应用场景)。我会写三篇文章依次介绍这三个主题。html
(1)目标跟踪之速度计算算法
(2)目标跟踪之计数跨域
(3)目标跟踪之行为检测ide
后面会陆续添加连接。spa
本篇文章以交通类应用场景为例,介绍车辆断面计数方法。3d
人工计数方式code
设想一个场景,你蹲在地下通道旁边,要统计穿过这条通道最近5分钟的人流量,你实际的作法是什么?目光是停留在一我的身上,从TA进入通道直到离开吗?固然不是,由于这样的话你根本没有那么多双眼睛。正常人会在通道中某个位置想象出来一条虚拟分界线,目光紧盯这条线附近区域便可,有人跨线计数就加一。他们是不会关注这条直线两边稍远区域的目标,由于那里有什么、有多少目标都不会影响最终的计数结果。视频
如上图,对于A区域和B区域范围内的目标,观察者是不须要考虑的,只有通过黄色虚拟计数线的目标才会归入计数范畴。在A和B区域出现的目标停留、调头等都不影响最终的计数结果。htm
自动计数原理blog
自动计数原理其实跟人工计数一致,计数算法应该一样假设出一条虚拟的分界线,目标穿过这条虚拟的分界线时,总计数加一。前面提到过,目标通过跟踪算法处理后,会获得一个惟一目标标识和对应的运动轨迹坐标点集合,经过这两个数据能够很快判断某个目标是否穿越某条直线。2D平面中判断一个点(X,Y)在一条直线(X1, Y1)(X2, Y2)左侧仍是右侧的算法很简单,下面是对应代码:
1 // check if point at one side of line 2 bool LeftOfLine(Point p, Point p1, Point p2) 3 { 4 if (p1.X == p2.X) 5 { 6 return p.X < p1.X; 7 } 8 9 if (p1.Y == p2.Y) 10 { 11 return p.Y < p1.Y; 12 } 13 14 if (p2.X < p1.X) 15 { 16 Point tmp = p2; 17 p2 = p1; 18 p1 = tmp; 19 } 20 21 int ret = (p2.Y - p.Y) * (p2.X - p1.X) - (p2.Y - p1.Y) * (p2.X - p.X); 22 return ret < 0; 23 }
上面代码能够判断点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秒。
以上是目标跟踪中关于计数的详细说明,有问题留言私信皆可。