Halcon二维仿射变换实例

二维仿射

二维仿射变换,顾名思义就是在二维平面内,对对象进行平移、旋转、缩放等变换的行为(当然还有其他的变换,这里仅论述这三种最常见的)。

vector_to_hom_mat2d:


这个算子可以建立一个坐标系到另一个坐标系的变换关系,也就是说关系式一旦成立,一个坐标系上的任意像素坐标都可以在与之有关系的坐标系中进行转换。一般常用在图像坐标与机械坐标的转换,然后就可以通过像素坐标来操控机械手走到指定的位置抓取目标等操作。

使用此算子建立两个坐标系关系式时需要分别拿到两坐标系中至少3个不共线的坐标,然后一一对应输入到这个算子中,最后生成一个可操作的句柄,此句柄可以通过affine_trans_point_2d进行使用。

affine_trans_point_2d:


这个算子可以操作由vector_to_hom_mat2d等算子生成的关系矩阵(句柄),它可以换算出一个坐标系中某个点到与之有关系的另一个坐标系中所在的位置

affine_trans_point_2d(::HomMat2D,Px,Py:Qx,Qy)

    功能:对点进行任意二维仿射变换,(支持缩放、旋转、平移、斜切)

    HomMat2D(输入参数):仿射变换矩阵

    Px(输入参数):原始点x或行坐标

    Py(输入参数):原始点y或列坐标

    Qx(输出参数):变换点x或行坐标

    Qy(输出参数):变换点y或列坐标

    affine_trans_pixel(::HomMat2D,Row,Col:RowTrans,ColTrans)

    功能:对像素进行任意二维仿射变换

     HomMat2D(输入参数):仿射变换矩阵

     Row(输入参数):输入像素行坐标

     Col(输入参数):输入像素列坐标

     RowTrans(输出参数):变换的像素行坐标

     ColTrans(输出参数):变换的像素列坐标

    注:affine_trans_point_2d与affine_trans_pixel的区别:affine_trans_pixel使用的图像坐标系的原点在图像的左上角,affine_trans_point_2d使用标准图像坐标系,原点在左上角像素的中心

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

  功能:根据点和角度计算刚性仿射变换矩阵,支持旋转和平移

  Row1(输入参数):原始点行坐标

  Column1(输入参数):原始点列坐标

  Angle1(输入参数):原始点角度

  Row2(输入参数):变换的目的点行坐标

  Column2(输入参数):变换的目的点列坐标

  Angle2(输入参数):变换的目的点角度

  HomMat2D(输出参数):输出仿射变换矩阵

根据两个以上特征点计算仿射变换矩阵

    vector_to_rigid(::Px,Py,Qx,Qy:HomMat2D)

    功能:根据两个以上点对计算计算刚性仿射变换矩阵,支持旋转和平移

    Px:(输入参数)原始点组的x坐标

    Py:(输入参数)原始点组的y坐标

    Qx:(输入参数)变换的目的点组的x坐标

    Qy:输入参数)变换的目的点组的y坐标

    HomMat2D:(输出参数)输出仿射变换矩阵

    vector_to_similarity(::Px,Py,Qx,Qy:HomMat2D)

    功能:根据两个以上点对计算相似仿射变换矩阵,支持旋转、平移和缩放

    Px:(输入参数)原始点组的x坐标

    Py:(输入参数)原始点组的y坐标

    Qx:(输入参数)变换的目的点组的x坐标

    Qy:(输入参数)变换的目的点组的y坐标

    HomMat2D:(输出参数)输出仿射变换矩阵

六.根据三个以上特征点获取仿射变换矩阵

   vector_to_hom_mat2d(::Px,Py,Qx,Qy:HomMat2D)

    功能:根据三个以上点对计算仿射变换矩阵,支持旋转、平移、缩放、斜切

    Px:(输入参数)原始点组的x坐标

    Py:(输入参数)原始点组的y坐标

    Qx:(输入参数)变换的目的点组的x坐标

    Qy:(输入参数)变换的目的点组的y坐标

    HomMat2D:(输出参数)输出仿射变换矩阵

案例:

read_image (image2, 'C:/Users/19473/AppData/Local/Temp/WeChat Files/ea8f40196f32b20fe676c38e977dfb2.png')
rgb1_to_gray (image2, GrayImage1)
threshold (GrayImage1, Regions1, 0, 200)
opening_circle (Regions1, Regions1, 1.5)
connection (Regions1, ConnectedRegions1)
select_shape_std (ConnectedRegions1, SelectedRegions, 'max_area', 70)
area_center (SelectedRegions, Area, Row, Column)
gen_cross_contour_xld (Cross, Row, Column, 60, 0.785398)

* 定义一个单位矩阵
hom_mat2d_identity (HomMat2DIdentity)
hom_mat2d_translate (HomMat2DIdentity, Row , Column, HomMat2DTranslate)
affine_trans_region (SelectedRegions, RegionAffineTrans, HomMat2DTranslate, 'nearest_neighbor')


hom_mat2d_rotate (HomMat2DIdentity, rad(20), Row, Column, HomMat2DRotate)
affine_trans_region (SelectedRegions, RegionAffineTrans, HomMat2DRotate, 'nearest_neighbor')
*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),


read_image (Image, 'C:/Users/19473/AppData/Local/Temp/WeChat Files/ea8f40196f32b20fe676c38e977dfb2.png')
Row := 100
Column := 200
dev_display (Image)


for Index := 1 to 150 by 1  
    * 先旋转  旋转角度是(Angle2 - Angle1)
    * 再平移  原图的点(Row1, Column1)一一对应移到点 (Row2, Column2)上 
    *   移动的row和column方向的位移分别是( Row2 - Row1)、( Column2 - Column1),
    vector_angle_to_rigid (Row, Column, 0, Row, Column, rad(10), HomMat2D)
    affine_trans_image (Image, ImageAffinTrans, HomMat2D, 'nearest_neighbor', 'false')
    copy_image (ImageAffinTrans, Image) 
endfor

猜你喜欢

转载自blog.csdn.net/weixin_39354845/article/details/123810121