C++ opencv复现halcon算子 connection()和select_shape()

一、引言

一般在使用halcon做blob分析的时候,threshold()、connection()、select_shape()这三个算子是结合起来使用的。通过threshold()算子进行二值化目标分割提取,通过connection()将各目标关联起来,然后利用select_shape()对各目标进行筛选。

二、halcon效果

经过threshold之后的connection()算子处理的图像为左边效果;经过select_shape()算子,通过面积与圆度两个判断条件,筛选后的图像为右边的效果。

三、C++ opencv实现

  • threshold()算子实现

这个算子就类似opencv的threshold()函数,通过二值化分割出前景与背景目标。opencv实现效果如下:

  • connection()算子实现

这个算子,就类似于opencv的连通域分析函数connectedComponentsWithStats()。将全部的前景目标,根据是否存在连通,将其进行分开。opencv实现效果如下:

  • select_shape()算子实现

这个算子在opencv中没有明确的类似的函数。熟悉select_shape()算子的原理后,可以通过opencv进行实现,select_shape()算子中最核心的就是其中的一个特征筛选参数Halcon学习之select_shape()算子参数介绍_selectshape算子-CSDN博客,可以通过这个参数,来对不同的目标进行筛选。

这里使用opencv实现了部分参数,这里使用的是area面积和圆度roundness,两个参数共同约束来实现的筛选。

opencv实现前景区域的area是很简单是,连通域分析中会有,圆度的话,需要公式来计算实现,圆度计算公式为:

计算圆度 (4*π*面积/周长²)

cpp 复制代码
			// 计算周长
			double perimeter = arcLength(contour, true);
			// 计算圆度 (4*π*面积/周长²)
			if (perimete> 0) {
				roundness = (4 * CV_PI * area) / (perimeter * perimeter);
			}

最终实现的筛选效果如下:

四、

select_shape()这个算子筛选特征的参数太多了,如果全部实现也挺难的。