opencv版本为3.4.9
我用这个代码来校准。我的立体相机由两个GoPro会话相机(设置-1080 p 30 fps,中角)组成,安装在一个90厘米远的铝平面上,还使用了一个wifi遥控器实现相机同步。我拍摄了一段2分钟的视频,覆盖了两个摄像头的每个角度,我用我的电视屏幕作为板(我需要它很大,因为摄像机相距太远),我把视频分解成帧,还删除了算法找不到棋盘的所有帧(如果其中一个摄像机找不到两台摄像机中的确切帧)。当使用9x6棋盘图案测试不失真时,我注意到每一张图片在不失真后看起来都很可怕。
这是原版。我什么都试过了,有光,纸上有印制板,粘在平板上,每次不变形的图像都是这样的。
很多时候,它看起来比这更糟糕,而且值得一提的是,在取消图像失真之前,我将图像的大小从1920x1080调整到640x360。
主要问题是,每次从github运行该代码时,我都会得到这个错误。
cv2.error: OpenCV(3.4.9) /io/opencv/modules/calib3d/src/fisheye.cpp:1421: error: (-3:Internal error) CALIB_CHECK_COND - Ill-conditioned matrix for input array 1 in function 'CalibrateExtrinsics'
我根本不知道该怎么做。我认为严重的不失真问题导致了这个错误,还是我错了??请告诉我该怎么做。
发布于 2020-04-09 01:47:27
因此,在计算奇异值向量时,https://github.com/opencv/opencv/blob/master/modules/calib3d/src/fisheye.cpp#L1421提出了一个误差:奇异值分解(SVD
)输出的奇异值。具体来说,第一个奇异值和最后一个奇异值(svd.w.at<double>(0) / svd.w.at<double>((int)svd.w.total() - 1)
)的比率超过了一个阈值(在本例中,是基于变量thresh_cond
的1e6
)。
看起来,您可以配置这个条件(check_cond
)是否使用CALIB_CHECK_COND
(https://github.com/opencv/opencv/blob/master/modules/calib3d/src/fisheye.cpp#L740)来计算,后者可以在stereoCalibrate
函数:fisheye.html#gadbb3a6ca6429528ef302c784df47949b中提供。stereoCalibrate
函数在您正在使用的脚本中在这个线路中调用;您只需将cv2.CALIB_FIX_INTRINSIC
更改为cv2.fisheye.CALIB_CHECK_COND
即可。
希望这有帮助,或者至少给你一些结果!
更新
将标志从cv2.CALIB_FIX_INTRINSIC
更改为cv2.fisheye.CALIB_CHECK_COND
后,会由于断言失败而引发新错误:(-215:Assertion failed) abs_max < threshold in function 'stereoCalibrate'
。这个断言发生在这里:https://github.com/opencv/opencv/blob/master/modules/calib3d/src/fisheye.cpp#L1023。通过快速的谷歌搜索,可以从OpenCV问题论坛得到以下两个问题:
两者得出的结论是一样的:在他们使用的图像集合中,有一些坏的立体声对需要移除。此外,在源代码中的行中,在计算abs_max
://check goodness of stereopair
(https://github.com/opencv/opencv/blob/master/modules/calib3d/src/fisheye.cpp#L1013)时,在断言上面有一个注释。
最近(2020年3月)在OpenCV论坛上的一个答案,有一些逻辑来检查坏的立体声对:max-threshold-in-function-stereocalibrate/?answer=227486#post-id-227486。
在您使用的脚本中,我认为它将转换为添加以下几行这里
diff = cornersL - cornersR
lengths = np.linalg.norm(diff[:, :, 1], axis=-1)
sum = np.sum(lengths, axis=0)
if (sum > 2000.0):
print(f"THIS STEREO PAIR IS BROKEN!!! Diff is: {sum}")
cornersR = np.flipud(cornersR)
或者,如果满足了这个条件,您可以只使用continue
,然后跳过这些对(虽然我不确定这是否理想)。您还可能希望打印/保存图像(leftName
)和(rightName
)的名称,以便您可以检查它们--尽管在此时,我建议只在检查发生的地方添加一个断点,然后逐步进行实时计算。
发布于 2022-11-30 03:10:42
不失真的图像应该与校准中的图像大小相同,除非你对校准参数做了一些修改。
https://stackoverflow.com/questions/61002436
复制相似问题