OpenCV立体声校准错误(3:内部错误)功能“CalibereExtrinsics”中输入阵列1的校准检查条件矩阵

2024-09-27 21:33:41 发布

您现在位置:Python中文网/ 问答频道 /正文

opencv版本是3.4.9

我使用这个code来校准。我的立体摄像机由两个GoPro会话摄像机(设置为1080p 30 fps,中角度)组成,固定在相距90厘米的铝制平面上,还使用wifi遥控器使摄像机同步。我拍摄了一段2分钟的视频,涵盖了两个摄像机的每个角度,我用我的电视屏幕作为棋盘(我需要它很大,因为摄像机彼此太远),我将视频分解成帧,并且删除了算法找不到棋盘的所有帧(如果其中一个摄像头找不到两个摄像头中删除的确切帧的模式)。当使用9x6棋盘模式测试不失真时,我注意到每一张图片在不失真后看起来都很糟糕

enter image description here

这是原稿。我尝试了一切,用光,用印刷板在纸上,然后粘在一块平板上,每次未失真的图像都是这样

enter image description here

很多时候,它看起来比这更糟糕,而且值得一提的是,在取消图像失真之前,我将图像从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'

我完全不知道该怎么做。我认为不失真问题导致了这个错误,或者我错了吗?请告诉我该怎么做


Tags: 图像版本棋盘视频错误模式codeerror
1条回答
网友
1楼 · 发布于 2024-09-27 21:33:41

因此,这里产生了错误:https://github.com/opencv/opencv/blob/master/modules/calib3d/src/fisheye.cpp#L1421当计算奇异值分解(SVD)输出的奇异值向量时w。具体地说,第一个奇异值和最后一个奇异值的比率(svd.w.at<double>(0) / svd.w.at<double>((int)svd.w.total() - 1))超过阈值(在这种情况下,1e6,基于变量thresh_cond

看起来您可以配置是否使用CALIB_CHECK_CONDhttps://github.com/opencv/opencv/blob/master/modules/calib3d/src/fisheye.cpp#L740)计算此条件(check_cond),这可以在stereoCalibrate函数中提供:https://docs.opencv.org/3.4/db/d58/group__calib3d__fisheye.html#gadbb3a6ca6429528ef302c784df47949b。在您正在使用的脚本中的这个line处调用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 stereopairhttps://github.com/opencv/opencv/blob/master/modules/calib3d/src/fisheye.cpp#L1013)时,断言上方有一条注释

最近(2020年3月)在OpenCV论坛上的一个答案,有一些逻辑来检查不良的立体声对:https://answers.opencv.org/question/213931/assertion-failed-abs_max-threshold-in-function-stereocalibrate/?answer=227486#post-id-227486

在您使用的脚本中,我认为这将转化为添加以下行here

    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),以便您可以检查它们-尽管在这一点上,我建议只在检查发生的位置添加一个断点,并逐步进行实时评估

相关问题 更多 >

    热门问题