代码之家  ›  专栏  ›  技术社区  ›  Snake

寻找视频点与真实世界点之间的映射关系

  •  0
  • Snake  · 技术社区  · 5 年前

    我正在用录影带追踪汽车。我想确定它走了多少米。

    我从一个视频框中随机抽取了7个点。我把第一点作为我的出发点

    然后在相应的Google地图透视图上,我计算了6个点到原点的距离(delta x和delta y)

    然后我运行以下命令

    pts_src = np.array([[417, 285], [457, 794], [1383, 786], [1557, 423], [1132, 296], [759, 270], [694, 324]])
    
    pts_dst = np.array([[0,0], [-3, -31], [30, -27], [34, 8], [17, 15], [8, 7], [6, 1]])
    
    h, status = cv2.findHomography(pts_src, pts_dst)
    
    a = np.array([[1032, 268]], dtype='float32')
    a = np.array([a])
    
    # finally, get the mapping
    pointsOut = cv2.perspectiveTransform(a, h)
    

    当我测试点7的映射时,结果是错误的。

    我遗漏了什么吗?还是我用错了方法? 谢谢你

    enter image description here

    enter image description here

    x,y列表示图像上的像素。计量列表示从原点到点的距离,单位为米。基本上,我使用google地图,将地理代码转换为UTM,并计算x和y的差值。

    我试着输入第7个点,得到[[[14.682752 9.927497]]]作为输出,在x轴上相当远。

    你知道我做错什么了吗?

    0 回复  |  直到 5 年前
        1
  •  5
  •   6502    4 年前

    相机不是理想的针孔相机,因此单应不能捕捉真实的变换。

    另外,根据我的经验,仅仅是文献中的理论镜头畸变模型对于现实世界的镜头来说并不十分准确(多元素会做一些“奇怪”的事情来补偿桶/垫的畸变)。今天,使用非球面透镜也是可行的,在这里,变换可以是任何东西。

    编辑

    在你的例子中,我会说问题出在输入数据上:考虑由点6,3,1,2形成的准四边形

    image with marked quasi-quadrilateral

    如果以米为单位的A-D距离是36.9米,那么B-C距离怎么可能是53.8米?

    问题可能在于你是如何收集数据的,或者谷歌地图不应该被认为是如此小的测量可靠。

    编辑

    为了检查我写了一个简单的非线性最小二乘解算器(通过随机爬山工作)使用我的地板图片来测试它。 几秒钟后(它是用Python编写的,所以速度不是它最好的特性)可以解出一个一般的精确平面相机方程:

     pixel_x = (world_x*m11 + world_y*m12 + m13) / w
     pixel_y = (world_x*m21 + world_y*m22 + m23) / w
     w = (x*m31 + y*m32 + m33)
    
     m11**2 + m12**2 + m13**2 = 1
    

    enter image description here

    你的 但是我不能得到小于120像素的错误。 我为您的数据找到的最佳矩阵是:

    0.0704790534896005     -0.0066904288370295524   0.9974908226049937
    0.013902632209214609   -0.03214426521221147     0.6680756144949469
    6.142954035443663e-06  -7.361135651590592e-06   0.002007213927080277
    

    enter image description here