学习笔记:多目标跟踪对车辆进行测速

基本原理:

        最近一直在研究车辆的多目标跟踪,经常可以看到基于目标跟踪进行测速的视频,进行了短暂的研究,记录一下学习笔记。

        视频车辆测速一般需要知道两帧的目标坐标,也就是像素坐标,根据其两帧之间的时间间隔,之后就可以算得每秒移动了多少个像素点。将两帧的坐标作差之后,除以所用时间,在根据其目标在现实世界中的大小,将其映射到现实世界的速度。视频的FPS一般为25,这里我选择每十帧计算一次速度,所用时间就为:1/25*10,也就是0.04s,这里我并没有考虑到相机拍摄图像时存在的透视干扰,将图像目标与现实目标的映射表示成一种线性映射。在这里仔细说一下透视变换的作用,由于摄像机在拍摄车辆时,往往不是以俯视的视角进行检测的,这样就会存在位移的误差,通过透视变换将图像变为俯视拍摄的图像,可以依靠街道上的参照物,比如车道分割线等。

        下面附上计算的代码:


测速代码:

carwidth = 1.7 #1.7m

def Speed(location_one, location_two):
#location_one 形式为(t,l,w,h)->主要指的是前10帧的目标的像素坐标 
#location_two 形式为 (t,l,w,h) ->主要指的是本帧的目标的像素坐标
	d_pixels = math.sqrt(math.pow(location_two[0] - location_one[0], 2) + math.pow(location_two[1] - location_one[1], 2)) #像素级位移 这里就是进行了个勾股定理
	if location_two[2] > location_two[3]: #这里是我认为如果w>h的话 那么车辆有可能是横向行驶的,因为我的映射是利用车辆的宽度映射 像素级车辆宽度与现实世界车辆宽度的比值
		ppm = location_two[3] / carwidth
	else:  #w<=h 则相反
		ppm = location_two[2] / carwidth

	d_meters = d_pixels / ppm #进行转换
	time = 0.04
	speed = d_meters * time * 3.6 #转换成km.h的单位


效果视频:

车辆测速

想了解更多请参考:https://github.com/kraten/vehicle-speed-check

此视频没有使用opencv的目标跟踪,原视频来源于VCG.com

你可能感兴趣的:(学习,目标跟踪,人工智能)