跳转至

10 算子速查表#

用法

按"我想做什么"查表。括号内为参数顺序: 前面是输入输出图像/区域,后面是控制参数。 快捷键:光标停在算子上按 F1 打开官方帮助(先看 Signature 定参数顺序,再看 Description 懂含义)。

一、窗口与显示(dev_ / disp_ / set_#

算子 签名要点 说明
dev_close_window () 无参 关闭当前图形窗口
dev_open_window (Row, Column, Width, Height, Background, WindowHandle) 全为控制参数 打开新窗口,左上角屏幕坐标 + 尺寸 + 底色
dev_clear_window () 无参 清空窗口(重画前必做)
dev_display (Object) 图像 / 区域 / XLD 显示对象
dev_set_color (Color) 'red' 'green' 'blue' 'black' 'white' 'yellow' 'cyan' 'magenta' 'pink' 'orange' 设绘制颜色
dev_set_colored (NumColors) 12 用 N 色循环给多个区域上色
dev_set_draw ('fill' \| 'margin') 'fill' 填充 / 'margin' 只画轮廓 区域显示模式
dev_set_line_width (Width) 3 线宽
dev_set_paint (...) —— 更高级的绘制模式设置
set_display_font (WindowHandle, Size, Font, Bold, Slant) (W, 14, 'mono', 'true', 'false') 设字体
disp_message (WindowHandle, String, CoordSystem, Row, Column, Color, Box) Box = 'true'/'false' 绘制文字(可传元组,自动逐个显示)
disp_arrow (WindowHandle, Row1, Column1, Row2, Column2, Size) 起终点 + 箭头大小 画箭头
disp_circle (WindowHandle, Row, Column, Radius) —— 画圆
disp_cross (WindowHandle, Row, Column, Size, Angle) —— 画十字
disp_line (WindowHandle, Row1, Column1, Row2, Column2) —— 画线段
disp_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2) —— 画正矩形
disp_rectangle2 (WindowHandle, Row, Column, Phi, Len1, Len2) 中心 + 角度 + 半长半宽 画带角度矩形
dev_disp_text (Text, CoordSystem, Row, Column, Color, GenParamName, GenParamValue) CoordSystem = 'image'/'window' 开发环境文字显示,不需要 WindowHandle
dev_update_window ('off' \| 'on') —— 关闭/打开自动刷新(提速)
dev_update_off () / dev_update_on () —— 一次性关闭/打开窗口与变量窗口更新

'image''window' 坐标

标注目标用 'image'(跟着图像走),显示统计信息用 'window'(固定在窗口某处)。

二、图像读写与信息#

算子 签名要点 说明
read_image (Image, FileName) 文件名可为元组 读图;HALCON 自带图直接写名字,如 'clip''printer_chip/printer_chip_01'
write_image (Image, Format, FillColor, FileName) —— 写图
get_image_size (Image, Width, Height) 输出顺序:宽、高 获取图像尺寸
get_image_type (Image, Type) —— 获取像素类型('byte' / 'uint2' / 'real' …)
list_files (Directory, Options, Files) Options'files' 'directories' 'recursive' 'max_depth N' 'follow_links' 列出文件,输出路径元组
tuple_regexp_select (Tuple, Pattern, Selection) 正则 按后缀筛文件,如 ['\\.(bmp|png|jpg)$']
count_obj (Objects, Number) —— 统计对象个数

三、区域生成(gen_ / draw_#

算子 签名要点 说明
gen_circle (Circle, Row, Column, Radius) 中心 + 半径 生成圆区域
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2) 对角两点 生成正矩形区域
gen_rectangle2 (Rectangle, Row, Column, Phi, Len1, Len2) 中心 + 角度 + 半长半宽 生成带角度矩形区域
gen_region_line / gen_region_polygon / gen_region_points —— 生成线/多边形/点区域
draw_circle (WindowHandle, Row, Column, Radius) 交互式,只返回参数 鼠标画圆取参,需配合 gen_circle
draw_rectangle1 / draw_rectangle2 / draw_region 同上 交互式取参
threshold (Image, Region, MinGray, MaxGray) 闭区间 灰度阈值分割
binary_threshold (Image, Region, Method, LightDark, UsedThreshold) Method='max_separability'(Otsu) 自动阈值分割,'dark'/'light'
dyn_threshold (OrigImage, ThresholdImage, RegionDynThresh, Offset, LightDark) 局部动态阈值 光照不均时使用
regiongrowing / watersheds —— 区域生长 / 分水岭

四、区域集合运算#

算子 数学含义 记忆
intersection (R1, R2, Out) \(R_1 \cap R_2\) 共有部分
union1 (Regions, Out) 合并一整组 一组变一个
union2 (R1, R2, Out) \(R_1 \cup R_2\) 两个变一个
difference (R1, R2, Out) \(R_1 - R_2\) 有方向! R1 挖掉 R2
symm_difference (R1, R2, Out) \(R_1 \oplus R_2\) 异或,并集减交集
complement (R, Out) \(\overline{R}\) 相对整幅图像取反
concat_obj (Obj1, Obj2, Out) 拼接 不合并像素,个数相加

五、分割与形态学#

算子 说明
connection (Region, ConnectedRegions) 8 邻域打散成连通域
dilation_circle (Region, Out, Radius) 膨胀(变胖)
erosion_circle (Region, Out, Radius) 腐蚀(变瘦)
opening_circle (Region, Out, Radius) 开运算:先腐蚀后膨胀 → 去小白点/毛刺
closing_circle (Region, Out, Radius) 闭运算:先膨胀后腐蚀 → 填小黑点/裂缝
dilation_rectangle1 / erosion_rectangle1 / opening_rectangle1 / closing_rectangle1 矩形结构元版本
opening / closing 任意结构元版本
fill_up (Region, Out) 填充所有孔洞(不看孔大小)
boundary (Region, Border, 'inner'\|'outer') 取边界
skeleton (Region, Skeleton) 取骨架(中轴)
shape_trans (Region, Out, Type) 'convex' 凸包 / 'ellipse' 等效椭圆 / 'rectangle1' / 'rectangle2'
distance_transform (Region : DistanceImage : Metric, Foreground, Width, Height) 距离变换:区域内('true')或区域外('false')每个点到边界的距离;Metric 可用 'euclidean'用来求缺陷内切圆半径 → 定形态学半径下限

一句话口诀

开运算去"白"的小东西,闭运算去"黑"的小东西。

Radius 怎么定?

圆盘结构元下,腐蚀/膨胀等价于距离阈值,所以 半径下限 = 缺陷的内切圆半径(白斑到最近黑点的最大距离 / 孔洞到最近白点的最大距离), 用 distance_transform 在缺陷区域内取极大值即可得到; 实际贴着它向上取(Radius 是实数,不必凑整)。标定流程与实测数据见 [[13 形态学调整 结构元半径标定]]。

六、特征与筛选#

算子 说明
select_shape (Regions, Sel, Features, Operation, Min, Max) 形状特征筛选,Operation = 'and'/'or'
select_shape_std (Regions, Sel, ShapeFeature, Percent) 'max_area' / 'original'
select_gray (Regions, Image, Sel, Features, Op, Min, Max) 灰度特征筛选('mean' 'max' 'deviation' …)
select_obj (Regions, Obj, Index) 按序号取区域,序号从 1 开始
sort_region (Regions, Sorted, SortMode, Order, RowOrCol) 排序,如 ('first_point','true','column') 从左到右
count_obj (Objects, Number) 统计个数

select_shape 常用特征速记:

类别 特征名
位置尺寸 'area' 'row' 'column' 'width' 'height' 'ratio' 'row1' 'column1' 'row2' 'column2'
形状相似 'circularity' 'roundness' 'compactness' 'convexity' 'rectangularity' 'anisometry' 'num_sides' 'contlength'
椭圆外接 'ra' 'rb' 'phi' 'outer_radius' 'inner_radius' 'inner_width' 'inner_height' 'rect2_phi' 'rect2_len1' 'rect2_len2' 'max_diameter' 'orientation'
拓扑 'connect_num' 'holes_num' 'area_holes' 'euler_number'
'moments_m11' 'moments_m20' 'moments_m02' 'moments_ia' 'moments_ib'
距离 'dist_mean' 'dist_deviation' 'bulkiness' 'struct_factor'

详见 区域特征与 select_shape 筛选

七、图像预处理与滤波#

算子 公式 / 说明
scale_image (Image, Out, Mult, Add) \(g' = \text{Mult}\cdot g + \text{Add}\)
sub_image (Image1, Image2, Out, Mult, Add) \(g' = \text{Mult}\cdot(g_1-g_2) + \text{Add}\)
add_image / mult_image / div_image 图像加减乘除
mean_image (Image, Out, MaskWidth, MaskHeight) 均值滤波(快,边缘模糊)
median_image (Image, Out, MaskType, Radius, Margin) 中值滤波(去椒盐噪点,保边)
gauss_filter / smooth_image 高斯 / 通用平滑
emphasize (Image, Out, MaskWidth, MaskHeight, Factor) 增强局部对比(锐化)
illuminate (Image, Out, MaskWidth, MaskHeight, Factor) 光照补偿、提亮暗区(窗口要开大)
anisotropic_diffusion 各向异性扩散(保边平滑,慢但好)

详见 图像预处理与滤波

八、测量与特征提取#

算子 输出 说明
area_center (Regions, Area, Row, Column) 面积 + 质心 顺序:Area, Row, Column
orientation_region (Regions, Phi) 主轴方向(弧度,−π ≤ Φ < π) deg() 转角度
smallest_circle (Regions, Row, Column, Radius) 最小外接圆 对应 'outer_radius'
inner_circle (Regions, Row, Column, Radius) 最大内切圆 对应 'inner_radius'
smallest_rectangle1 (Regions, Row1, Column1, Row2, Column2) 最小外接正矩形 对应 'width' 'height'
smallest_rectangle2 (Regions, Row, Column, Phi, Len1, Len2) 最小外接带角矩形 对应 'rect2_phi' 'rect2_len1' 'rect2_len2'
elliptic_axis (Regions, Ra, Rb, Phi) 等效椭圆 对应 'ra' 'rb' 'phi'
circularity (Regions, Circularity) 圆度 \(C=\min(1, F/(max^2\pi))\)
roundness (Regions, Distance, Sigma, Roundness, Sides) 圆度/轮廓均匀度 circularity 不同,见 区域特征与 select_shape 筛选
compactness (Regions, Compactness) 紧密度 \(P^2/(4\pi F)\),圆 = 1
convexity (Regions, Convexity) 凸度 区域/凸包面积
rectangularity (Regions, Rectangularity) 矩形度 区域/最小外接矩形
contlength (Regions, ContLength) 轮廓长度 ——
connect_and_holes (Regions, NumConnected, NumHoles) 连通数 + 孔数 对应 'connect_num' 'holes_num'
area_holes (Regions, AreaHoles) 孔面积和 ——
euler_number (Regions, EulerNumber) 欧拉数 连通数 − 孔数
diameter_region (Regions, Row1, Column1, Row2, Column2, Diameter) 最大直径 对应 'max_diameter'
moments_region_2nd (Regions, M11, M20, M02, Ia, Ib) 二阶矩 ia ≥ ib
height_width_ratio (Regions, Ratio) 高宽比 对应 'ratio'

单位提醒

角度类输出(Phi)默认是弧度。转角度用 deg(),反之为 rad()

8.1 距离与角度#

算子 算什么
distance_pp (Row1, Column1, Row2, Column2, Distance) 点到点
distance_pl (Row, Column, Row1, Column1, Row2, Column2, Distance) 点到直线(直线用两点式,点在参数前面
distance_pc (Row, Column, RowC, ColumnC, RadiusC, DistanceMin, DistanceMax) 点到圆(两个输出:最近 / 最远)
distance_cc (ContCircle1, ContCircle2, Mode, DistanceMin, DistanceMax) 圆到圆(传 XLD 轮廓),Mode 常用 'point_to_point'
distance_lc (ContCircle, Row1, Column1, Row2, Column2, DistanceMin, DistanceMax) 线到圆(圆传轮廓)
angle_ll (RowA1, ColA1, RowA2, ColA2, RowB1, ColB1, RowB2, ColB2, Angle) 两直线夹角(弧度

8.2 2D 计量(Metrology)#

详见 测量模型 2D Metrology。五步:create_metrology_modelset_metrology_model_image_sizeadd_metrology_object_*_measureapply_metrology_modelget_metrology_object_result

算子 说明
create_metrology_model (MetrologyHandle) 创建计量模型(空壳)
set_metrology_model_image_size (Handle, Width, Height) 告诉它图像尺寸(应在 add_* 之前
add_metrology_object_line_measure (Handle, RowBegin, ColBegin, RowEnd, ColEnd, MeasureLength1, MeasureLength2, MeasureSigma, MeasureThreshold, GenParamName, GenParamValue, Index) 加"找线"对象
add_metrology_object_circle_measure (Handle, Row, Column, Radius, ...) 加"找圆"对象
add_metrology_object_rectangle2_measure (Handle, Row, Column, Phi, Length1, Length2, ...) 加"找矩形"对象
add_metrology_object_ellipse_measure (Handle, Row, Column, Phi, Radius1, Radius2, ...) 加"找椭圆"对象
add_metrology_object_generic (Handle, Shape, ShapeParam, ...) 通用版,Shape = 'circle'/'ellipse'/'rectangle2'/'line'
set_metrology_object_param (Handle, Index, GenParamName, GenParamValue) 调卡尺(Index 可写 'all'
apply_metrology_model (Image, Handle) 执行测量
get_metrology_object_result (Handle, Index, Instance, 'result_type', 'all_param', Parameter) 取结果
get_metrology_object_result_contour (Contour, Handle, Index, Instance, Resolution) 拟合出来的形状轮廓
get_metrology_object_model_contour (Contour, Handle, Index, Resolution) 你画的近似形状轮廓
get_metrology_object_measures (Contours, Handle, Index, Transition, Row, Column) 卡尺矩形 + 实测边缘点
set_metrology_model_param (Handle, 'reference_system', [Row, Column, Angle]) 定基准(只在建模型时设一次
align_metrology_model (Handle, Row, Column, Angle) 对齐到当前图的姿态(每次测之前都要调,会被下次覆盖
gen_cross_contour_xld (Cross, Row, Column, Size, Angle) 把边缘点画成十字叉

all_param 输出顺序:circle [row, column, radius](3)/ line [row_begin, column_begin, row_end, column_end](4)/ rectangle2 [row, column, phi, length1, length2](5)/ ellipse [row, column, phi, radius1, radius2](5)。

关键参数默认值MeasureLength1 = 20(垂直于边界的半长 = 测量容差)/ MeasureLength2 = 5(切向半长)/ num_measures = 10num_instances = 1min_score = 0.7distance_threshold = 3.5(RANSAC)。

三条最容易踩的

num_measuresmeasure_distance 互斥(设了后者,前者失效);卡尺数下限:圆 3 / 椭圆 5 / 直线 2 / 矩形每边 2。 ② all_param按"添加顺序 × 实例"拼的一维元组,下标要自己算。 ③ 三个 get_*_contour 含义不同:model_contour = 你画的近似形状,measures = 卡尺+边缘点,result_contour = 拟合结果。

九、仿射变换(HomMat2D#

详见 仿射变换矩阵与图像变换仿射变换实战 区域轮廓与抠图

一句话铁律

齐次矩阵作用在图像数据上时,行坐标传给 x、列坐标传给 y,也就是照常按 (Row, Column) 顺序写。官方原文:the order of passing row and column coordinates follows the usual order (Row, Column)。正角度 = 屏幕上逆时针

矩阵的存储HomMat2D长度 6 的实数元组 [ra, rb, tc, rd, re, tf],对应 \(\begin{bmatrix} ra & rb & tc\\ rd & re & tf\\ 0&0&1\end{bmatrix}\)

9.1 构造矩阵#

算子 参数顺序 说明
hom_mat2d_identity (HomMat2DIdentity) 单位矩阵,手工拼装的起点(必写
hom_mat2d_rotate (HomMat2D, Phi, Px, Py, Out) 角度在前,(Px,Py) = 固定点 逆时针旋转 Phi(弧度)
hom_mat2d_scale (HomMat2D, Sx, Sy, Px, Py, Out) 缩放在前,(Px,Py) = 固定点 Sx 管行方向、Sy 管列方向
hom_mat2d_translate (HomMat2D, Tx, Ty, Out) 无固定点 Tx 移行、Ty 移列
hom_mat2d_slant (HomMat2D, Theta, Axis, Px, Py, Out) Axis = 'x'/'y' 斜切;'y' 表示 y 轴斜切、x 轴不动
hom_mat2d_reflect (HomMat2D, Px, Py, Out) —— 关于直线镜像
vector_angle_to_rigid (Row1, Col1, Ang1, Row2, Col2, Ang2, Out) 全为控制参数 点 + 角度对应 → 刚体矩阵,最常用
vector_to_rigid / vector_to_similarity / vector_to_aniso / vector_to_hom_mat2d —— 多组对应点反求矩阵(能力依次变强)
hom_mat2d_invert (HomMat2D, Out) —— 求逆(正变换 ↔ 反变换)
hom_mat2d_to_affine_par (HomMat2D, Sx, Sy, Phi, Theta, Tx, Ty) 6 个输出 反解变换参数

叠加顺序

hom_mat2d_*左乘代码里先写的操作,先作用在对象上。 因此后面操作里的固定点 (Px, Py) 要写"前面几步搬完之后"的位置 —— 写"原始位置"就会跑偏。

9.2 用出去#

算子 对象 控制参数
affine_trans_image (Image, Out : HM, Interpolation, AdaptImageSize) Image 插值 'nearest_neighbor'/'bilinear'/'constant'(默认)/'weighted'/'bicubic';尺寸 'true'/'false'(默认)
affine_trans_region (Region, Out : HM, Interpolate) Region 'nearest_neighbor'(默认) / 'constant'
affine_trans_contour_xld (Contours, Out : HM) XLD 轮廓
affine_trans_polygon_xld (Polygons, Out : HM) XLD 多边形
affine_trans_pixel (HM, Row, Col, RowT, ColT) 点,像素坐标系 传参 (Row, Col)
affine_trans_point_2d (HM, Px, Py, Qx, Qy) 点,标准坐标系 传参 (Px, Py) = (Col, Row)

三条容易踩的

affine_trans_image 忽略输入图像的 domain(当作整幅矩形),且左、上边界永远会被裁掉; ② affine_trans_image / affine_trans_region 用的是像素坐标系(原点在左上角像素外角),和 area_center 返回的标准坐标系差 0.5 像素; ③ hom_mat2d_to_affine_par 只认官方的拼装顺序 scale → slant → rotate → translate,顺序不同就反解不回原参数。

顺带记住这几个

  • gen_contour_region_xld (Regions : Contours : Mode)Mode = 'border'(默认)/ 'center' / 'border_holes'
  • area_center_xld (XLD : : : Area, Row, Column, PointOrder),比区域版多一个绕行方向
  • orientation_xld (XLD : : : Phi)
  • reduce_domain (Image, Region : ImageReduced) —— 矩阵尺寸不变
  • crop_domain (Image : ImagePart) —— 矩阵裁到 domain 的最小外接矩形
  • full_domain (Image : ImageFull) —— 把 domain 扩回整块矩形

十、模板匹配(形状匹配)#

详见 模板匹配 形状匹配 Shape-Based Matching

算子 参数顺序 说明
create_shape_model (Template, NumLevels, AngleStart, AngleExtent, AngleStep, Optimization, Metric, Contrast, MinContrast, ModelID) 9 入 1 出 用 ROI(Template 的 domain)训练形状模型
create_scaled_shape_model (...) 多 4 个缩放参数 各向同性缩放版本
create_aniso_shape_model (Template, NumLevels, AngleStart, AngleExtent, AngleStep, ScaleRMin, ScaleRMax, ScaleRStep, ScaleCMin, ScaleCMax, ScaleCStep, Optimization, Metric, Contrast, MinContrast, ModelID) 15 入 1 出 各向异性缩放(行、列独立倍率)
find_shape_model (Image, ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness, Row, Column, Angle, Score) 10 入 4 出 查找实例
find_scaled_shape_model (...) / find_aniso_shape_model (..., ScaleRMin, ScaleRMax, ScaleCMin, ScaleCMax, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness, Row, Column, Angle, ScaleR, ScaleC, Score) —— 带缩放的查找,aniso 版多两个输出 ScaleR/ScaleC
find_shape_models (Image, ModelIDs, ...) 复数 同时匹配多个模型(比 ignore_local_polarity 更快)
get_shape_model_contours (ModelContours, ModelID, Level) Level ≥ 1,1 = 最细层 取模型轮廓用于可视化;轮廓已归一化,参考点在 (0,0)
get_shape_model_params (ModelID, NumLevels, AngleStart, ...) —— 查询创建时自动定下的参数
set_shape_model_origin (ModelID, Row, Column) —— 改模型原点(find_shape_model 不认它
set_shape_model_param (ModelID, 'border_shape_models', 'true') —— 允许模型部分出界(会变慢);全局版 set_system
inspect_shape_model (Image, ModelImages, ModelRegions, NumLevels, Contrast) —— 看每个金字塔层的模型点够不够(≥4 个
determine_shape_model_params (...) —— 自动推荐 Contrast / MinContrast 等参数
write_shape_model (ModelID, FileName) / read_shape_model (FileName, ModelID) —— 模型存盘/读取,工程里用它免掉每次重训
clear_shape_model (ModelID) —— 释放句柄

关键参数取值速记

参数 取值 含义
Metric 'use_polarity' / 'ignore_global_polarity' / 'ignore_local_polarity' / 'ignore_color_polarity' 对比度匹配规则;前三种只用单通道(静默取第一通道),第四种支持多通道
SubPixel 'none' / 'interpolation'(推荐)/ 'least_squares' / 'least_squares_high' / 'least_squares_very_high' / ['least_squares','max_deformation 2'] 亚像素精度,max_deformation 取值 0~32
NumMatches 0 = 找全部 MinScore 优先于它
Greediness 0 = 安全慢 / 1 = 快可能漏 抽稀模型点后降到 0.7~0.8
MinScore 无遮挡可 0.8~0.9 得分下限,越大越快
MaxOverlap 0~1,0 = 互不重叠 模型有对称性时要调大
Contrast 'auto'\([下,上]\)\([下,上,最小尺寸]\) 滞后阈值,第三值按成分大小抑制小碎块
MinContrast 'auto' 或数值 把模型与噪声分开

三条最容易踩的

① 角度一律是弧度,写 rad(180) 不是 180;创建与查找的角度范围必须有重叠。 ② 模型必须完全落在图像内才可能被找到;贴边也可能漏,需 set_system ('border_shape_models','true')。 ③ get_shape_model_contours 的轮廓在 \((0,0)\),回显顺序必须是 旋转(+缩放)→ 平移,颠倒就飞出画面。

十一、识别(条码 / 二维码 / OCR)#

详见 读码与 OCR 一维码 二维码 字符识别。三条链路套路一致:建句柄 → 找 → 取结果(字符串 + 区域)→ 释放

11.1 一维条码#

算子 说明
create_bar_code_model (GenParamName, GenParamValue, BarCodeHandle) 建条码模型(两个空元组即可)
find_bar_code (Image, SymbolRegions, BarCodeHandle, CodeType, DecodedDataStrings) 读码;CodeType = 'auto' 或具体码制;输出 Region
get_bar_code_result (Handle, CandidateHandle, ResultName, ResultValue) 'decoded_types' / 'decoded_strings' / 'decoded_reference' / 'orientation' / 'element_size' / 'quality_isoiec15416' / 'aborted'
get_bar_code_object (BarCodeObjects, Handle, CandidateHandle, 'symbol_regions') 取条码区域对象
set_bar_code_param (Handle, GenParamName, GenParamValue) 'element_size_min' / 'check_char''absent'/'present'/'preserved')/ 'timeout' / 'composite_code'
clear_bar_code_model (Handle) 释放

支持码制:2/5 Industrial2/5 InterleavedCodabarCode 32Code 39Code 93Code 128EAN-8EAN-13(+ Add-On 2/5)、GS1-128GS1 DataBar 系列、MSIPharmaCodeUPC-AUPC-E(+ Add-On)。

11.2 二维码 / Data Matrix#

算子 说明
create_data_code_2d_model (SymbolType, GenParamName, GenParamValue, DataCodeHandle) SymbolType'QR Code' / 'Data Matrix ECC 200' / 'Micro QR Code' / 'PDF417' / 'Aztec Code'(+ 三种 'GS1 …'
find_data_code_2d (Image, SymbolXLDs, DataCodeHandle, GenParamName, GenParamValue, ResultHandles, DecodedDataStrings) 输出是 XLD,不是 Region
set_data_code_2d_param (Handle, 'default_parameters', 'enhanced_recognition') 提识别率(更慢,专治难读的码)
clear_data_code_2d_model (Handle) 释放

11.3 文字 OCR#

算子 说明
create_text_model_reader (Mode, OCRClassifier, TextModel) Mode = 'auto'(默认,必须给分类器)/ 'manual'(忽略分类器,须自己设字符高宽)
find_text (Image, TextModel, TextResultID) 建议先 reduce_domain 圈 ROI
get_text_result (TextResultID, 'class', ResultValue) 识别出的字符串
get_text_object (Characters, TextResultID, 'all_lines') 识别到的字符区域
set_text_model_param (TextModel, 'min_char_height', 'auto' \| 数值) 限制最小字符高度,滤掉小噪声
clear_text_result (TextResultID) / clear_text_model (TextModel) 释放

分类器命名规律<字体>_<字符集>_Rej.<后缀>,如 Universal_0-9A-Z_Rej.occPharma_0-9A-Z_Rej.omc.occ = CNN.omc = MLP_Rej = 带拒绝类(工程推荐)。

四条最容易踩的

'orientation' 单位是(−180~180,逆时针为正,读取方向垂直于条纹)—— 全库独一份,用前要 rad()。 ② 条码期望浅底深码,深底浅码先 invert_image。 ③ 条码出 Region,二维码出 XLDarea_center 不能直接吃 XLD。 ④ 路径或内容含中文,先 set_system ('filename_encoding', 'utf8')

11.4 判定与工程化#

判据 写法 适合
计数 count_obj (Objs, Number) 后比数值 点个数、缺件
尺寸 abs (实测 − 标称) < 容差 长宽高、直径
面积 abs (Area − AreaRef) < 容差Diff/Area < 百分比 缺料 / 毛刺
交叉验证 两条独立链路结果是否相等 条码 vs OCR
存在性 \|结果元组\| > 0 读没读到码、找没找到

三条工程铁律

不要对浮点用 ==area_center / 测量结果都是浮点,判等几乎必然失败,必须给容差,且容差要小于最小待检缺陷。 ② 取结果前先判空find_bar_code / find_data_code_2d / find_shape_model 空手而归时返回空元组,直接 Parameter[0] 会报错。 ③ 循环里别用首图的变量read_image (Image, Files[0]) 之后再进循环 read_image (Image1, Files[Index]), 一旦循环体里漏改成 Image1,现象就是"图在变、结果不变"。详见 [[17 综合实战 五个作业题与判定逻辑]]。

十二、语言与元组#

语法 / 算子 说明
A := 1 赋值(:=),比较用 =
* 注释 整行注释,* 必须是行首第一个非空白字符
\ 续行符
[a, b, c] 构造元组
\|Tuple\| 求元组长度:num := \|Area\|
Tuple[i] 取元素,下标从 0 开始
tuple_length (Tuple, Length) 元组长度(函数形式)
'text' + num 字符串拼接(数字自动转字符串)
Value$'3.2f' 格式化输出(保留 2 位小数)
deg (Rad) / rad (Deg) 弧度 ↔ 角度
abs / max2 / min2 / sqrt / sin / cos 常用数学函数
for I := 0 to N-1 by 1 ... endfor 循环
if ... elseif ... else ... endif 判断
while ... endwhile 循环
stop () 断点暂停(配合 F6 单步)
set_system ('no_object_result', ...) 控制空结果行为
set_system ('empty_region_result', ...) 控制空区域行为
try ... catch ... endtry 异常处理

本库代码块里的\"行尾注释\"只是为了排版

官方文档原文:a comment is marked by entering an asterisk (*) as first non-whitespace character。 也就是说 HDevelop 的注释必须独占一行threshold (…) * 说明 这种写法直接粘进 HDevelop 会报语法错误。 本库不少代码块为了对齐美观把注释写在了行尾(含本页),照抄运行前请把注释挪到单独一行。 新写的笔记(如 [[13 形态学调整 结构元半径标定]])已统一改为注释独占一行。

十三、最常用的"黄金八行"#

八成以上的 Blob 任务都从这八行开始:

read_image (Image, 'xxx')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
threshold (Image, Region, MinGray, MaxGray)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', MinArea, MaxArea)
dev_clear_window ()
dev_display (Image)
dev_display (SelectedRegions)

返回:Halcon 学习地图