我正在使用openCV处理对象跟踪应用程序。我想将我的像素坐标转换为世界坐标以获得更有意义的信息。我已经阅读了很多关于计算透视变换矩阵的知识,我知道cv2.solvePnP。但是我觉得我的情况应该是特别的,因为我在跑道和田径跑道上跟踪跑道,跑道与摄像机的z轴正交。我将设置相机以确保这一点。
如果我只选择跑道边缘上的两个点,我可以计算在该特定高度(地平面)处的像素到世界坐标的线性转换以及距相机的距离(即沿着该线)。然后我推断跑步者将在与跑道平行的一条直线上运行不同高度且与摄像机的距离略有不同,但线条在图像中仍应保持平行,因为它们都将与摄像机z轴正交。有了所有这些限制,我觉得我不需要正常数量的点来跟踪特定轴上的跑步者。我的直觉说2-3应该就够了。任何人都可以帮我解决这个方法吗?我完全偏离了轨道吗?由于摄像机的高度和距离基本固定,我不应该使用更小的对应设备吗?
谢谢,比尔
答案 0 :(得分:1)
所以,我想我自己已经回答了这个问题。确实,鉴于以下假设,只需要两个对应点。
假设:
设置世界坐标,X轴和Y轴平行于地平面。 X轴与跑道平行。
相机被平移并可能绕X轴旋转(向下成角度),但不绕Y轴旋转(相机平面与跑道和x轴平行)或Z轴(相机相对于接地)。
相机内部参数可从相机校准中获知。
方法:
在地平面中选择世界和图像中已知坐标的两个点。例如,原始帖子中提到的跑道边缘上的两个点。连接世界坐标中的poitns的线不应与X轴或Z轴平行。
由于这些点的Y = 0,忽略旋转/平移矩阵的第二列,将投影缩小为平面单应变换(3x3矩阵)。现在我们有9个自由度。
轮换假设将在旋转/平移矩阵上强制执行某种形式。即,第一列和第一行将是标识(1,0,0)。这进一步将矩阵中的自由度数减少到5。
约束矩阵第二列的值,使得cos ^ 2(theta)+ sin ^ 2(theta)= 1.这将未知数减少到只有4.两个对应点将给我们我们需要计算地平面单应矩阵的4个方程。
从单应矩阵中提取出相机固有参数矩阵,留下地平面的旋转/平移矩阵。
由于之前的旋转假设,旋转/平移矩阵的忽略列可以很容易地从同一矩阵的第三列构建,这是地平面单应矩阵中的第二列。
使用相机内部参数反过来以得到最终的通用投影矩阵(仅来自2个对应点!)
我的测试实施工作得很好。当然,它对所提供的两个对应点的准确性很敏感,但这是给定的。