怎么让一个点按指定的角度旋转并且偏移到指定的位置上去呢?
这个其实就是旋转与偏移二合一矩阵的应用。
halcon的算子vector_angle_to_rigid配合affine_trans_pixel就是这个作用
如下图所示,勇哥希望两个极耳朵中间那个点按电池的角度旋转并且位置于电池本体的中心上去。
read_image(Image, 'C:/Users/Administrator/Desktop/1.bmp') dev_close_window() dev_open_window(0, 0, 512, 512, 'black', WindowHandle) disp_obj(Image, WindowHandle) row1:=226 col1:=388 disp_circle(WindowHandle, row1, col1, 5) r1:=78 c1:=147 r2:=72 c2:=340 disp_line(WindowHandle, r1, c1, r2, c2) angle_lx(r1, c1, r2, c2, Angle) tuple_deg(Angle, Deg1) vector_angle_to_rigid(row1, col1, 0, row1, col1, Angle, HomMat2D) affine_trans_pixel(HomMat2D, row1, col1-150, RowTrans, ColTrans) angle_lx(RowTrans,ColTrans,row1, col1, Angle1) tuple_deg(Angle1, Deg2) disp_circle(WindowHandle,RowTrans, ColTrans, 5)
在上面的例子中,红线计算出电池本体的角度。
两极耳中心的点和旋转移位后本体中心的点之间的角度应该与电池本体的角度差不多。
在上面的代码中,也就是Angle与Angle1的角度应该差不多。
勇哥再举一个例子,你可以从中体会到算子vector_angle_to_rigid特有的好处。
read_image (Image, 'printer_chip/printer_chip_01') draw_rectangle1 (200000, Row1, Column1, Row2, Column2) gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2) hom_mat2d_identity (HomMat2DIdentity) *先将要转换region平移到原点位置 hom_mat2d_translate (HomMat2DIdentity, -Row1,-Column1, HomMat2DTranslate) affine_trans_region (Rectangle, RegionAffineTrans, HomMat2DTranslate, 'nearest_neighbor') *之后对回到原点位的region再进行需要的平移 hom_mat2d_translate (HomMat2DTranslate, Row1+600, Column1, HomMat2DTranslate1) affine_trans_region (RegionAffineTrans, RegionAffineTrans1, HomMat2DTranslate1, 'nearest_neighbor') area_center (RegionAffineTrans1, Area, Row, Column) *若使用vector_angle_to_rigid则只需要知道现在点以及要转到到的位置点既可以 * vector_angle_to_rigid (Row1, Column1, 0, 600, 0, 0, HomMat2D) affine_trans_region (Rectangle, RegionAffineTrans2, HomMat2D, 'nearest_neighbor')
对于这种点旋转的应用来说,勇哥写过许多例子。
并非一定要用halcon的算子来计算,请参考下面贴子:
三角函数在图形学里的应用(二) 点绕原点旋转(方法2)、点绕任意点旋转
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

