为什么你检测不到圆点标定板
简介
某日,同事反映某厂的标定板无法识别,经过多次尝试,依旧失败。最后被总结为非标尺寸标定板导致。隐隐觉的这不是真正的原因,标定板本身可以自行设计成为各种不同的参数。这让我想起几年前也遇到过相同的问题,依稀记得解决方案。重复实验成功后在此记录。
圆形标定板的识别方法
圆点棋盘格的分类和尺寸判别方法
圆点棋盘格分为对称和非对称。如下图(左:对称,右:非对称)
需要着重讨论的是如何确定标定板的行列数。对称板无需讨论,尺寸为行和列的圆点数量,行列转置依旧可以正常识别。如下图,5行4列与4列5行均可识别。
比较容易让人混乱的,是非对称圆点标定板的行和列的确定。在此明确,非对称圆点标定板的列数是两个相邻行的折线路线的所有圆点。行数是最边上一列的圆点个数。因此,下图中棋盘格的数量是6行17列,注意,程序中输入的参数为cv::Size(6,17)而非(17,6)。其第一个参数是行数而不是行的宽度(width)。
因此有以下结论:
- 非对称标定板一行有相邻的两行。
- 非对称标定板的行列一般不能转置。
API接口
与棋盘格检测不同,圆点检测采用的函数接口是cv2.findCirclesGrid
。此外,有必要初始化一个圆点检测器替换其默认的检测器。为了方便调整参数,还额外需要一个SimpleBlobDetector_Params
对象设置参数:
params = cv2.SimpleBlobDetector_Params()
blobDetector = cv2.SimpleBlobDetector_create(params)
found, corners = cv2.findCirclesGrid(image,
grid_size,
cv2.CALIB_CB_SYMMETRIC_GRID,
blobDetector,
None)
对于对称棋盘格,采用cv2.CALIB_CB_SYMMETRIC_GRID
,非对称采用cv2.CALIB_CB_ASYMMETRIC_GRID
。grid_size根据上文,严格按照行列参数进行填写。最后,最后最重要的是通过SimpleBlobDetector_Params
设置SimpleBlobDetector
的参数。
SimpleBlobDetector::Params
往往检测失败的原因是采用了默认的圆点检测器参数以及弄错了行列数量。能够修改的参数有:
其中,filterBy
开头的参数指定了是否打开检测圆的基本性质,分别是面积,圆度,颜色,凸度。其余参数用于设置这些参数的最值。此外阈值通过最值,进行阶梯形变化检测。
因此,这里对于一些图像尺寸较大的情况,检测器默认的最大面积参数很难覆盖目标圆点。需要修改maxArea
到一个较大的数值。另外通过filterByArea
指定检测黑点还是白点,这意味着反选将不能够检测到目标标定板。
检测非对称圆点标定板
检测(4,11)非对称标定板
检测(11,4)非对称标定板:
检测某标定板: