关于youtube某视频的车辆测速

youtube该视频对应项目:

从视频测速大概的流程就是基于检测跟踪获得车辆的像素坐标,然后通过映射将像素坐标转换为3D世界的坐标,然后再用位移/时间获得速度
而这个过程中,我最关心的过程是如何将像素坐标映射成3D世界的坐标,基于这个问题,我进行了下面的一系列查找

首先因为是测速,所以查找velocity:

然后找到dist:

可以看到dist由DistanceInMeters函数调用,因此找这个函数:

上图提示下面应该找函数的定义,可以看到该函数是由一个模板写的(模板为了使不同的数据类型都能有同一个通用的函数):

可以看到这个函数中,第一行static_cast表示类型转换,第二行需要理解Haversine才能知道是不是这个函数将2Dpixel变成了3D坐标:

因此如下图,继续查找Haversine的定义:


查到上图定义却发现这个函数并没有pixel到geometry的转换(也可以查一下Haversine的定义,如下链接):

https://blog.csdn.net/spatial_coder/article/details/116605509

因此很可能在调用函数Haversine时,已经做好了这个转换,因此直接找调用Haversine时Haversine的参数,也就是下图的from和to:

那么这个from和to是函数DistanceInMeters的形参,所以现在需要先查找调用DistanceInMeters时的实参:

也就是上图的from和to

下面就需要理解m_geoParams.Pix2Geo是不是做了像素坐标到地理坐标的映射,那么其实从名字也可以看出,确实是在这个函数做了这个映射,因此就找这个函数的定义:

上图这个定义中显然应该继续查找mtoGeo:

如上图所示,应该继续查找toGeo:

toGeo来自GotPerspectiveTransform

这个函数前两个参数很明显一个是像素,一个是geometry,而且这个函数确实就是我关心的坐标转换的核心过程了:

我做了一些努力想看懂这个函数,首先我查了cv::solve(很明显cv类似namespace,solve大概是一个方法)

https://blog.csdn.net/sinat_41752325/article/details/123844805

上述链接的博客给了一个解释:

这样其实也知道GotPerspectiveTransform这个函数的第三个参数是什么了,是LU分解:

我也在项目查了CV_64的定义,没有查到,因此估计CV_64是一个库定义好的类型,所以我也查了一下,确实是

最后我查了Mat类型,查到了opencv库的官方解释,还给出了Mat类型的使用,当有四个和三个参数时,如下图使用:

当有四个参数时,最后一个参数是Mat中每一个元素的初始值

所以上图这个函数大概是通过pixel坐标得到了A和B矩阵,然后通过cv::solver求解了X,而X的元素是由Mat的指针初始化的,也就是说求解X的过程中其实M的元素也改变了,所以最后这个函数返回M

最后,关于海事摄像头应用场景的问题:

  • 无论是固定摄像头,运动物体测速
  • 还是摄像头在运动物体上,运动物体测速
    都要先考虑海事行业有没有这个应用场景啊!

参考文献:
https://blog.csdn.net/spatial_coder/article/details/116605509
https://blog.csdn.net/sinat_41752325/article/details/123844805
https://docs.opencv.org/3.4/d3/d63/classcv_1_1Mat.html#a3620c370690b5ca4d40c767be6fb4ceb

posted @ 2023-05-17 22:54  千里夫人  阅读(133)  评论(0编辑  收藏  举报