前面说到cv::findCirclesGrid2()内部先使用SimpleBlobDetector进行圆斑检测,然后使用CirclesGridClusterFinder算法类执行基于层次聚类的标靶检测。如下图所示,由于噪声的影响,SimpleBlobDetector检出的标靶可能包含噪声。
而CirclesGridClusterFinder算法类会执行基于层次聚类的标靶检测,并利用标靶的分布信息对斑点进行筛选和过滤,以检出真正的标靶。CirclesGridClusterFinder::findGrid()的执行步骤如下
1)CirclesGridClusterFinder::hierarchicalClustering()
利用层次聚类的思想,基于点之间的距离进行聚类,得到与设置的标靶分布点数相等的一系列点。此时会将上图中5个噪点滤除,因为它们和真正的标靶点之间的距离偏大。
2)cv::convexHull()
计算上述点的凸包,理想情况下对称标靶的凸包点为4,非对称标靶的凸包点为6,如下图所示,其中红色点表示凸包点。但是由于图像的畸变,往往会检出的点数会超过4/6。