我有一个垂直安装在水箱中的照相机,向下看。 水箱底部有一个平面网格(离相机约2米)。 我希望能够在底部放置标记,并使用计算机视觉来了解它们的真实生活位置。
所以,我需要从像素映射到mm。 如果我没有弄错的话,cv :: calibrateCamera(...)会做到这一点,但取决于移动相机前面的图案。 我只有场景的静态图片,相机不会相对于网格移动。因此,我只有一个“单一”图像来查找参数。 我怎么能用网格做到这一点?
谢谢。
答案 0 :(得分:3)
有趣的问题! "可爱"部分是对水玻璃界面处的折射的内在参数的影响,即与空气中的相同透镜相比增加焦距(或相反地,减小视场)。从理论上讲,您可以在空气中进行校准,然后校正折射率的差异,但直接在水中校准可能会给您更准确的结果。
知道您的准确度要求吗?您是否确认您的镜头/传感器组合足以满足它们(具有足够的余量)?要回答您需要估计的问题(通过透镜和传感器规格计算,或通过实验使用分辨率图表),您是否可以在图像中解析应用所需的最小距离。
根据您的问题的措辞,我认为您只对单个平面上的测量感兴趣。所以你只需要(a)去除非线性(桶形或枕形)镜头失真,(b)估计感兴趣的平面和图像之间的homography。拥有后者后,您可以通过矩阵乘法直接从无畸变图像坐标转换为世界图像坐标。另外,如果(正如我想象的那样)感兴趣的平面大致平行于图像平面,那么你应该没有任何问题来保持整个视野的焦点。
当然,为了使所有这些按预期工作,您应该确保罐底部非常平坦,在您的应用的测量公差范围内。否则你真的在处理3D问题,需要相应地修改你的程序。
实际程序在很大程度上取决于坦克的大小,而您并没有明确指出。如果它足够小以至于制造类似棋盘的可移动校准目标是可行的,那么一定要去做。您可能需要查看this other answer以获取建议。在下文中,我将讨论更有趣的情况,即你的坦克很大,例如:一个游泳池的大小。
我将校准标记粘贴在池底的常规网格中。我可能会选择像these那样的类似棋子的标记,也许可以用塑料上的良好激光打印机自己打印,并附带粘性背衬(假设您可以将它们永久保留在原位)。您应该计划使用其中的一些,例如,8x8或10x10网格,尽可能多地覆盖相机在其操作位置和姿势的视野。为了帮助您很好地排列网格,您可以使用具有合适扇形角度的激光线投影仪,或连接到旋转支架的激光指示器。请注意,没有必要将它们固定在精确的X-Y网格中(这可能很复杂,取决于池的大小),只要知道它们相对于任意选择(但固定)三个位置的位置。换句话说,您可以将它们大致在网格中附着到底部,然后尽可能准确地测量三个极端角的距离,从而构建一个基本三角形,然后测量所有其他角的距离。三角形的顶点,最后用一点三角函数重建它们的真实位置。它基本上是一个测量问题,根据您的准确度要求和预算,您可能希望注册当地友好的专业测量师(及其工具),以便在必要时精确完成。
一旦你有了网格,你可以根据应用需要填充游泳池,拿到相机,对焦并停止镜头。从现在开始,您可能无法再次触摸焦点和f-stop,在误校准的情况下 - 曝光只能通过曝光时间来控制,因此请确保有足够的光线。禁用任何和所有自动对焦和自动光圈功能(如果有)。如果相机具有非刚性镜头支架(例如DLSR),则您需要某种机械装备以确保镜头 - 镜体对保持刚性。在可用的照明和传感器的情况下,尽可能靠近F-stop,以便获得相当深的视野。然后拍摄几张照片(~10张),移动并旋转相机,然后离飞机距离预期的操作距离越近越远。你想要"看"在某些图像中,网格的一些重要透视缩短 - 这是精确校准焦距所必需的。存储图像时,请避免使用JPG和任何其他有损压缩格式 - 使用无损PNG或TIFF。
获得图像后,您可以手动标记和识别图像中的检查器标记。对于像这样的一次性项目,我不打扰自动识别,只需手动操作(例如在Matlab中,甚至在Photoshop或Gimp中)。为了帮助识别标记,您可以例如在他们旁边打印一个数字。获得手动标记后,您可以自动将其细化为亚像素精度,例如:使用cv :: findCornerSubpix。
你差不多完成了。提供"参考"测量实际角落的位置,以及所有图像中观察到的位置到您最喜欢的相机校准程序,例如, CV :: calibrateCamera。您可以使用摄像机的标称焦距(转换为像素)进行初始估计,以及零失真。如果一切顺利,您将获得相机内在参数,您将保留这些参数,并且相机会对您丢弃的所有图像构成。
现在,您可以根据应用程序的需要在最终设置中安装摄像头,然后再拍摄一张网格图像。像以前一样标记和细化角落位置。使用校准返回的失真参数取消其图像位置。最后计算真实标记的参考位置(以米为单位)与其未失真位置之间的单应性,并且您已完成。
HTH
答案 1 :(得分:1)
要校准相机,您需要多个棋盘图像(或找到的其他图案之一here)。您可以做的是在水外校准相机或进行一次校准序列。
获得该信息(焦距,镜头中心,失真等)。您可以使用solvePNP函数来估计单个板的方向。此估算为您提供从相机到电路板的距离。
完全不同的替代方案可能是找到相机使用的镜头类型并手动填写数据。我没试过这个,所以我不确定这会有多好用。