使用opencv进行多摄像头校准:两个摄像头相互面对

Posted

技术标签:

【中文标题】使用opencv进行多摄像头校准:两个摄像头相互面对【英文标题】:Multi-camera calibration with opencv: Two cameras facing each other 【发布时间】:2017-01-31 22:46:02 【问题描述】:

我想计算两个相机的外部校准,并使用 cv::stereoCalibrate() 函数来执行此操作。然而,结果与现实并不相符。有什么问题?

设置:两个安装在 7 米高的摄像头,向下看时面对面。他们有很多视野交叉点,我捕获了我在校准中使用的棋盘格图像。

我没有翻转任何图像。

我需要翻转图像吗?还是我需要做其他事情来告诉相机实际上是面对面的?

注意:相同的功能可以完美校准彼此相邻且朝向同一方向的摄像机(就像任何典型的立体摄像机一样)。

谢谢

【问题讨论】:

您使用了多少张图像进行校准?他们有足够的轮换变化吗? 我使用 50 张图片,旋转和倾斜变化都不错。 我会做什么:使用cv::calibrateCamera() 独立校准每个相机。一旦确定了两个相机帧之间的变换,请估计它们:每个相机可见的棋盘图案+cv::solvePnP()。变换c1Mc2可以估计为c1Mo x (c2Mo)^-1 谢谢。你能澄清一下c1c2Mo 是什么吗?我假设c1c2 是相机中心,Mo 是转换? solvePnP() 产生旋转和平移 w.r.t.每个相机的每个图案的图像。例如,对于给定的模式,假设我们通过solvePnP() 函数获得R1T1(用于第一个摄像头)和R2T2(用于第二个摄像头)。我们如何从这些旋转-平移对计算Mo 符号 c1Mo 对应于对象帧和 camera1 帧之间的齐次变换:4x4 矩阵与(R | T)。您必须创建c1Mo,因为R1 是罗德里格斯旋转向量,但基本上c1MoR1T1 相同,只是符号不同。 【参考方案1】:

为了“告诉相机实际上是面对面的”,您必须正确指定imagePoints1imagePoints2,这样具有匹配索引的点对应于同一个物理点。

如果在您的情况下,当相机朝向相同的方向并且不适用于您的配置时功能可以完美运行 - 点索引之间的差异可能是一个可能的原因(很可能点是垂直和水平翻转的)。

一种调试方法是在每个帧上的点附近绘制索引,或者对它们进行颜色编码并确保它们在图像之间匹配。

但有一个问题 - 你为什么使用cv::stereoCalibrate()?您描述的设置似乎不是一个好的用例。如果你想估计相机的外部参数,你可以使用cv::calibrateCamera()。唯一的缺点是它假设所有提供的视图的内在参数都是相同的(所有图像都是用相同或非常相似的相机拍摄的)。如果不是这样 - 实际上cv::stereoCalibrate() 会更合适(但手册建议您仍然使用cv::calibrateCamera() 单独估计每个相机的内在参数)

【讨论】:

我验证了点并且点对应看起来不错。它并不表示需要翻转。我想找到cv::stereoCalibrate() 提供的第一台和第二台摄像机之间的旋转和平移。是的,我正在使用cv::calibrateCamera() 校准各个相机,并将相机矩阵提供给cv::stereoCalibrate()。您如何建议我使用来自cv::calibrateCamera() 的结果来查找相机之间的转换? 几乎根据文档 - objectPoints 将是标记的 3d 点坐标向量的向量,imagePoints 将是检测到的 2d 点坐标的向量向量,rvecstvecs 将包含每个视图(旋转和平移)的外部信息。如果可以的话——请提供带有对应关系的图片样本——这将有助于解决问题。

以上是关于使用opencv进行多摄像头校准:两个摄像头相互面对的主要内容,如果未能解决你的问题,请参考以下文章

opencv模块介绍

OpenCV:使用 cv::triangulatepoints() 进行立体摄像机跟踪的问题

用于 OpenCV 的 Iphone 6 相机校准

双目标定

HALCON 到 OpenCV 失真系数的转换

使用 OpenCV 2.3.1 和 C++ 校准单个相机