二维
二维仿射变换,顾名思义就是在二维平面内,对对象进行平移、旋转、缩放等变换的行为(当然还有其他的变换,这里仅论述这三种最常见的)。
vector_to_hom_mat2d:
这个算子可以建立一个坐标系到另一个坐标系的变换关系,也就是说关系式一旦成立,一个坐标系上的任意像素坐标都可以在与之有关系的坐标系中进行转换。一般常用在图像坐标与机械坐标的转换,然后就可以通过像素坐标来操控机械手走到指定的位置抓取目标等操作。
使用此算子建立两个坐标系关系式时需要分别拿到两坐标系中至少3个不共线的坐标,然后一一对应输入到这个算子中,最后生成一个可操作的句柄,此句柄可以通过affine_trans_point_2d进行使用。
vector_to_hom_mat2d:
功能:根据三个以上点对计算仿射变换矩阵,支持旋转、平移、缩放、斜切
Px:(输入参数)原始点组的x坐标
Py:(输入参数)原始点组的y坐标
Qx:(输入参数)变换的目的点组的x坐标
Qy:(输入参数)变换的目的点组的y坐标
HomMat2D:(输出参数)输出仿射变换矩阵
九点标定的时候主要来计算矩阵
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或列坐标
vector_to_hom_mat2d 一般用于九点标定
vector_to_hom_mat2d ([1863.074,1853.723,1858.503,1060.254,2654.917,2659.306,2650.395,1055.019,1064.807] ,[1934.265,3530.841,2732.168,2724.893,2736.01,1938.346,3534.78,3523.122,1926.546],[76398,66398,71398,71398,71398,76398,66398,66398,76398],[-40614,-40614,-40614,-35614,-45614,-45614,-45614,-35614,-35614], HomMat2D)
*查看qx,qy的值 是否和标定的数据差异太大
affine_trans_point_2d (HomMat2D, 1863, 1934, Qx, Qy)
hom_mat2d_to_affine_par (HomMat2D, Sx, Sy, Phi, Theta, Tx, Ty)
hom_mat2d_rotate hom_mat2d_translate
hom_mat2d_rotate( : : HomMat2D, Phi, Px, Py : HomMat2DRotate)
//功能:把旋转角度添加到仿射变换矩阵
HomMat2D :(输入参数)仿射变换矩阵
Phi :旋转角度(单位弧度)
Px :变换的固定点行坐标。固定点是指以该点为支撑进行仿射变换 (这里是指围绕这点进行旋转)
Py : 变换的固定点列坐标
HomMat2DRotate:输出的旋转变换的二维矩阵
hom_mat2d_translate( : : HomMat2D, Tx, Ty : HomMat2DTranslate)
功能:把平移添加到防射变换矩阵
HomMat2D:(输入参数)仿射变换矩阵
Tx(输入参数):沿x轴方向平移的距离
Ty:输入参数):沿y轴方向平移的距离
HomMat2DTranslate(输出参数):输出变换矩阵
affine_trans_pixel
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
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:(输出参数)输出仿射变换矩阵
案例:
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
hom_mat2d_translate与vector_angle_to_rigid的区别
read_image (Image, 'printer_chip/printer_chip_01')
Row1:=28.2154
Column1:=339.547
Row2:= 279.097
Column2:=475.566
gen_rectangle1 (Rectangle, Row1,Column1, Row2,Column2)
area_center (Rectangle, Area_ori, Row_ori, Column_ori)
gen_cross_contour_xld (Cross, Row_ori, Column_ori, 60, 0.785398)
hom_mat2d_identity (HomMat2DIdentity)
*先将要转换region平移到原点位置 Row1,Column1 表示
hom_mat2d_translate (HomMat2DIdentity, Row1,Column1, HomMat2DTranslate)
* 在上面Row1,Column1当成一个新的原点O1,然后在O1 的基础上偏移 100 400
affine_trans_point_2d (HomMat2DTranslate, 100, 400, Row_1, Column_1)
gen_cross_contour_xld (Cross2, Row_1, Column_1, 60, 0.785398)
hom_mat2d_translate (HomMat2DIdentity, -Row1,-Column1, HomMat2DTranslate1)
affine_trans_point_2d (HomMat2DTranslate1, 0, 0, Row_Translate1, Column_Translate1)
gen_cross_contour_xld (Cross4, Row_Translate1, Column_Translate1, 60, 0.785398)
*之后对回到原点位的region再进行需要的平移
hom_mat2d_translate (HomMat2DTranslate, Row1+600, Column1, HomMat2DTranslate2)
affine_trans_point_2d (HomMat2DTranslate2, 0, 0, Row, Column)
gen_cross_contour_xld (Cross3, Row, Column, 60, 0.785398)
*若使用vector_angle_to_rigid则只需要知道现在点以及要转到到的位置点可以
*
vector_angle_to_rigid (Row1, Column1, 0, 1000, 0, 0, HomMat2D)
affine_trans_region (Rectangle, RegionAffineTrans2, HomMat2D, 'nearest_neighbor')
area_center (RegionAffineTrans2, Area_V, Row_V, Column_V)
gen_cross_contour_xld (Cross4, Row_V, Column_V, 60, 0.785398)
vector_angle_to_rigid (Row1, Column1, 0, 1000, 0, 0, HomMat2D2)
affine_trans_point_2d (HomMat2D2, 0, 0, Qx, Qy)
gen_cross_contour_xld (Cross6, Qx, Qy, 60, 0.785398)
vector_angle_to_rigid (200, 300, 0, 1000,1000, 0, HomMat2D3)
affine_trans_point_2d (HomMat2D3, 1000, 1000, Qx1, Qy1)
gen_cross_contour_xld (Cross7, Qx1, Qy1, 60, 0.785398)