findCirclesGrid检测不到圆点棋盘格技术原因分析与解决方案

为什么你检测不到圆点标定板

简介

某日,同事反映某厂的标定板无法识别,经过多次尝试,依旧失败。最后被总结为非标尺寸标定板导致。隐隐觉的这不是真正的原因,标定板本身可以自行设计成为各种不同的参数。这让我想起几年前也遇到过相同的问题,依稀记得解决方案。重复实验成功后在此记录。
请添加图片描述

圆形标定板的识别方法

圆点棋盘格的分类和尺寸判别方法

圆点棋盘格分为对称和非对称。如下图(左:对称,右:非对称)
远点标定板
需要着重讨论的是如何确定标定板的行列数。对称板无需讨论,尺寸为行和列的圆点数量,行列转置依旧可以正常识别。如下图,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)非对称标定板:
请添加图片描述
检测某标定板:
请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值