3.2 图像窗口随着物体移动和旋转

Halcon 中用到的仿射变换有两种:

 1. Halcon中进行仿射变换的常见步骤如下:

   (1) 通过 hom_mat2d_identity 算子创建一个初始化矩阵(即[1.0, 0.0, 0.0, 0.0, 1.0, 0.0]);

   (2) 在初始化矩阵的基础上,使用 hom_mat2d_translate(平移)、hom_mat2d_rotate(旋转)、hom_mat2d_scale(缩放)等生成仿射变换矩阵;(这几个算子可以叠加或者重复使用

   (3) 根据生成的变换矩阵执行仿射变换,执行仿射变换的算子通常有:affine_trans_image、affine_trans_region、affine_trans_contour_xld,即不管对于图像、区域、XLD 都可以执行仿射变换。

 2.  (1)  从 vector_angle_to_rigid 中通过坐标点与角度来计算仿射变换矩阵; 这种方式仅支持平移和旋转,没有缩放

     (2) 根据生成的变换矩阵执行仿射变换,执行仿射变换的算子通常有:affine_trans_image、affine_trans_region、affine_trans_contour_xld,即不管对于图像、区域、XLD 都可以执行仿射变换。

 

1. hom_mat2d_translate(平移)、hom_mat2d_rotate(旋转)、hom_mat2d_scale(缩放)这三个算子的的具体功能展示如下

hom_mat2d_translate( : : HomMat2D, Tx, Ty : HomMat2DTranslate)

hom_mat2d_rotate( : : HomMat2D, Phi, Px, Py : HomMat2DRotate)

hom_mat2d_scale( : : HomMat2D, Sx, Sy, Px, Py : HomMat2DScale)

 

2. vector_angle_to_rigid( : : Row1, Column1, Angle1, Row2, Column2, Angle2 : HomMat2D)

 

该算子意思是:先将图像旋转,旋转角度Angle2 的角度  减去  Angle1 的角度(逆时针为正), 旋转中心坐标是(Row1, Column1)。再将原图的点(Row1, Column1)一一对应移到点 (Row2, Column2)上,移动的 row 和 column 方向的位移分别是( Row2 - Row1)、( Column2 - Column1),

另外,如果 Row1 = Row2, Column1 = Column2,那么就完整等价于旋转变换。

 

采取旋转算子时旋转角度都是逆时针为正,采用弧度制

 

1. 第一种仿射变换运用


* 读取一副图像,并提取出图像中的矩形
read_image (Image, 'one.jpg')
rgb1_to_gray(Image, GrayImage)
threshold (GrayImage, Regions, 61, 140)
connection(Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 21972.9, 50000)
reduce_domain(GrayImage, SelectedRegions, ImageReduced)


* 得到矩形的中心点
area_center (ImageReduced, Area, Row, Column)
dev_set_draw ('margin')

* 平移
* hom_mat2d_translate中的两个参数的意思是:Tx和Ty分别代表Row方向和Column方向的平移量
dev_display (Image)
* 画出矩形的中心
disp_cross (200000, Row, Column, 20, 90)

hom_mat2d_identity(HomMat2DIdentity)
Tx := 200
Ty := 100
hom_mat2d_translate (HomMat2DIdentity,Tx, Ty, HomMat2DTranslate)
affine_trans_region(Regions, ImageAffineTrans, HomMat2DTranslate, 'nearest_neighbor')

* 旋转
* hom_mat2d_rotate中的三个参数的意思是:旋转角度(逆时针为正,弧度制),旋转中心的row和column值
dev_display (Image)
disp_cross (200000, Row, Column, 20, 90)
Phi := rad(20)
Px := Row
Py := Column
hom_mat2d_rotate (HomMat2DIdentity, Phi, Px, Py, HomMat2DRotate)
affine_trans_region (Regions, ImageAffineTrans, HomMat2DRotate, 'nearest_neighbor')

* 缩放
*hom_mat2d_scale中的四个参数的意思是:Sx和Sy分别代表Row方向和Column方向的缩放系数,缩放中心的row和column值
dev_display (Image)
disp_cross (200000, Row, Column, 20, 90)
Sx := 2.0
Sy := 1.05
Px := Row
Py := Column
hom_mat2d_scale (HomMat2DIdentity, Sx, Sy, Px, Py, HomMat2DScale)
affine_trans_region (Regions, RegionAffineTrans, HomMat2DScale, 'nearest_neighbor')

 

2. 第二种仿射变换运用

* 读取一副图像,并提取出图像中的矩形
read_image (Image, 'one.jpg')
rgb1_to_gray(Image, GrayImage)
threshold (GrayImage, Regions, 61, 140)
connection(Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 21972.9, 50000)
reduce_domain(GrayImage, SelectedRegions, ImageReduced)


*得到矩形的中心点
area_center (ImageReduced, Area, Row, Column)
dev_set_draw ('margin')


dev_display (Image)
* 画出矩形的中心
disp_cross (200000, Row, Column, 20, 90)

Row1 := Row
Column1 := Column
Angle1 := rad(0)
Angle2 := rad(20)
Row2 := Row + 20
Column2 := Column + 20

* 运用 vector_angle_to_rigid 进行平移、旋转
vector_angle_to_rigid(Row1, Column1, Angle1, Row2, Column2, Angle2, HomMat2D)
affine_trans_region (Regions, RegionAffineTrans, HomMat2D, 'nearest_neighbor')

 

 

图像窗口随着物体移动和旋转代码如下:

***********************************************读取模版图像*****************************************************
read_image (Image, 'C:/Users/Administrator/Desktop/halcon-笔记/配套教程/第二课 测试窗口跟随被测物体对齐/image/board-01.png')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
dev_set_draw ('margin')


***********************************************创建形状模板**************************************************
*画矩形
draw_rectangle2 (WindowHandle, Row, Column, Phi, Length1, Length2)
*生成矩形
gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)
*剪切矩形区域图像
reduce_domain (Image, Rectangle, ImageReduced)

*用创建形状模型
create_shape_model (ImageReduced, 'auto', 0, rad(360), 'auto', 'none', 'use_polarity', 30, 10, ModelID)
*create_shape_model_xld (SelectedContoursModel, 'auto', rad(0), rad(90), 'auto', 'auto', 'ignore_local_polarity', 3, ModelID)
*在模版图像中搜索模版
find_shape_model (Image, ModelID, 0, rad(360), 0.4, 1, 0, 'least_squares', 0, 0.7, ModelRow, ModelColumn, ModelAngle, ModelScore)

disp_cross(WindowHandle, ModelRow, ModelColumn, 26, ModelAngle)
*获取模版轮廓
get_shape_model_contours (ShapeModel, ModelID, 1)
stop ()



************************************************自定义测试窗口ROI*********************************************
* 假设测试pin脚之间的间距

dev_display (Image)
draw_rectangle2 (WindowHandle, Row, Column, Phi, Length1, Length2)
OffsetRow:=Row-ModelRow
OffsetColumn:=Column-ModelColumn
*根据模板坐标位置和ROI窗口生成新的测试窗口
gen_rectangle2 (Rectangle, ModelRow+OffsetRow, ModelColumn+OffsetColumn, Phi,Length1, Length2)


************************************************连续图像采集*************************************************
* Image Acquisition 01: Code generated by Image Acquisition 01
ImageFiles := []
for Index1 := 0 to 18 by 1
    if(Index1 < 10)
       ImageFiles[Index1] :=  'C:/Users/Administrator/Desktop/halcon-笔记/配套教程/第二课 测试窗口跟随被测物体对齐/image/board-0'+Index1+'.png'
    else
       ImageFiles[Index1] :=  'C:/Users/Administrator/Desktop/halcon-笔记/配套教程/第二课 测试窗口跟随被测物体对齐/image/board-'+Index1+'.png'
    endif   
endfor



**********************************************测试窗口跟随被测物体对齐******************************************
for Index := 0 to |ImageFiles| - 1 by 1
          read_image(Image, ImageFiles[Index])
          dev_display (Image)
          RowCheck:=0
          ColumnCheck:=0
          AngleCheck:=0
          Score:=0
          *在搜索图像中寻找模版
          find_shape_model (Image, ModelID, 0, rad(360), 0.4, 1, 0, 'least_squares', 0, 0.7, RowCheck, ColumnCheck, AngleCheck, Score)
          *生成2D齐次变换矩阵
          hom_mat2d_identity (HomMat2DIdentity)
          *添加偏移转换到2D齐次变换矩阵上
          hom_mat2d_translate (HomMat2DIdentity, RowCheck, ColumnCheck, HomMat2DTranslate)
          *添加旋转转换到2D齐次变换矩阵上
          hom_mat2d_rotate (HomMat2DTranslate, AngleCheck, RowCheck, ColumnCheck, HomMat2DRotate)
          *对模版形状进行仿射变换
          affine_trans_contour_xld (ShapeModel, ShapeModelTrans, HomMat2DRotate)
          *显示仿射变换后的模版形状
          dev_display (ShapeModelTrans)
          *对OffsetRow, OffsetColumn这两个坐标执行仿射变换
          affine_trans_pixel (HomMat2DRotate, OffsetRow, OffsetColumn, OutLeftRow, OutLeftColumn)
          *生成要跟随被测物的测试窗口ROI
          gen_rectangle2 (OutRectangle, OutLeftRow, OutLeftColumn, Phi+AngleCheck, Length1, Length2)
          *显示图像
          dev_display (Image)
          *显示测试窗口ROI
          dev_display (OutRectangle)
          stop()
endfor

 

参考文献:

         【1】https://www.cnblogs.com/xh6300/p/7442164.html

         【2】重码网视频系列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值