采用OpenCV和棋盘格靶标标定相机内参数时,如何提高角点检测的稳定性和精度?
OpenCV 4中已经新增了一个新的棋盘格角点检测函数findChessboardCornersSB,相较于findChessboardCorners,前者的稳定性和精度显著提升。经测试,角点漏检或检测失败的情况显著减少。也许,findChessboardCornersSB末尾的SB,是Super NB的意思吧。但findChessboardCorners的稳定性不高,很多图像中的棋盘格都检测失败
一、更换角点检测算法
采用棋盘格标定相机内参数时,检测棋盘格角点的过程中,通常采用如下函数:
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);
二、改善物理环境
- 改善光照条件。如果在室外采集标定数据,应该尽量避免阳光直射标定板和相机,避免标定板上出现明显的光斑。如果在室内采集数据,则尽量保证光照均匀。
- 调整合适的标定板位姿。标定板相对于相机的姿态角和距离,应该控制在合理的范围内。在图像中,标定板长边缘与图像长边缘的长度之比,尽量大于六分之一。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐

所有评论(0)