应用仿射变换

affine_trans_image

作用​:将任意仿射变换矩阵(如刚性、缩放、错切)作用到图像(Image)上,生成变换后的新图像。

算子签名:affine_trans_image( Image : ImageAffinTrans : HomMat2D, Interpolation, AdaptImageSize : )

  • 输入参数:

    • Image(输入对象): 原始输入图像
  • 输出参数:
    • ImageAffineTrans(输出对象):变换后的输出图像。
  • 控制参数:
    • HomMat2D (输入控制): 仿射变换矩阵
    • Interpolation (输入控制):插值方式(如 'bilinear', 'constant')
    • AdaptImageSize(输入控制):是否自动调整输出图像尺寸('true'/'false')
方法 插值质量 速度 抗锯齿效果(缩放<1) 适用方法
nearest_neighbor 最低 极快 二值图像/实时
bilinear 标准中等(放大优) 通用变换
bicubic 最高(放大优) 高质量放大
constant 中等 中等 均值滤波 抗锯齿缩小
weighted 最高(缩小优) 最慢 高斯滤波 高质量缩小

AdaptImageSize = 'false'(默认)

  • 输出图像尺寸​​ 保持与原图相同
  • 超出原图边界的变换部分会被​ ​裁剪​​
  • 变换后空白区域用Grayval参数填充(默认为0)
  • 坐标系不变

AdaptImageSize = 'true'

  • 输出图像尺寸​​自动调整​​以完整包含变换后图像
  • 原图所有数据均保留(无裁剪)
  • 坐标系原点仍为(0,0),但图像宽高扩展
  • 原点移至新左上角
Hobject imgIn, imgOut;
affine_trans_image(imgIn, &imgOut, homMat, "bilinear", "true");
// 输出图像尺寸自动适配变换结果

affine_trans_region

作用​:将仿射变换矩阵作用到区域(Region)上,生成变换后的新区域。

算子签名:affine_trans_region( Regions : RegionAffineTrans : HomMat2D, Interpolate)

  • 输入参数:

    • Region(输入对象):输入区域(ROI)元组
  • 输出参数:
    • RegionAffineTrans(输出对象):变换后的输出区域元组。
  • 控制参数:
    • HomMat2D (输入控制): 仿射变换矩阵
    • Interpolation (输入控制):插值方式(如 'bilinear', 'constant')
Hobject regionIn, regionOut;
affine_trans_region(regionIn, &regionOut, homMat, "nearest_neighbor");
// 区域变换使用最近邻插值

affine_trans_contour_xld

作用​:处理亚像素精度的XLD轮廓(如边缘检测结果),保持原始精度。

算子签名:affine_trans_contour_xld(Contours : ContoursAffineTrans : HomMat2D)

  • 输入参数:

    • Contours(输入对象):输入轮廓(XLD)元组
  • 输出参数:
    • ContoursAffineTrans(输出对象):变换后的输出轮廓元组。
  • 控制参数:
    • HomMat2D (输入控制): 仿射变换矩阵
Hobject contoursIn, contoursOut;
affine_trans_contour_xld(contoursIn, &contoursOut, homMat);
// 轮廓变换保持原始精度

模板匹配

create_shape_model

作用:形状匹配模板创建的核心算子,基于输入图像的特征生成一个可用于后续匹配的模型

算子签名:create_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Optimization, Metric, Contrast, MinContrast : ModelID)

  • 输入参数:

    • TemplateImage(输入对象):输入区域(Image)
  • 输出参数:

    • ModelID(输出对象):模型句柄
  • 控制参数:

    • NumLevels(输入控制):金字塔层数

    • AngleStart (输入控制):起始角度

    • AngleExtent(输入控制):角度范围

    • AngleStep(输入控制):角度步长("auto":Halcon 自动计算最优步长(推荐)

    • Optimization(输入控制):优化选项,减少模型内存占用并加速匹配,"auto"自动平衡

    • Metric(输入控制):控制匹配时如何处理图像边缘的灰度值极性,'use_polarity' (最严格模式)

    • Contrast(输入控制):对比度参数 特征点选择的梯度阈值,创建模型时,边缘梯度>=此值的点才会被纳入模型

    • MinContrast(输入控制):最小对比度,匹配时,图像边缘梯度>=此值才参与计算,MinContrast = max(10, 图像平均梯度 × 0.3)

    说明
    'use_polarity' 最严格模式:图像边缘明暗变化必须与模板完全一致
    'ignore_global_polarity' 忽略整体明暗反转:允许亮变暗/暗变亮的全局翻转
    'ignore_local_polarity' 忽略局部明暗反转:允许部分区域的明暗关系翻转
    'ignore_color_polarity' 彩色图像专用:允许单个颜色通道的极性翻转
// 必须是单通道灰度图像
HalconCpp::HObject imgGray = origImage.ConvertImageType("byte");
// 推荐使用 reduce_domain 裁剪出精确 ROI 区域
HalconCpp::HObject roi = imgGray.ReduceDomain(selectedROI);
HalconCpp::HTuple modelID;
CreateShapeModel(roi, ... , &modelID);

create_scaled_shape_model

作用:用于创建支持缩放的形状匹配模型

算子签名:create_scaled_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, ScaleMin, ScaleMax, ScaleStep, Optimization, Metric, Contrast, MinContrast : ModelID)

  • 输入参数:

    • Template(输入对象):区域图像(Image)
  • 输出参数:
    • ModelID(输出对象):模型句柄
  • 输入控制:
    • NumLevels(输入控制):金字塔层数

    • AngleStart (输入控制):起始角度

    • AngleExtent(输入控制):角度范围

    • AngleStep(输入控制):角度步长("auto":Halcon 自动计算最优步长(推荐)

    • ScaleMin(输入控制): 最小缩放比

    • ScaleMax(输入控制): 最大缩放比

    • ScaleStep(输入控制):缩放步长,设定缩放维度上的采样精度"auto":Halcon自动计算最优步长

    • Optimization(输入控制):优化选项,减少模型内存占用并加速匹配,"auto"自动平衡

    • Metric(输入控制):控制匹配时如何处理图像边缘的灰度值极性,'use_polarity' (最严格模式)

    • Contrast(输入控制):对比度参数 特征点选择的梯度阈值,创建模型时,边缘梯度>=此值的点才会被纳入模型

    • MinContrast(输入控制):最小对比度,匹配时,图像边缘梯度>=此值才参与计算,MinContrast = max(10, 图像平均梯度 × 0.3)

Optimization 优化选项:

优化选项 处理方式 内存占用 创建速度 匹配速度
"auto" 自动选择最优策略,推荐 中等 中等
"none" 无优化,完整生成所有变体 最高 最慢 最快
"no_pregeneration" 不预生成变换模型 最低 最快 最慢
"point_reduction_low" 轻度减少模型点数 较高 较慢 最高
"point_reduction_medium" 中度减少模型点数 中等 中等
"point_reduction_high" 高度减少模型点数 中等
"pregeneration" 预生成所有变换模型 最高 最慢 最快
// 最佳实践:提取精确ROI区域
HalconCpp::HObject roi = image.ReduceDomain(regionOfInterest);
HalconCpp::Emphasize(roi, &roiEnhanced, 7, 7, 1.5); // 增强边缘对比度
HalconCpp::CreateScaledShapeModel(
templateROI, // 精确裁剪的ROI区域
"auto", // 自动金字塔层级
rad(-30), rad(60), // ±30°旋转范围
"auto", // 自动角度步进
0.8, 1.2, // 80%~120%缩放范围
"auto", // 自动缩放步进
"point_reduction_medium",// 中等优化
"ignore_global_polarity",// 忽略全局明暗反转
"auto", // 自动对比度阈值
8, // 最小对比度
&modelID
);
  • 清理资源:clear_shape_model (ModelID)

create_ncc_model

作用:创建基于​​归一化互相关​​的匹配模型,适用于光照变化但无几何形变的场景。匹配时通过计算图像与模板的归一化互相关值来定位目标。

算子签名:create_ncc_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Metric: ModelID)

  • 输入参数:

    • Template(输入对象):模板图像(灰度图像)
  • 输出参数:

    • ModelID(输出对象):模型句柄
  • 输入控制:

    • NumLevels(输入控制):金字塔层数

    • AngleStart (输入控制):起始角度

    • AngleExtent(输入控制):角度范围

    • AngleStep(输入控制):角度步长("auto":Halcon 自动计算最优步长(推荐)

    • Metric(输入控制):控制匹配时如何处理图像边缘的灰度值极性,'use_polarity' (最严格模式),'ignore_global_polarity'

  • 清理资源:clear_ncc_model (ModelID)

find_shape_model 基础形状匹配

作用:在输入图像中搜索模板,返回匹配结果。

算子签名:find_shape_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, Score)

  • 输入参数:

    • Image(输入对象):待匹配图像(灰度图像)
    • ModelID(输入对象):模板模型句柄
  • 输入控制:
    • AngleStart (输入控制):起始角度
    • AngleExtent(输入控制):角度范围
    • MinScore(输入控制):最小匹配得分
    • NumMatches(输入控制):最大匹配数
    • MaxOverlap(输入控制):最大重叠度
    • subPixel(输入控制):是否使用亚像素精度
    • NumLevels(输入控制):金字塔层数
    • Greediness(输入控制):搜索策略,0~1,越大越保守,越小越宽松,0:完全随机搜索,1:完全全局搜索
  • 输出参数:
    • Row(输出对象):匹配结果的行坐标
    • Column(输出对象):匹配结果的列坐标
    • Angle(输出对象):匹配结果的旋转角度
    • Score(输出对象):匹配结果的得分

find_scaled_shape_model 可缩放形状匹配

作用:在输入图像中搜索模板,返回匹配结果。

算子签名:find_scaled_shape_model(Image : : ModelID, AngleStart, AngleExtent, ScaleMin, ScaleMax, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, Scale, Score)

  • 输入参数:

    • Image(输入对象):待匹配图像(灰度图像)
    • ModelID(输入对象):模板模型句柄
  • 输入控制:
    • AngleStart (输入控制):起始角度
    • AngleExtent(输入控制):角度范围
    • ScaleMin(输入控制): 最小缩放比
    • ScaleMax(输入控制): 最大缩放比
    • MinScore(输入控制):最小匹配得分
    • NumMatches(输入控制):最大匹配数
    • MaxOverlap(输入控制):最大重叠度
    • SubPixel(输入控制):是否使用亚像素精度(拥有众多选项,推荐使用'least_squares'
    • NumLevels(输入控制):金字塔层数
    • Greediness(输入控制):搜索策略,0~1,越大越保守,越小越宽松,0:完全随机搜索,1:完全全局搜索
  • 输出参数:
    • Row(输出对象):匹配结果的行坐标
    • Column(输出对象):匹配结果的列坐标
    • Angle(输出对象):匹配结果的旋转角度
    • Scale(输出对象):匹配结果的缩放比例
    • Score(输出对象):匹配结果的得分

find_ncc_model 灰度模板匹配

作用:在输入图像中搜索灰度模板,返回匹配结果。

算子签名:find_ncc_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels : Row, Column, Angle, Score)

  • 输入参数:

    • Image(输入对象):待匹配图像(灰度图像)
    • ModelID(输入对象):模板模型句柄
  • 输入控制:
    • AngleStart (输入控制):起始角度
    • AngleExtent(输入控制):角度范围
    • MinScore(输入控制):最小匹配得分
    • NumMatches(输入控制):最大匹配数
    • MaxOverlap(输入控制):最大重叠度
    • SubPixel(输入控制):是否使用亚像素精度(只有true和false)
    • NumLevels(输入控制):金字塔层数
  • 输出参数:
    • Row(输出对象):匹配结果的行坐标
    • Column(输出对象):匹配结果的列坐标
    • Angle(输出对象):匹配结果的旋转角度
    • Score(输出对象):匹配结果的得分

SubPixel参数在匹配中的作用

  • 'none'(或'false'):不使用亚像素精度,仅使用整数坐标
  • 'interpolation'(或'true'):插值亚像素,对分数函数插值
  • 'least_squares':使用最小二乘法拟合,精度高,但速度慢
  • 'least_squares_high':高精度最小二乘法拟合,速度慢,但精度高

inspect_shape_model 特征检查

作用:存储了从模板图像中提取的关键特征信息(主要是边缘或轮廓及其梯度方向),并根据设定的金字塔层级(NumLevels)构建了多尺度表示。

算子签名:inspect_shape_model(Image : ModelImages, ModelRegions : NumLevels, Contrast:)

  • 输入参数:

    • Image(输入对象):模板图像(灰度图像)
  • 输出参数:
    • ModelImages(输出对象) :输出的模型可视化图像,图像元组,每个元素对应一个有效的金字塔层级(从最低分辨率/最高层级开始)
    • ModelRegions(输出对象):输出的模型区域,区域元组,每个元素对应一个有效的金字塔层级,模型特征所覆盖的范围。
  • 输入控制:
    • NumLevels(输入控制):金字塔层数,这个参数必须与之前调用 create_shape_model 时使用的 NumLevels 参数完全一致。它告诉算子要生成多少个层级的可视化结果
    • Contrast(输入控制):对比度阈值,这个参数必须与之前调用 create_shape_model 时使用的 Contrast 参数(或 MinContrast)完全一致。它决定了哪些边缘梯度强度的点会被纳入模型。可视化结果直接反映了这个阈值的效果。

如何使用inspect_shape_model?

  • 创建形状模型: 首先,使用 create_shape_model 或 create_scaled_shape_model 等算子创建你的形状模型 (ModelID),并指定好 NumLevels 和 Contrast 参数。
read_image(Image, 'part_template.png')
// 定义ROI (Region of Interest)
gen_rectangle1(Rectangle, 100, 100, 300, 400)
reduce_domain(Image, Rectangle, TemplateImage)
// 创建模型,假设使用默认参数的一部分
create_shape_model(TemplateImage, 'auto', -0.39, 0.79, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
// 获取创建模型时实际使用的参数(可选,但推荐)
get_shape_model_params(ModelID, 'num_levels', UsedNumLevels)
get_shape_model_params(ModelID, 'contrast', UsedContrast)
  • 调用 inspect_shape_model: 使用创建模型时用的原始模板图像和完全相同的 NumLevels 和 Contrast 参数值。
// 使用原始模板图像和创建时记录的参数
inspect_shape_model(TemplateImage, ModelImages, ModelRegions, UsedNumLevels, UsedContrast)

get_shape_model_origin

作用:获取形状模型的参考点(原点)坐标。

算子签名:get_shape_model_origin(ModelID : Row, Column)

  • 输入参数:

    • ModelID(输入对象):模板模型句柄
  • 输出参数:
    • Row(输出对象):模型参考点的行坐标
    • Column(输出对象):模型参考点的列坐标

当你使用 find_shape_model 找到目标时,返回的位置 (Row, Column) 就是模型参考点在搜索图像中的坐标位置。

模型的所有内部表示(特征点、轮廓)的位置都是相对于这个参考点定义的。

变换轮廓: 当配合 get_shape_model_contours 获取模型轮廓时,需要知道参考点才能将这些轮廓(定义在模型坐标系中)正确地变换到搜索图像中的实际位置。

get_shape_model_contours

作用:获取形状模型的轮廓。

算子签名:get_shape_model_contours(Contours : ModelID, NumLevels)

  • 输入参数:

    • ModelID(输入对象):模板模型句柄
    • NumLevels(输入控制):金字塔层数
  • 输出参数:
    • Contours(输出对象):模型轮廓,轮廓元组,每个元素对应一个有效的金字塔层级,每个轮廓包含多个点,每个点包含两个坐标值。

可视化匹配结果:

在 find_shape_model 找到目标后,你可以获取模型轮廓,然后根据匹配到的位姿(位置 Row, Column 和角度 Angle)将这个轮廓变换到搜索图像上并绘制出来

案例展示

对模版进行匹配并展示匹配结果

// 读取图像
read_image (EraserFind, 'C:/Users/Administrator/Desktop/test/Eraser_Find.jpg') // 初始特征检查(可选)
inspect_shape_model (EraserFind, ModelImages, ModelRegions, 1, 60) // --- 1. 定义橡皮擦区域 ---
gen_rectangle1 (ROI_0, 1491.71, 1793.4, 1518.99, 1812.65)
gen_rectangle1 (TMP_Region, 1495.66, 776.635, 1503.63, 788.972)
union2 (ROI_0, TMP_Region, ROI) // --- 2. 创建掩膜区域 ---
get_domain (EraserFind, Domain)
difference (Domain, ROI, RegionDifference) // 从全图减去橡皮擦区域
reduce_domain (EraserFind, RegionDifference, ImageReduced) // 限制图像域 // --- 3. 创建模板 ---
// 可选:检查掩膜后的特征
inspect_shape_model (ImageReduced, \
ModelImages1, ModelRegions1, 1, 60)
// 创建形状模板
create_shape_model (ImageReduced, 'auto', \
-0.39, 0.79, 'auto', 'auto', 'use_polarity', 80, 60, ModelID) // 创建模型后获取实际参考点
get_shape_model_origin (ModelID, ModelOriginRow, ModelOriginCol) // 获取模板轮廓(在模型坐标系下)
get_shape_model_contours (ModelContours, ModelID, 1) // 循环读图片并搜索模板
list_files ('C:/Users/Administrator/Desktop/test', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
read_image (Image, ImageFiles[Index]) // 在掩膜图像上搜索模板 ---
find_shape_model (Image, ModelID, -0.39, 0.78, 0.3, 1, 0.5,
'least_squares', 0, 0.9, Row, Column, Angle, Score) // 对每个匹配实例
for i := 0 to |Score|-1 by 1
// 计算从模型原点(0,0)到匹配位置(Row,Column)的变换矩阵
vector_angle_to_rigid (ModelOriginRow, ModelOriginCol, 0, Row, Column, Angle, HomMat2D) // 将模板轮廓变换到匹配位置
affine_trans_contour_xld (ModelContours, ContoursAffinTrans, HomMat2D)
endfor
endfor

注意事项

  • 在创建仿射变换矩阵时,如果参考点不对时,会导致轮廓匹配的位置出现偏差
  • 如何确定参考点?
    • Halcon的默认行为:当没有显示设置参考点时,create_shape_model 会自动选择图像域中心设置为(0,0)
    • 存在一定的风险,因此可以显式地获取参考点信息,并在后续操作中使用
    • 参考点信息可以通过 get_shape_model_origin 获取

Halcon 应用仿射变换的更多相关文章

  1. halcon几何变换(仿射变换)

    旋转.平移.镜像.缩放.斜切,可参考https://blog.csdn.net/machaoyu86/article/details/51182473 仿射变换前,需要获得仿射变换矩阵. 关于shap ...

  2. Halcon二维仿射变换实例探究

    二维仿射变换,顾名思义就是在二维平面内,对对象进行平移.旋转.缩放等变换的行为(当然还有其他的变换,这里仅论述这三种最常见的). Halcon中进行仿射变换的常见步骤如下: ① 通过hom_mat2d ...

  3. Halcon 学习笔记3 仿射变换

    像素的减少 开运算(较少) 腐蚀(去除更多) 对灰度图像的开运算或腐蚀 相当于将灰度图像变暗 像素增加 闭运算(较少) 膨胀(较多) 对灰度图像的闭运算或膨胀 相当于将灰度图像变亮 仿射变换 另外一种 ...

  4. 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数015,vector矢量

    <zw版·Halcon-delphi系列原创教程> Halcon分类函数015,vector矢量 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“p ...

  5. 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数016,xld,xld轮廓

    <zw版·Halcon-delphi系列原创教程> Halcon分类函数016,xld,xld轮廓 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“ ...

  6. halcon算子

    halcon的算子列表   Chapter 1 :Classification 1.1 Gaussian-Mixture-Models 1.add_sample_class_gmm 功能:把一个训练样 ...

  7. 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数012,polygon,多边形

    <zw版·Halcon-delphi系列原创教程> Halcon分类函数012,polygon,多边形 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换 ...

  8. halcon的算子列表

    Chapter 1 :Classification 1.1 Gaussian-Mixture-Models 1.add_sample_class_gmm 功能:把一个训练样本添加到一个高斯混合模型的训 ...

  9. 《zw版·delphi与halcon系列原创教程》zw版_THOperatorSetX控件函数列表 v11中文增强版

    <zw版·delphi与halcon系列原创教程>zw版_THOperatorSetX控件函数列表v11中文增强版 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就 ...

  10. halcon的性能

    ·满足您各类机器视觉应用需求的完善的开发库 ·包含匹配,识别,定位及1D,2D,3D测量等多种高级算法 ·强大,易用的工具加速您的开发进程 ·与Linux/UNI及Windows(包括×64)兼容,避 ...

随机推荐

  1. SQL Server 插入自增列

    set identity_insert t on insert into t (id, name) values(1, 'sqlstudy') set identity_insert t off ht ...

  2. 学习spring cloud记录12-Feign常用自定义配置

    前言 Feign被springboot自动装配,但是Feign也提供了可自定义修改配置,常用的修改是修改日志级别等,下面记录常用的配置. 知识 Feign常用自定义配置 类型 作用 说明 feign. ...

  3. 使用自然语言体验对话式MySQL数据库运维

    大模型作为数据库管理的新界面 现代大型语言模型(LLM)本质上是一个经过深度训练的智能知识库,其显著特征包括: 全领域知识覆盖:内化了包括MySQL.PostgreSQL.MongoDB等各类数据库系 ...

  4. 01数字IC综合

    数字IC设计综合入门 目录 数字IC设计综合入门 目录 1. 什么是数字IC综合? 2. 综合EDA工具简介 3. 综合的输入文件 (Inputs) 3.1 RTL代码 (Verilog/VHDL) ...

  5. 前端开发系列121-进阶篇之defineProperty

    本文介绍`Object.defineProperty()`方法,并基于此简单讨论数据劫持的实现方案. defineProperty Object.getOwnPropertyDescriptor(ta ...

  6. JavaScript 异步编程指南:async/await 与 Promise 该怎么选?

    在 JavaScript 开发中,异步操作就像家常便饭 -- 从调用后端 API 到读取本地文件,几乎无处不在.但很多开发者都会困惑:到底该用 Promise 的链式调用,还是 async/await ...

  7. MVCC 快照读, readView,

    简介 参考链接 以作记录 https://www.jianshu.com/p/8845ddca3b23

  8. 华为机试题 求最大连续bit数

    简介 c = c++ ? c = ++c ? code #include <iostream> #include <string> using namespace std; i ...

  9. Linguistics-English-单词本-Cluster单词簇: -dox:教派观点 + don-:给予 + -duce:引导 + Obvious:明显的 + Frequently:频繁的 + Stop:阻止

    How much money has been spent on research and development ? It's not to say every single dollar or p ...

  10. SciTech-EECS-电路设计- PCB设计-PCB设计流程 + 元器件封装设计 + PCB设计规则 +PCB布局/布线/覆铜等设计

    PCB(印刷电路板)设计, 是以"电路原理图"为根据实现电路设计者所需要的功能. "PCB设计"主要指"版图设计", 需要考虑: " ...