欢迎光临散文网 会员登陆 & 注册

【Halcon学习笔记】10.仿射变换(2D)

2022-07-14 19:31 作者:Ryou2  | 我要投稿

1.概述

        仿射变换,即在二维平面内,对象进行平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和剪切(Shear)等操作。

        仿射变换可以保持原来的线共点、点共线的关系不变;保持原来相互平行的线仍然平行;保持原来的中点仍然是中点;保持原来在一直线上几段线段之间的比例关系不变;但不能保持原来的线段长度和夹角角度不变。


2.相关算子

2.1 创建(创建一个空的二维空变换矩阵)

1)hom_mat2d_identity()

        HomMat2D:变换矩阵

2.2 添加(添加“旋转/缩放/平移”到变换矩阵)

1)hom_mat2d_rotate()

        HomMat2D:输入的变换矩阵

        Phi:旋转角度

        Px:旋转中心x坐标

        Py:旋转中心y坐标

        HomMat2DRotate:输出的变换矩阵

2)hom_mat2d_scale()   

        HomMat2D:输入的变换矩阵

        Sx:沿x轴缩放比例

        Sy:沿y轴缩放比例

        Px:缩放中心x坐标

        Py:缩放中心y坐标

        HomMat2DScale:输出的变换矩阵

3)hom_mat2d_translate()

        HomMat2D:输入的变换矩阵

        Tx:沿x轴平移量

        Ty:沿y轴平移量

        HomMat2DTranslate:输出的变换矩阵

2.3 计算(计算变换矩阵)

1)vector_angle_to_rigid()        //根据2个点坐标和角度计算变换矩阵(旋转/平移)

        Row1:原点行坐标

        Column1:原点列坐标

        Angle1:原点角度

        Row2:变换点行坐标

        Column2:变换点列坐标

        Angle2:变换点角度

        HomMat2D:输出的变换矩阵

2) vector_to_rigid()        //根据2个以上点坐标计算变换矩阵(旋转/平移)

        Px:原点的x坐标集

        Py:原点的y坐标集

        Qx:变换点的x坐标集

        Qy:变换点的y坐标集

        HomMat2D:输出的变换矩阵

3)vector_to_similarity()         //根据2个以上点坐标计算变换矩阵(旋转/平移/缩放)

4)vector_to_hom_mat2d()    //根据3个以上点坐标计算变换矩阵(旋转/平移/缩放/斜切)

2.4 执行(执行仿射变换)

1)affine_trans_region()                  //对区域进行二维仿射变换

        Region:待变换的额区域

        RegionAffineTrans:变换后的区域

        HomMat2D:变换矩阵

        Interpolate:插值方式

2)affine_trans_image()                   //对图像进行二维仿射变换

3)affine_trans_contour_xld()         //对XLD进行二维仿射变换

4)affine_trans_polygon_xld()         //对XLD多边形进行二维仿射变换

5)affine_trans_point_2d()                //对点进行二维仿射变换

6) affine_trans_pixel()                      //对像素进行二维仿射变换

2.5 查看(查看仿射变换参数)

1)hom_mat2d_to_affine_par()  

        HomMat2D:输入的变换矩阵

        Sx:沿x轴缩放比例

        Sy:沿y轴缩放比例

        Phi:旋转角度

        Theta:斜切角度

        Tx:沿x轴平移量

        Ty:沿y轴平移量


3.仿射变换在Halcon中的应用步骤

3.1 场景1:根据输入的参数直接生成变换矩阵

1)创建一个单位矩阵

    hom_mat2d_identity(HomMat2D)

2)输入参数,生成变换矩阵

    hom_mat2d_translate (HomMat2D, 100, 100, HomMat2DTranslate)    

3)对区域进行仿射变换

    affine_trans_region (Region, RegionTranslate, HomMat2DTranslate, 'nearest_neighbor')

3.2 场景2:根据已知的参数(点、角度)计算生成变换矩阵(区域跟随、标定)

1)设定模板图片的标记点,RowM, ColM

    read_image (ImageModel, path+'/model.jpg')  

    threshold (ImageModel, Region, 0, 50)

    connection (Region, ConnectedRegions)

    select_shape (ConnectedRegions, SelectedRegions, ['area','width'], 'and', [3000,40], [6000,70])

    opening_circle (SelectedRegions, RegionOpeningM, 9.5)

    area_center (RegionOpeningM, AreaM, RowM, ColM)

    elliptic_axis (RegionOpeningM, Ra, Rb, PhiM)

    dev_display (ImageModel)

    disp_cross (WindowHandle, RowM, ColM, 100, 0)

    disp_message(WindowHandle, 'MarkModel:'+RowM$'.0f'+','+ColM$'.0f', 'window', 0,0, 'green', 'false')

2)设定基于标记点偏移的区域,RoiM

    gen_rectangle2 (RoiM, 1026.82, 1137.46, rad(-0.150432), 177.281, 35.8157)

3)在新的图像上求出标记点,Row, Col

    read_image (Image, path+'/detect.jpg')  

    threshold (Image, Region, 0, 50)

    connection (Region, ConnectedRegions)

    select_shape (ConnectedRegions, SelectedRegions, ['area','width'], 'and',[1000,20], [8000,90])

    opening_circle (SelectedRegions, RegionOpening, 9.5)

    area_center (RegionOpening, Area, Row, Col)

    elliptic_axis (RegionOpening, Ra, Rb, Phi)

    dev_display (Image)

    disp_cross (WindowHandle, Row, Col, 100, 0)

    disp_message(WindowHandle, 'MarkImage:'+Row$'.0f'+','+Col$'.0f', 'window', 0,0, 'green', 'false')

4)根据(RowM, ColM, PhiM)和(RowM, ColM, Phi)求出变换矩阵,HomMat2D

    hom_mat2d_identity (HomMat2D)

    vector_angle_to_rigid (RowM, ColM, PhiM, Row, Col, Phi, HomMat2D)

5)对RoiM进行仿射变换

    affine_trans_region (RoiM, Roi, HomMat2D, 'nearest_neighbor')  

by Ryou2-

【Halcon学习笔记】10.仿射变换(2D)的评论 (共 条)

分享到微博请遵守国家法律