一、更换角点检测算法

采用棋盘格标定相机内参数时,检测棋盘格角点的过程中,通常采用如下函数:

CV_EXPORTS_W bool findChessboardCorners( InputArray image, Size patternSize, OutputArray corners,
                                         int flags = CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE );
                                         
CV_EXPORTS_W void cornerSubPix( InputArray image, InputOutputArray corners,
                                Size winSize, Size zeroZone,
                                TermCriteria criteria );

findChessboardCorners的稳定性不高,很多图像中的棋盘格都检测失败。这个问题,如何破?

OpenCV 4中已经增加了一个新的棋盘格角点检测函数findChessboardCornersSB,相较于findChessboardCorners,前者的稳定性和精度显著提升。经测试,角点漏检或检测失败的情况显著减少。也许,findChessboardCornersSB末尾的SB,是Super NB的意思吧。

CV_EXPORTS_W inline
bool findChessboardCornersSB(InputArray image, Size patternSize, OutputArray corners,
                             int flags = 0)

对这个Super NB的算法感兴趣的朋友,可阅读原文《Accurate detection and localization of checkerboard corners for calibration》,PDF链接在此:
https://www.krakenrobotics.com/wp-content/uploads/2019/06/2018-Alex-Duda-Nov-2018.pdf

使用findChessboardCornersSB函数检测角点的代码示例如下。

int chessboard_cols;
int chessboard_rows;
cv::Mat input_img;
// TODO: assign values to the variables above
cv::Mat gray_img;
cv::cvtColor(input_img, gray_image, cv::COLOR_BGR2GRAY);
bool is_det_suc = cv::findChessboardCornersSB(gray_img, cv::Size(chessboard_cols-1, chessboard_rows-1),
                                              image_points, cv::CALIB_CB_EXHAUSTIVE + cv::CALIB_CB_ACCURACY);

二、改善物理环境

  1. 改善光照条件。如果在室外采集标定数据,应该尽量避免阳光直射标定板和相机,避免标定板上出现明显的光斑。如果在室内采集数据,则尽量保证光照均匀。
  2. 调整合适的标定板位姿。标定板相对于相机的姿态角和距离,应该控制在合理的范围内。在图像中,标定板长边缘与图像长边缘的长度之比,尽量大于六分之一。
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐