opencv - 与相机 z 轴正交的线的相机投影

标签 opencv camera computer-vision projection-matrix

我正在使用 openCV 开发对象跟踪应用程序。我想将我的像素坐标转换为世界坐标以获得更有意义的信息。我已经阅读了很多关于计算透视变换矩阵的文章,并且我了解 cv2.solvePnP。但我觉得我的情况应该很特别,因为我正在跟踪田径跑道上的跑​​步者,跑道与相机的 z 轴正交。我将设置相机以确保这一点。

如果我只在跑道边缘选择两个点,我可以计算在特定高度(地平面)和距相机的距离(即沿着那条线)从像素到世界坐标的线性转换。然后我推断运行者将在与跑道平行的线上运行,高度不同,距离相机略有不同,但这些线在图像中仍应平行,因为它们都与相机 z 轴正交.由于所有这些限制,我觉得我不需要正常数量的点来跟踪特定轴上的运行者。我的直觉说 2-3 应该足够了。谁能帮我确定这里的方法?我完全偏离轨道了吗?由于与相机的高度和距离基本固定,我是否应该能够使用更小的对应集?

谢谢,比尔

最佳答案

所以,我想我自己已经回答了这个问题。根据以下假设,确实只需要两个对应点。

假设:

  1. 世界坐标设置为 X 轴和 Y 轴平行于地平面。 X 轴与跑道平行。

  2. 摄像机平移并可能绕 X 轴旋转(向下倾斜),但不绕 Y 轴(摄像机平面平行于跑道和 x 轴)或 Z 轴(摄像机相对于跑道水平)旋转地面)。

  3. 通过相机标定可知相机内在参数。

方法:

  1. 在世界坐标和图像坐标已知的地平面上选取两个点。例如,原帖中提到的跑道边缘的两个点。连接世界坐标中各点的线不应平行于 X 轴或 Z 轴。

  2. 由于这些点的 Y=0,忽略旋转/平移矩阵的第二列,将投影减少为平面单应变换(3x3 矩阵)。现在我们有 9 个自由度。

  3. 旋转假设将在旋转/平移矩阵上强制执行某种形式。即,第一列和第一行将是标识 (1,0,0)。这进一步将矩阵中的自由度数减少到 5。

  4. 限制矩阵第二列的值,使 cos^2(theta)+sin^2(theta) = 1。这会将未知数减少到只有 4。两个对应点将给我们我们需要计算地平面单应矩阵的 4 个方程。

  5. 从单应矩阵中分解出相机固有参数矩阵,为地平面留下旋转/平移矩阵。

  6. 由于之前所做的旋转假设,旋转/平移矩阵的忽略列可以很容易地从同一矩阵的第三列构建,即地平面单应矩阵中的第二列。

  7. 与相机内参相乘得到最终的通用投影矩阵(仅来自 2 个对应点!)

我的测试实现效果很好。当然,它对所提供的两个对应点的准确性很敏感,但这是给定的。

关于opencv - 与相机 z 轴正交的线的相机投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35543447/

相关文章:

python - 使用 OpenCV 进行轮廓识别

c++ - 是否可以使用 opencv 将旋转图像复制到另一个图像的 rotatedrect ROI 中?

python - numpy-array 中子矩阵的矢量化提取

python - 谷歌云视觉响应nodejs的非最大抑制

Python OpenCV cv2 绘制带文本的矩形

c++ - 如何确定 cv::Mat 是否为零矩阵?

c# - Unity android Native Camera 作为 WebcamTexture

opencv - 查找数码相机的固有参数

iphone - 如何实时修改来自 iPhone 摄像头的视频流?

opencv - 真实比例的3D重建