select_shape
是 Halcon 中用于筛选区域(Region)的关键算子,它基于区域的形状特征(如面积、长宽比、圆度等)对输入区域进行过滤。其参数灵活,使用广泛,但对于初学者可能较难掌握。以下是其参数详解及使用技巧:
函数原型
select_shape(Regions : SelectedRegions : Features, Operation, Min, Max : )
参数解析
1. Regions(输入)
- 类型: 区域集合(Region)
- 说明: 输入的需要筛选的区域集合。需通过其他图像处理步骤(如阈值分割、形态学操作等)提前生成。
2. SelectedRegions(输出)
- 类型: 区域集合
- 说明: 符合筛选条件的输出区域集合。
3. Features(关键参数)
- 类型: 字符串或字符串数组
- 说明: 指定基于哪些形状特征进行筛选。Halcon 提供超过60种形状特征,以下为常见关键特征:
特征名 | 含义 | 典型范围 |
---|---|---|
'area' | 区域面积(像素数量) | ≥ 0 |
'width' | 区域宽度(基于最小外接矩形) | ≥ 0 |
'height' | 区域高度(基于最小外接矩形) | ≥ 0 |
'ratio' | 宽度与高度的比值(width/height) | ≥ 0 |
'compactness' | 紧凑度(周长² / (4π*area)),圆=1 | ≥ 1(越大越不圆) |
'circularity' | 圆度(2D 区域接近圆形的程度) | 0(不圆)~1(完美圆) |
'rectangularity' | 矩形度(区域面积 / 最小外接矩形面积) | 0~1 |
'contlength' | 区域轮廓的周长 | ≥ 0 |
'convexity' | 凸性(区域面积 / 凸包面积) | 0~1 |
'num_holes' | 区域中孔洞的数量 | ≥ 0 |
4. Operation(逻辑操作)
- 类型: 字符串
- 说明: 指定筛选条件的逻辑关系。支持以下操作符:
'and'
:所有特征条件必须同时满足(默认)。'or'
:满足任一特征条件即可。- 其他复合逻辑(如
'xor'
根据版本可能支持)。
5. Min / Max(阈值范围)
- 类型: 数值或数值数组
- 说明: 设定每个特征的阈值范围。若只设定一个值,则另一界限自动取极值(如
Max=inf
或Min=-inf
)。- 适用示例:
Features='area', Min=100, Max=1000
→ 选择面积在 100~1000 像素的区域。Features=['area','circularity'], Min=[500,0.8], Max=[5000,1.0]
→ 面积 ≥500 且 ≤5000,且圆度 ≥0.8。
- 适用示例:
使用技巧
1. 多特征组合筛选
- 可同时指定多个特征,例如筛选“面积大且接近圆形”的区域:
select_shape(Regions, Selected, ['area','circularity'], 'and', [500,0.8], [5000,1.0])
2. 批量操作与优先级
- 特征顺序无关:
Features
参数的特征顺序不影响筛选结果。 - 逻辑优先级:使用
'or'
时建议谨慎,避免区域重复选中。
3. 动态阈值调整
- 若对特征范围不确定,可通过算子
smallest_rectangle1
、area_center
等预先计算特征的统计值,再动态设置Min
/Max
。
4. 常见问题
- 筛选结果为空:检查是否阈值范围过窄或逻辑条件冲突。
- 特征取值范围异常:如
'circularity'
应为 0~1,超过范围将无效。
示例代码
案例1:筛选面积大于1000的圆形区域
* 分割得到初始区域
threshold(Image, Regions, 100, 255)
connection(Regions, ConnectedRegions)
* 筛选面积≥1000且圆度≥0.8的区域
select_shape(ConnectedRegions, Selected, ['area','circularity'], 'and', [1000,0.8], [999999,1.0])
案例2:过滤长宽比异常的矩形
* 筛选矩形区域,排除过于狭长的情况(长宽比在0.5~2之间)
select_shape(Regions, GoodRects, 'ratio', 'and', 0.5, 2.0)
注意事项
- 特征依赖性:部分特征需基于特定区域属性(如
'convexity'
需要计算凸包)。 - 效率优化:当处理大型区域集合时,优先筛选“廉价特征”(如面积)以提高速度。
- 复合逻辑限制:Halcon 不支持自定义逻辑表达式(如
(A AND B) OR C
),需多次调用select_shape
组合实现。
通过灵活配置 Features
和阈值,select_shape
可以高效处理复杂形状过滤任务。建议结合 Halcon 的 features
工具(获取区域的具体特征值)调试参数范围。
Halcon 的 select_shape
支持的形状特征(Features
)非常丰富,实际应用中包含近百种特征参数。由于篇幅限制,上述回答仅列举了部分常用特征。以下将系统分类并全面补充所有关键特征,同时标注其数学定义和应用场景,助您彻底掌握。
Halcon select_shape
的 Features
参数完整分类及详解
1. 基础几何特征
特征名 | 数学定义/描述 | 范围/类型 | 应用场景 |
---|---|---|---|
'area' | 区域像素数量 | ≥ 0 的整数 | 筛选大小符合目标的区域 |
'width' | 最小外接矩形的宽度 | ≥ 0,浮点数 | 排除过宽或过窄的物体 |
'height' | 最小外接矩形的高度 | ≥ 0,浮点数 | 筛选特定高度范围的物体 |
'row' | 区域重心行坐标(Y坐标) | 图像坐标系内值 | 根据位置筛选区域 |
'column' | 区域重心列坐标(X坐标) | 图像坐标系内值 | 同上 |
'row1', 'column1', 'row2', 'column2' | 最小外接矩形的左上角(row1, column1) 和右下角(row2, column2) | 像素坐标 | 定位物体的包围框位置 |
2. 形态与轮廓特征
特征名 | 数学定义/描述 | 范围/类型 | 应用场景 |
---|---|---|---|
'compactness' | ( \text{Compactness} = \frac{\text{Perimeter}^2}{4\pi \times \text{Area}} ) | ≥1(圆为1,值越大越不圆) | 区分圆形与其他形状 |
'circularity' | ( \text{Circularity} = \frac{4\pi \times \text{Area}}{\text{Perimeter}^2} ) | 0(不圆)~1(完美圆) | 高精度圆检测(比紧凑度更直观) |
'contlength' | 区域轮廓总长度 | ≥0,浮点数 | 筛选边缘复杂的物体 |
'convexity' | ( \text{Convexity} = \frac{\text{Area}}{\text{Convex Hull Area}} ) | 0~1(1为完全凸形) | 检测凹痕或缺口(如缺陷检测) |
'rectangularity' | ( \text{Rectangularity} = \frac{\text{Area}}{\text{Width} \times \text{Height}} ) | 0~1(矩形为1) | 筛选矩形或方形物体 |
'num_sides' | 多边形近似后的边数(需先调用 shape_trans 进行多边形逼近) | ≥3,整数 | 识别规则多边形(如六角螺母) |
'contarea' | 区域闭合轮廓内的面积 | ≥0,整数 | 区分空心和实心区域 |
3. 方向与对称性特征
特征名 | 数学定义/描述 | 范围/类型 | 应用场景 |
---|---|---|---|
'orientation' | 区域的主轴方向(指向最大惯量轴的角度) | [-π/2, π/2] 弧度 | 调整工件方向(如零件排序) |
'anisometry' | 各向异性 = 主轴长度 / 短轴长度(等效椭圆的轴比) | ≥1(圆为1) | 检测拉伸形变(如椭圆度检测) |
'bulkiness' | ( \text{Bulkiness} = \pi \times \frac{\text{Length1} \times \text{Length2}}{4 \times \text{Area}} ) | ≥1 浮点数 | 衡量区域“膨胀”程度 |
'structure_factor' | 结构因子(区域紧密度与面积平衡指标) | 复杂定义,参考手册 | 综合形状复杂性分析 |
4. 矩与高阶统计特征
特征名 | 数学定义/描述 | 范围/类型 | 应用场景 |
---|---|---|---|
'moments_xx' | 二阶中心矩(用于计算协方差矩阵) | 浮点数 | 形状的高阶统计描述 |
'moments_yy' | 同上 | 浮点数 | 同上 |
'moments_xy' | 同上 | 浮点数 | 同上 |
'ra' | 区域等效椭圆的半长轴长度(Length1) | ≥0,浮点数 | 描述物体伸展程度 |
'rb' | 区域等效椭圆的半短轴长度(Length2) | ≥0,浮点数 | 同上 |
'phi' | 等效椭圆的取向角度(同 'orientation' ) | [-π/2, π/2] 弧度 | 替代 'orientation' ,但需注意椭圆的物理意义 |
5. 孔洞与拓扑特征
特征名 | 数学定义/描述 | 范围/类型 | 应用场景 |
---|---|---|---|
'num_holes' | 区域内部孔洞的数量 | ≥0,整数 | 检查零件是否有缺失(如孔洞数量异常) |
'area_holes' | 孔洞的总面积 | ≥0,整数 | 分析空心区域的比例 |
'euler_number' | 欧拉数 = 孔洞数 - 连接数 + 1 | 整数,可正可负 | 拓扑结构分析(如验证网格完整性) |
6. 投影特征
特征名 | 数学定义/描述 | 范围/类型 | 应用场景 |
---|---|---|---|
'proj_horizontal' | 区域在水平方向上的投影长度 | ≥0,浮点数 | 检测水平延伸的物体(如横杆) |
'proj_vertical' | 区域在垂直方向上的投影长度 | ≥0,浮点数 | 检测垂直结构(如立柱) |
高级应用技巧
1. 组合多条件筛选
用数组传入多个特征,通过 Operation
和 Min
/Max
数组实现复杂逻辑。例如,筛选 圆形、无孔洞且面积适中 的物体:
select_shape(Regions, Selected, ['circularity', 'num_holes', 'area'], 'and', [0.9, 0, 500], [1.0, 0, 2000])
2. 动态计算特征阈值
若特征范围未知,先用 area_center
、circularity
等单特征算子提取样本值,再确定动态阈值:
* 计算面积均值,筛选中大型区域
area_center(Regions, Area, Row, Column)
mean := mean(Area)
select_shape(Regions, Selected, 'area', 'and', mean*0.5, mean*2)
3. 特征依赖关系
某些特征需要特定预处理:
'num_sides'
:需先用shape_trans
将区域转换为多边形。'euler_number'
:需确保区域已连通(无碎块)。
4. 注意特征计算开销
如 'moments_xx'
等高阶矩计算成本较高,建议先用基础特征(如面积)初步筛选,再应用高级特征。
完整代码示例:精密定位六角螺钉
* 分割并连接区域
read_image(Image, 'screws.png')
threshold(Image, Regions, 128, 255)
connection(Regions, ConnectedRegions)
* 转换为多边形以使用 `num_sides` 特征
shape_trans(ConnectedRegions, Polygons, 'convex')
* 筛选六边形(边数5.5~6.5)且凸性好的螺钉
select_shape(Polygons, Screws, ['num_sides', 'convexity'], 'and', [5.5, 0.95], [6.5, 1.0])
特征查找工具
使用 features
算子可输出区域的全部特征值,便于调试:
* 获取区域所有特征并显示
features(Regions, 'all', Features)
write_string('特征值:' + Features)
或通过 HDevelop 的工具菜单 → Inspect Features… 可视化分析区域特征分布。
通过合理选择特征及其组合,select_shape
可成为复杂视觉检测任务的强力工具。建议结合《Halcon 形状特征官方手册》深入学习每个特征的计算方法及适用场景。