转载请注明出处。
文章地址:https://blog.csdn.net/duiwangxiaomi/article/details/115333784?spm=1001.2014.3001.5501
函数简介
在相机标定过程中,如采用棋盘格标定板进行标定,则需找到棋盘格内角点,根据棋盘格内角点在像面中的像素坐标和各点对应的棋盘世界坐标,拍摄多个位置下的棋盘格,多点求解相机内外参。OpenCV中的findChessboardCorners()函数即用于棋盘格角点检测。
参数说明
findChessboardCorners(InputArray image,
Size patternSize,OutputArray corners,
int flags=CALIB_CB_ADAPTIVE_THRESH+CALIB_CB_NORMALIZE_IMAGE)
功能
找到标定板内角点位置(标定板是专用器具,需要有严格的规格控制,标定板的制作精度直接影响标定精度;角点是指黑白色相接的方块定点部分;内角点是不与标定板边缘接触的内部角点)
参数
- 输入的图像矩阵,必须是8-bit灰度图或者彩色图像,在图像传入函数之前,一般经过灰度处理,还有滤波操作。
- 内角点的size,表示方式是定义Size PatSize(m,n),将PatSize作为参数传入。这里是内角点的行列数,不包括边缘角点行列数;行数和列数不要相同,这样的话函数会辨别出标定板的方向,如果行列数相同,那么函数每次画出来的角点起始位置会变化,不利于标定。
- 存储角点的数组,一般用
vector<vector<point2f>>
- 标志位,有默认值。
CV_CALIB_CB_ADAPTIVE_THRESH:函数默认方式,根据图像的平均亮度值进行图像 二值化,设立此标志位的含义是采用变化的阈值进行自适应二值化;
CV_CALIB_CB_NORMALIZE_IMAGE:在二值化之前,调用EqualizeHist()函数进行图像归一化处理;
CV_CALIB_CB_FILTER_QUADS:二值化完成后,函数开始定位图像中的四边形(这里不应该称之为正方形,因为存在畸变),这个标志设立后,函数开始使用面积、周长等参数来筛选方块,从而使得角点检测更准确更严格。
CALIB_CB_FAST_CHECK:快速检测选项,对于检测角点极可能不成功检测的情况,这个标志位可以使函数效率提升。
注意:标志位可组合使用。CALIB_CB_FAST_CHECK一般用于快速检测,很有可能检测不成功,特别是棋盘光线不均匀时。总体来说,CV_CALIB_CB_ADAPTIVE_THRESH是最可能检测到棋盘格的方式(个人亲测,如有问题,可在评论区讨论),组合使用推荐CV_CALIB_CB_ADAPTIVE_THRESH|CV_CALIB_CB_NORMALIZE_IMAGE
,如果默认方式或这个组合方式检测不到角点,基本就需要重新采图了。
总结
该函数的功能就是判断图像内是否包含完整的棋盘图,如果能够检测完全,就把他们的角点坐标按 顺序(逐行,从左到右)记录下来,并返回非0数,否则返回0。 这里对size参数要求非常严格,函数必须检测到相同的size才会返回非0,否则返回0,这里一定要注意。
该函数检测的角点的坐标是不精确的,获得角点精确坐标,可使用 cornerSubPix()
函数,进行角点亚像素提取,使用方法可见我的另一篇博客角点检测及优化函数使用。
参考链接
感谢各位朋友的:点赞、收藏和评论~