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

2024-04-25 08:29:14 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我从一个视频框中随机抽取了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轴上相当远。你知道吗

你知道我做错什么了吗?你知道吗


Tags: 图像src距离视频npgoogle地图array
1条回答
网友
1楼 · 发布于 2024-04-25 08:29:14

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

对于小角度相机,结果非常接近,但是对于鱼眼相机,结果可能非常接近。你知道吗

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

为了得到准确的结果,我找到的唯一解决办法是使用插值样条函数映射变换函数。你知道吗

编辑

在你的例子中,我会说问题出在输入数据上:考虑由点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

而且我可以得到一个最大误差小于4像素的相机(在4k图像上)。你知道吗

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

仅使用点1、2、3和6解算数据我当然会得到一个精确的数值解(四个一般点有一个精确的平面相机),但图像显然是完全错误的(网格应位于街道平面上):

enter image description here

相关问题 更多 >

    热门问题