【机械视觉】Halcon—【六、交集并集差集和仿射变换、透视矩阵】

发布于:2025-06-04 ⋅ 阅读:(20) ⋅ 点赞:(0)

【机械视觉】Halcon—【六、交集并集差集和仿射变换、透视矩阵】

目录

【机械视觉】Halcon—【六、交集并集差集和仿射变换、透视矩阵】

介绍

交集并集差集介绍:

1. 交集(Intersection)

2. 并集(Union)

3. 差集(Difference)

交集并集差集实例

仿射变换

介绍

例子:

旋转变换例子:

平移、缩放、斜切变换例子

Vector_angle_to_rigid-既可以旋转-也可以实现平移

多次变换实例

根据两个以上特征点进行仿射变换

根据三个以上特征点进行仿射变换

获取仿射矩形坐标参数

透视矩阵


介绍

在图像处理和计算机视觉领域,交集、并集和差集是基本的集合操作,它们在图像分析中尤为重要,特别是在图像分割、特征提取和对象识别等任务中。Halcon(现为MVTEC Vision++)是一个强大的机器视觉软件,提供了丰富的图像处理函数,可以用来执行这些集合操作。

交集并集差集介绍:

1. 交集(Intersection)

交集操作是指两个图像或图像区域的重叠部分。在Halcon中,可以使用intersection函数来获取两个区域的交集。

示例代码:

read_image(Image1, 'path_to_image1')

read_image(Image2, 'path_to_image2')

intersection(Image1, Image2, ImageIntersection)

这里,ImageIntersection将包含Image1Image2的交集部分。

2. 并集(Union)

并集操作是指两个图像或图像区域的合并部分,包括它们重叠的部分。在Halcon中,可以使用union1union2函数来获取两个区域的并集。

示例代码:

read_image(Image1, 'path_to_image1')

read_image(Image2, 'path_to_image2')

union1(Image1, Image2, ImageUnion)

或者使用union2

union2(Image1, Image2, ImageUnion)

这里,ImageUnion将包含Image1Image2的并集部分。

3. 差集(Difference)

差集操作是指从一个图像或图像区域中减去另一个图像或图像区域的部分。在Halcon中,可以使用difference函数来获取差集。

示例代码:

read_image(Image1, 'path_to_image1')

read_image(Image2, 'path_to_image2')

difference(Image1, Image2, ImageDifference)

这里,ImageDifference将包含在Image1中但不在Image2中的部分。

交集并集差集实例

dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
read_image (Image, 'clip')
threshold (Image, Region, 0, 128)

*connection算子是Halcon中用于区域连通性分析的核心算子,它能够:
    * 将输入区域分割成互不连通的独立区域
    * 识别并标记图像中所有的连通组件
    * 为后续的形状选择和特征分析提供基础
connection (Region, ConnectedRegions)

* 合并区域
union1 (ConnectedRegions, RegionUnion)

gen_circle (Circle, 200, 200, 100.5)
gen_circle (Circle1, 300, 200, 90.5)


* 交集
intersection (Circle, Circle1, RegionIntersection)

* 反选
complement (Circle, RegionComplement)

* 差集
difference (Circle, Circle1, RegionDifference)


dev_clear_window ()
dev_display (RegionComplement)

仿射变换

介绍

在Halcon中,仿射变换是一种常用的图像处理技术,用于对图像进行缩放、旋转、平移、斜切等操作。Halcon是一个强大的机器视觉软件库,它提供了丰富的函数来执行各种图像处理任务,包括仿射变换。

例子:

仿射变换分为三步: 初始化矩阵--->旋转变换---->应用

* 第一步先创建一个初始化的矩阵(齐次矩阵)
hom_mat2d_identity (HomMat2DIdentity)
* 第二步旋转变换
* 参数1 原始的矩阵
* 参数2 旋转的弧度数 rad(90)
* 参数3 变换的中心点
* 参数4 生成的旋转的变换矩阵
hom_mat2d_rotate (HomMat2DIdentity, rad(30), Row, Column, HomMat2DRotate)

* 第三步 旋转矩阵应用到图片上
* 参数1 应用到的图片
* 参数2 输出图片
* 参数3 要应用的旋转矩阵
* 参数4 边界的处理方式
    * 'constant' 填充空白区域为灰色的
* 参数5 是否自动适应变换结果
    * 'false' 输出图和输入图像尺寸一样
    * 'true' 自动调整尺寸以显示完整的变换结果
affine_trans_image (Image, ImageAffineTrans, HomMat2DRotate, 'constant', 'false')

旋转变换例子:

* 仿射变换就是在图形中的变换包括: 平移、缩放、旋转、斜切(将斜体字导正)
dev_clear_window ()
read_image (Image, 'C:/Users/86152/Desktop/HALCON/一、课件/2025.5.29-/yuanx.jpg')

* 获取图像中心点
area_center (Image, Area, Row, Column)

* 第一步先创建一个初始化的矩阵(齐次矩阵)
hom_mat2d_identity (HomMat2DIdentity)
* 第二步旋转变换
* 参数1 原始的矩阵
* 参数2 旋转的弧度数 rad(90)
* 参数3 变换的中心点
* 参数4 生成的旋转的变换矩阵
hom_mat2d_rotate (HomMat2DIdentity, rad(30), Row, Column, HomMat2DRotate)

* 第三步 旋转矩阵应用到图片上
* 参数1 应用到的图片
* 参数2 输出图片
* 参数3 要应用的旋转矩阵
* 参数4 边界的处理方式
    * 'constant' 填充空白区域为灰色的
* 参数5 是否自动适应变换结果
    * 'false' 输出图和输入图像尺寸一样
    * 'true' 自动调整尺寸以显示完整的变换结果
affine_trans_image (Image, ImageAffineTrans, HomMat2DRotate, 'constant', 'false')

平移、缩放、斜切变换例子

dev_clear_window ()
read_image (Image, 'C:/Users/86152/Desktop/HALCON/一、课件/2025.5.29-/yuanx.jpg')

* 1 创建一个初始化矩阵
hom_mat2d_identity (HomMat2DIdentity)

* 2 创建一个平移矩阵
* 参数2 竖直方向移动
* 参数3 水平移动
*hom_mat2d_translate (HomMat2DIdentity, 64, 0, HomMat2DTranslate)

* 3 应用平移矩阵
*affine_trans_image (Image, ImageAffineTrans, HomMat2DTranslate, 'constant', 'false')


* -------------------------------------------
* 缩放变换
* 参数2、3  水平和竖直方向缩放的倍数
* 参数4、5  变换的中心点
*hom_mat2d_scale (HomMat2DIdentity, 2, 2, 0, 0, HomMat2DScale)
*affine_trans_image (Image, ImageAffineTrans1, HomMat2DScale, 'constant', 'false')


*-------------------------------------------
* 斜切变换
hom_mat2d_slant (HomMat2DIdentity, rad(20), 'x', 0, 0, HomMat2DSlant)

affine_trans_image (Image, ImageAffineTrans, HomMat2DSlant, 'constant', 'false')

Vector_angle_to_rigid-既可以旋转-也可以实现平移

dev_clear_window ()
read_image (Image, 'C:/Users/86152/Desktop/HALCON/一、课件/2025.5.29-/车牌.png')
* 获取图片中心坐标
area_center (Image, Area, Row, Column)
* 获取角度
orientation_region (Image, Phi)

* 求平移或旋转矩阵
* 参数1、2  起始点的变换中心
* 参数3  原始图片旋转角度
* 参数4、5  变换到的位置
* 参数6 变换之后的角度
vector_angle_to_rigid (Row,Column,Phi ,Row ,Column ,rad(190) , HomMat2D)
affine_trans_image (Image, ImageAffineTrans, HomMat2D, 'constant', 'false')

多次变换实例

read_image (Image, 'C:/Users/86152/Desktop/HALCON/一、课件/2025.5.29-/三角.png')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)

threshold (Image, Region, 128, 255)
connection (Region, ConnectedRegions)
* 合并两个区域
*union1 (ConnectedRegions, RegionUnion)

* 获取连通区域的中心位置
area_center (Region, Area, Row, Column)
* 如果使用vector_angle_to_rigid算子 需要先获取初始角
*orientation_region (Region, Phi)

* 生成一个初始化矩阵
hom_mat2d_identity (HomMat2DIdentity)
* 先做平移变换
hom_mat2d_translate (HomMat2DIdentity, 200, 100, HomMat2DTranslate)
affine_trans_image (Image, ImageAffineTrans_one, HomMat2DTranslate, 'constant', 'false')
dev_display (ImageAffineTrans_one)


* 再次平移
hom_mat2d_translate (HomMat2DIdentity, 0, 270, HomMat2DTranslate1)
affine_trans_image (Image, ImageAffineTrans_two, HomMat2DTranslate1, 'constant', 'false')
dev_display (ImageAffineTrans_two)

a:=Row+200
* 在上一次基础之上再做变换
hom_mat2d_rotate (HomMat2DIdentity, rad(180), 87,350, HomMat2DRotate)
affine_trans_image (ImageAffineTrans_two, ImageAffineTrans_three, HomMat2DRotate, 'constant', 'false')
dev_display (ImageAffineTrans_three)

根据两个以上特征点进行仿射变换

*绘制椭圆的轮廓
*参数2 参数3 圆心坐标
*参数4 椭圆的主轴旋转度 0 主轴为水平轴,rad(90)主轴为竖直轴
*参数5 。参数6 主轴的半径大小    另外一个轴方向半径大小
*参数'positive' 顺时针方向产生点 ,negative 逆时针产生点
*最后一个1.5参数 每隔1.5产生一个点
gen_ellipse_contour_xld (ContEllipse, 70, 100, 0, 70, 90, 0, rad(360), 'positive', 1.5)

*获取轮廓
*Row 行坐标的元组
*Col 列坐标的元组
get_contour_xld (ContEllipse, Row, Col)

*根据多个点生成一个仿射矩阵
* Px 源点的列的坐标元组
* Py 源点的行的坐标元组
* Qx 目标点的列的坐标元组
* Qy 目标点的行的坐标元组、
*HomMat2D 生成的矩阵
vector_to_rigid (Col, Row, Col, Row, HomMat2D)

*对HomMat2D矩阵再进行其他变换
hom_mat2d_identity (HomMat2DIdentity)
*对HomMat2D矩阵再进行其他变换
hom_mat2d_rotate (HomMat2D,rad(90), 70, 100, HomMat2DRotate)
*把仿射矩阵应用到轮廓上
affine_trans_contour_xld (ContEllipse, ContoursAffineTrans, HomMat2DRotate)

根据三个以上特征点进行仿射变换

*假设 图像坐标
Row:=[100,200,300,400,500] 
Col:=[1,2,3,4,5]

*假设机器人坐标
R1:=[1,2,3,4,5]
C1:=[3,3,4,4,6]
*最少是三个特征点,把(Row,Col)->(R1,C1)计算一个仿射矩阵的作用
vector_to_hom_mat2d (Row,Col ,R1, C1, HomMat2D)


*假设再有图像坐标 (500,200), 转成物理坐标, 
affine_trans_point_2d (HomMat2D, 500, 200, Qx, Qy)


*物理坐标 Qx, Qy, 转成图像坐标
*先对HomMat2D 生成一个逆矩阵
hom_mat2d_invert (HomMat2D, HomMat2DInvert)
affine_trans_point_2d (HomMat2DInvert, Qx, Qy, Qx1, Qy1)

获取仿射矩形坐标参数

hom_mat2d_identity (HomMat2DIdentity)
hom_mat2d_rotate (HomMat2DIdentity, 0.78, 0, 0, HomMat2DRotate)
hom_mat2d_scale (HomMat2DRotate, 2, 2, 0, 0, HomMat2DScale)
hom_mat2d_slant (HomMat2DScale, 0.78, 'x', 0, 0, HomMat2DSlant)
hom_mat2d_translate (HomMat2DSlant, 64, 64, HomMat2DTranslate)
*获取仿射矩阵的参数值
*Sx:水平方向缩放
*Sy 竖直方向的缩放
*phi 代表仿射矩阵的旋转角度
*heta:斜切
*Tx, 平移的值
*Ty 平移的y值
hom_mat2d_to_affine_par (HomMat2DTranslate, Sx, Sy, Phi, Theta, Tx, Ty)

透视矩阵

在Halcon中,透视矩阵(也称为投影矩阵)通常用于图像处理中,特别是在相机校正和3D视觉中。透视矩阵可以用来将图像从一个视角变换到另一个视角,或者将图像中的点从一种坐标系统映射到另一种坐标系统。在Halcon中,你可以使用多种方法来创建和使用透视矩阵。

read_image (Image, '1.png')
Row:=[159,277,357,77]
Col:=[127,120,360,333]

* 生成一个透视矩阵
* Px: 标注投影的起始点Row坐标 至少4个(原先图的4个角的row坐标) 按照顺序取写几个点坐标
* py: 标注投影的起始点Col坐标 至少4个(原先图的4个角的Col坐标) 按照顺序去写几个点坐标
* pw: 起始点权重元素为[1,1,1,1]或者[0,0,0,0]
* Qx  目标点Row坐标  至少4个
* Qy  目标点Col坐标  至少4个
* Qw  目标点权重
* Method: 计算方式 normalized_dlt 标准计算法
* HomMat2d 得到仿射矩阵
hom_vector_to_proj_hom_mat2d (Row, Col,[1,1,1,1] ,[75,360,360,75] ,[110,110,360,360] ,[1,1,1,1] , 'normalized_dlt', HomMat2D)

* 使用仿射透视矩阵
* 参数5 是否适应变换之后大小
projective_trans_image (Image, TransImage, HomMat2D, 'bilinear', 'false', 'false')

效果: 


网站公告

今日签到

点亮在社区的每一天
去签到