是否可以在无法访问相机的情况下破解相机校准?

信息处理 计算机视觉 opencv Python 相机校准 投影
2021-12-26 16:25:39

很多时候,我们需要处理视频流而无需使用摄像头。访问相机矩阵将有利于各种处理技术。是否可以在无法访问相机的情况下破解相机校准?

我有来自安装在移动汽车上的单个摄像头的视频流,记录道路(因此地平面上有多条平行线,车道标记的拐角但没有圆圈)。我想创建一个自上而下的视图,但我无权访问相机。可能吗?如果有怎么办?

我从Learning OpenCV: Computer Vision with the OpenCV Library一书中了解到,我需要以下矩阵:

  1. 内在的,和
  2. 失真

..对cv2.undistort()图像,计算单应性cv2.getPerspectiveTransform()cv2.warpPerspective()最终获得顶视图。

  1. 我如何计算/近似/猜测内在或失真矩阵/参数?所有参数都很重要吗?
  2. 从其他相机(如 OpenCV 源代码示例)复制参数可以吗?

先前的研究:

  • OpenCV Python 相机校准教程- 需要访问相机
  • 相机自动校准 - 带来希望“如果识别出多组平行线或具有已知形状(例如圆形)的物体,则可以获得校准”
  • 试图了解有关相机校准的答案[ 1 ][ 2 ][ 3 ],试图找到我的问题的答案。

有任何想法吗?提前感谢您的帮助!


更新 1:透视变换实验

我曾尝试使用getPerspectiveTransform(pts1,pts2)dst = cv2.warpPerspective(img,M,(x,y), flags=flags)匹配四个输入图像点来获得一种自上而下的视图。但我不确定如何处理失真:

选择点:首先,我放大输入并尝试在车道标记上精确选择匹配的外部点以创建单应矩阵并预览透视变换图像warpPerspective我看到车道被扭曲但不知道有多糟糕。为了得到一个想法,我选择了每端的 delta (50px) 更远的点。这就是我得到的:

图像实验

我可以在不使用相机的情况下修复失真吗?有没有其他方法可以解决这个问题。

很少有输入图像可以玩: 伊姆古尔 伊姆古尔


更新 2:自顶向下视图中的非平行(散射)光流

这是由于失真还是其他原因?: 伊姆古尔

1个回答

如果我理解正确,如果您只需要自上而下的视图,您就不需要内在或外在来实现这一目标。您基本上可以在平行线上定义 4 个点,然后将整个图像变形为规范视图(例如)。{{0,0},{480,960}}

要在 OpenCV 中做到这一点,您需要做的就是使用此处findHomography描述的计算单应性然后,使用(看这里)扭曲你的图像。warpPerspective

您唯一需要关心的是选择您所追求的正面平行视图的尺寸。它应该或多或少地匹配原始图像区域的纵横比。


关于你问题的第二部分:是的。首先提醒大家,很多像这样的作品选择忽略失真估计。但是,我可以想到两种方法来实现这一点:

  1. 使用车道本身来校正失真:在正面平行视图中,创建另一个透视扭曲,以便车道本身是垂直的。在此设置中,将车道线视为图像中的消失线(在透视图中,它们总是如此)。由此,您甚至可以校准您的相机。例如,看这里这里这里

  2. 汽车应该或多或少地遵循直线/平滑的轨迹。如果你计算所有汽车的运动,它们应该给你类似的运动,平行于车道。该信息在约束和生成转换方面再次有用,这会将您的图像扭曲为减少失真的图像。