我想计算两个彼此不相干的相机的外部校准,并且正在使用cv::stereoCalibrate()函数来执行此操作。但是,结果与实际情况不符。有什么问题吗?
设置:两台安装在7米高的摄像机,彼此相对,同时向下看。他们有很多视野交叉点,并且我捕获了校准中使用的棋盘图像。
我没有翻转任何图像。
我需要翻转图像吗?还是我需要做些其他事情来告诉摄像机实际上彼此相对?
注意:相同的功能可以完美地校准彼此面对相同方向的摄像机(如任何典型的立体摄像机)。
谢谢
最佳答案
为了“告诉摄像机实际上彼此相对”,您必须正确指定imagePoints1
和imagePoints2
,以使具有匹配索引的点对应于同一物理点。
如果在您的情况下,当摄像头朝向相同方向并且与您的配置不兼容时,功能完美地起作用-点索引之间的差异可能是一个可能的原因(最有可能的点在垂直和水平方向都发生了翻转)。
一种调试方法是要么在每个帧的点附近绘制索引,要么对它们进行颜色编码,并确保它们在图像之间匹配。
但是有一个问题-为什么使用cv::stereoCalibrate()
?您描述的设置似乎并不是一个好的用例。如果要估计摄像机的外部参数,可以使用cv::calibrateCamera()
。唯一的缺点是,它假定所有提供的 View 的固有参数都是相同的(所有图像都是使用相同或非常相似的相机拍摄的)。如果不是这种情况,那么cv::stereoCalibrate()
确实会更合适(但手册建议您仍然可以使用cv::calibrateCamera()
分别估算每个相机的固有参数)
关于opencv - 使用opencv进行多摄像机校准:两个摄像机彼此相对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41968884/