QQ登录

只需一步,快速开始

工业视觉二维变换函数介绍2

[ 复制链接 ]
affine_trans_point_2d( : : HomMat2D, Px, Py : Qx, Qy)
affine_trans_point_2d应用任意仿射2D变换,即,缩放、旋转、平移和倾斜到输入点(Px,Py),并返回(Qx,Qy)中。
仿射变换由HomMat2D中的齐次变换矩阵描述。
这对应如下方程(输入点和输出点作为齐次向量):
2019-06-29_230749.jpg
如果要转换的点在标准图像坐标中指定,则它们的行坐标必须以Px传递,列坐标必须以Py传递。
这对于获得图像的右手坐标系是必要的。
特别是,这确保了旋转是在正确的方向上进行的。
注意,矩阵的(x,y)顺序很自然地对应于图像中坐标的通常顺序(column,row)。
转换矩阵可以使用
hom_mat2d_identity,
hom_mat2d_rotate,
hom_mat2d_translate,
vector_angle_to_rigid
等函数创建。


例如,HomMat2D对应一个刚性变换,即,如果包含旋转和平移,则对点进行如下变换:
2019-06-29_231141.jpg


2.hom_mat2d_scale( : : HomMat2D, Sx, Sy, Px, Py : HomMat2DScale)
hom_mat2d_scale将缩放因子Sx和Sy添加到齐次二维变换矩阵HomMat2D上,
并在HomMat2DScale中返回结果矩阵。
缩放由一个2×2的缩放矩阵s描述。
相对于全局坐标系(固定)执行的;这对应于下面的变换矩阵链:
2019-06-29_231840.jpg
点(Px,Py)是变换的不动点,即,当使用HomMat2DScale转换时,此点保持不变。
要获得此行为,首先将平移添加到输入转换矩阵中,该矩阵将不动点移动到全局坐标系的原点。
然后,添加缩放,最后平移,将不动点移动回原来的位置。
这对应于下面的变换链:
2019-06-29_231851.jpg


在局部坐标系中进行变换,即,使用hom_mat2d_scale_local来描述HomMat2D。


3.vector_to_similarity( : : Px, Py, Qx, Qy : HomMat2D)
vector_to_similarity拟合一个相似性转换,即,由均匀缩放、旋转和平移组成从至少两个点对应关系的变换,
并返回为齐次变换矩阵HomMat2D。
矩阵由3个分量组成:
x、y方向缩放相同的缩放矩阵S,
旋转矩阵R,
平移向量t(参见hom_mat2d_scale, hom_mat2d_rotate, hom_mat2d_translate):
2019-06-29_232748.jpg


点对应关系在元组(Px, Py)和(Qx,Qy)中传递,
其中对应的点必须位于元组中相同的索引位置。
如果传递了两个以上的点对应,则转换将被过度确定。
在这种情况下,返回的变换是使原点(Px,Py)与被变换点(Qx,Qy)之间的距离最小化的变换,
如下式(点为齐次向量)所示:
2019-06-29_233305.jpg
HomMat2D可以直接与使用仿射转换(例如affine_trans_image)转换数据的操作符一起使用。


4.hom_mat2d_translate_local( : : HomMat2D, Tx, Ty : HomMat2DTranslate)
hom_mat2d_translate_local将向量t = (Tx,Ty)的平移添加到齐次2D变换矩阵HomMat2D中,
并在HomMat2DTranslate中返回。
与hom_mat2d_translate不同,转换是相对于本地坐标系执行的,
即, HomMat2D描述的坐标系;
这对应于下面的变换矩阵链:
2019-06-29_233833.jpg
针对上面的4个函数,准备的例程执行如下:
2019-06-29_234309.jpg

例程主要是演示函数的功能与执行效果
例如代码为:
  1. dev_update_off ()
  2. dev_close_window ()
  3. dev_open_window (0, 0, 500, 500, 'black', WindowHandle)
  4. set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
  5. dev_set_part (0, 0, 499, 499)
  6. * 为了生成一组点,从中我们可以构造一个变换,我们将使用一个合成椭圆并读出它的坐标
  7. gen_ellipse_contour_xld (ContEllipse, 200, 200, rad(20), 150, 100, rad(0), rad(260), 'positive', 1)
  8. get_contour_xld (ContEllipse, Rows1, Cols1)
  9. * 现在我们将通过已知的变换对椭圆进行变换,并在坐标中添加一些噪声。
  10. hom_mat2d_identity (HomMat2DIdentity)
  11. hom_mat2d_rotate (HomMat2DIdentity, rad(80), 0, 0, HomMat2DRotate)
  12. hom_mat2d_translate (HomMat2DRotate, 600, 400, HomMat2DTranslate)
  13. hom_mat2d_scale (HomMat2DTranslate, 0.5, 0.5, 0, 0, HomMat2DScale)
  14. affine_trans_point_2d (HomMat2DScale, Rows1, Cols1, Rows2, Cols2)
  15. gen_contour_polygon_xld (Contour, Rows2, Cols2)
  16. add_noise_white_contour_xld (Contour, NoisyContours, 5, 5)
  17. *我们将读出有噪声椭圆的坐标,并用它来构造转换。注意,通过他的方法,我们确切地知道了哪些点
  18. *相互对应。在实际应用中,确定对应关系的步骤通常是比较困难的。
  19. get_contour_xld (NoisyContours, Rows2, Cols2)
  20. *现在我们可以确定最接近点对应的相似变换。
  21. vector_to_similarity (Rows1, Cols1, Rows2, Cols2, HomMat2D)
  22. * 最后,对原始轮廓进行计算变换以便了解计算后的转换有多精确(但在此之前,要纠正坐标系)
  23. hom_mat2d_translate (HomMat2D, 0.5, 0.5, HomMat2DTmp)
  24. hom_mat2d_translate_local (HomMat2DTmp, -0.5, -0.5, HomMat2DAdapted)
  25. affine_trans_contour_xld (ContEllipse, ContoursAffineTrans, HomMat2DAdapted)
  26. * 结果显示
  27. dev_clear_window ()
  28. Message := '计算椭圆的相似转换'
  29. disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
  30. dev_set_color ('white')
  31. disp_message (WindowHandle, '原始椭圆', 'window', 80, 30, '', 'false')
  32. dev_display (ContEllipse)
  33. dev_set_color ('red')
  34. disp_message (WindowHandle, '噪声轮廓', 'window', 300, 250, '', 'false')
  35. dev_display (NoisyContours)
  36. dev_set_color ('green')
  37. disp_message (WindowHandle, '转换后的轮廓', 'window', 320, 250, '', 'false')
  38. dev_display (ContoursAffineTrans)
复制代码






回复

使用道具 举报

快速回复 返回列表 客服中心 搜索