翻译:2D Transformations

算子列表

为了说明一张图像上的一个位置,我们需要一个怎样做到的约定。这个约定通过一个坐标系来指定。HALCON中使用了不同的坐标系。这里,我们解释2维中使用的坐标系。

像素是离散的,为了定位它们,我们有一个只使用整数值的坐标系,像素坐标系。为了一个超越像素网格的更高的精度,我们需要浮点坐标,像\((2.6, 4.1)\)。这引向了亚像素精度的坐标系。在Halcon中,我们有三个不同的亚像素坐标系工具:

  • 以像素为中心的坐标,Halcon标准的亚像素坐标系
  • 边缘为中心的坐标
  • 极坐标
    其中前两种只在坐标原点不同,正如下图所示。标定使得将图像坐标距离映射到真实世界距离上。关于标定的更多信息,参考"Solution Guide III-C - 3D Vision"。

HALCON标准坐标系

像素精度坐标系

像素坐标系将图像当作一个由离散的要素--像素组成的网格。在Halcon中,我们将原点\((0, 0)\)放在左上角像素的中心。现在,我们指定像素坐标像一个矩阵一样规定它的行和列。

注意,这暗指了对于一张尺寸\(高 \times 宽 = m \times n\)像素的图片,行坐标值从0到m-1,列坐标值从0到n-1,正如下图中所示。

亚像素精度的坐标系:以像素为中心

这种坐标系的原点在左上角图像像素的中央。像素坐标与之一起遵循这种准则。图像的左上角的坐标是\((-0.5, -0.5)\),对于一个尺寸是\(高 \times 宽 = m \times n\)像素的图像,右下角的坐标是\((m - 0.5, n - 0.5)\)(=\((m - 1 + 0.5, n - 1 + 0.5)\),记住坐标值从0开始)。这也暗示着一个像素\((k, l)\)包含了\((k - 0.5, l - 0.5)\)\((k + 0.5, l - 0.5)\)\((k - 0.5, l + 0.5)\)\((k + 0.5, l + 0.5)\)围起来的矩形区域。这一准则被称为标准坐标系,或者图像坐标系。

这种坐标系像3D相机坐标系的xy平面的投影来对待。相应的,坐标轴的定义:行:y坐标,列:x坐标。

image/svg+xml (0,0) (0,5) (0,2) (6,0) (2,0) image/svg+xml (0.0,0.0) y x
(1) (2)

Halcon标准像素和亚像素笛卡尔坐标系的可视化。×表示了图像右下角像素。它的中心坐标是$(6, 5)$(在像素坐标中(1)),$(6.0, 5.0)$(在标准亚像素坐标中(2))。圆心坐标是$(3.6, 4.1)$。

HALCON非标准笛卡尔坐标系

如果我们将一张图像绕原点旋转\(\pi/2\)(=90角度),我们想要两张边缘接触的图像,而不是部分重叠的图像。同样的,缩放图像也并不期望得到负的图像坐标。为了这个目标,原点\((0.0, 0.0)\)必须设置为图像的一角。这是下面这个坐标系的成因。

亚像素精度坐标系:以边缘为中心

对于这个坐标系,我们将原点设置在图像的左上角。因此左上角像素的中心坐标为\((0.5, 0.5)\),对于尺寸为\(高 \times 宽 = m \times n\)像素的图像,右下角点的坐标为\((m, n)\)。像素\((k, l)\)包含了\((k, l)\)\((k, l + 1)\)\((k+1, l)\)\((k+1, l+1)\)围起来的矩形区域。

image/svg+xml (0.0,0.0) y x

HALCON非标准亚像素笛卡尔坐标系可视化。×代表了图像右下角像素。它的中心坐标是$(6.5,5.5)$。圆心坐标是$(3.6,4.1)$。

对于这个坐标系,旋转定义在数学上的正方向上,因此是逆时针方向的。一个\(\pi/2\)(=90角度)的旋转映射了从第一坐标轴(x轴)到第二坐标轴(y轴)。相应的,坐标轴有着行对应x坐标,列对应y坐标的分配。

image/svg+xml x y 0 α

一个使用边缘为中心的坐标系的角度为$\alpha$的旋转的可视化

在任一笛卡尔坐标系中算子期望的参数

算子affine_trans_point_2dHomMat2D中给出的变换作用到点坐标中。这意味着,affine_trans_point_2d工作在两个笛卡尔坐标系中,与此同时,你需要确保点和变换都是在同一个坐标系中给出。

算子angle_llangle_lx输入的点可以是以像素为中心的坐标的,但是返回的角度遵循了数学上的正方向,也就是逆时针,并且水平方向是0,正如在以边缘为中心的坐标系中。

在不同的坐标系中期望的参数

在HALCON中,也有一些案例期望它的输入是在不同坐标系下的。一方面,期望对象在它通常的坐标中————标准坐标。另一方面,对于变换矩阵HomMat2D,基于上述所描述对于变换的优势,算子期望以边缘为中心的坐标。算子将物体的坐标从HALCON标准坐标系(原点在左上角像素的中心)中转变到以边缘为中心的坐标系(原点在左上角像素的左上角)中。在使用HomMat2D进行变换后,结果再转换回标准坐标系。

这些算子是:

  • affine_trans_contour_xld
  • affine_trans_image
  • affine_trans_image_size
  • affine_trans_pixel
  • affine_trans_polygon_xld
  • affine_trans_region
  • projective_trans_contour_xld
  • projective_trans_image
  • projective_trans_image_size
  • projective_trans_pixel
  • projective_trans_region

一个代表了在以像素为中心的坐标中的变换的矩阵,可以转换成在以边线为中心的坐标中相同变换的矩阵(如:一个绕着同一个点的旋转),例如:通过

hom_mat2d_translate(HomMat2D, 0.5, 0.5, HomMat2DTmp)
hom_mat2d_translate_local(HomMat2DTmp, -0.5, -0.5, HomMat2DAdapted)

注意,上面提到的以projective_开头的算子,使用了一个投影变换矩阵。这些变换矩阵可以,例如,从三维相机位姿中获得。这样做之后,使用的矩阵是写在一个三维坐标系的xy平面中的。相应的,坐标轴的分配:行坐标对应y坐标,列坐标对应x坐标,与之一起的坐标需要被转换。

基于形状的匹配和基于相关性的匹配

基于形状匹配的结果,像find_shape_model,是给在以边线为中心的坐标中的。这意味着使用这些结果,可以创建一个HomMat2D变换,对于例如affine_trans_contour_xld和其他上文标题为在不同的坐标系中期望的参数中列出的算子是直接适用的。

为了显示从基于形状的匹配中得到的结果,也就是从这些算子中

  • find_aniso_shape_model
  • find_aniso_shape_models
  • find_scale_shape_model
  • find_scale_shape_models
  • find_shape_model
  • find_shape_models
    我们强烈建议使用子程序dev_display_shape_matching_results

在下面的图中,我们给了个在正确的坐标系中和错误的坐标系中使用变换矩阵分别展示出来的匹配的例子。对于后一个,也就是图(3)中展示的,变换矩阵是在像素为中心的坐标中给出的,因此通过affine_trans_contour_xld展示出来的匹配偏移了0.5个像素。注意,这种影响只在包含一个旋转时可见。

image/svg+xml image/svg+xml image/svg+xml
(1) (2) (3)

图(1)是回形针的原图,图(2)是在输入在正确的坐标系下的一部分匹配,图(3)是输入在错误的坐标系下的一部分匹配。

find_ncc_modelfind_ncc_models中得到的结果也是在以边线为中心的坐标系下的。因此,使用这些结果,也可以创建一个HomMat2D变换,对于例如affine_trans_contour_xld和其他上文标题为在不同的坐标系中期望的参数中列出的算子是直接适用的。

为了显示基于相关性匹配找到的结果,我们强烈建议使用子程序dev_display_ncc_matching_results

非笛卡尔坐标系

亚像素精度坐标系:极坐标

在极坐标中,点是由一个距离和一个角度定义的。距离被称为径向坐标,是根据固定的极点给出的。角度坐标是就一条定义的轴,极轴给出的。在HALCON中,极点是由\((Row, Column)\)明确的,极轴是水平的轴。角度坐标是以弧度给出的。

在用polar_trans_image_ext做了一次变换之后,输出图像的左上角像素总是与输入图像中通过RadiusStartAngleStart定义的点相一致。相似的,输出图像的右下角像素与输入图像中通过RadiusEndAngleEnd定义的点相一致。在通常模式下(AngleStart<AngleEndRadiusStart<RadiusEnd),极坐标变换实在数学上的正方向上的(逆时针方向)。此外,半径较小的点处于输出图像的上面部分。通过适当的交换这些参数值(例如:AngleStart>AngleEnd或者RadiusStart>RadiusEnd),可以得到输出图片的任何期望方向。

image/svg+xml α 2 2 r α 1 1 r image/svg+xml 2 r α 1 ) , ( + + + + 2 r α 2 ) , ( 1 r α 1 ) , ( 1 r α 2 ) , ( image/svg+xml α 2 2 r α 1 1 r
(1) (2) (3)

作为一个例子,我们展示了一个由它的极点$(行,列)(+)$,极轴(...),两个角坐标$AngleStart(\alpha1)$,$AngleEnd(\alpha2)$和两个径坐标$RadiusStart(r1)$,$RadiusEnd(r2)$定义的圆环。图(1)是原图和圆环的定义参数。图(2)圆环如图显示,极坐标通过`polar_trans_image_ext`形成一个等距的网格。图(3),圆弧代表了原图。通过`polar_trans_image_inv`获得图(2)上的笛卡尔坐标系。原点在左上角像素的中心。

下面这些算子使用了极坐标:

  • polar_trans_image_ext
  • polar_trans_image_inv
  • polar_trans_region
  • polar_trans_region_inv
  • polar_trans_contour_xld
  • polar_trans_contour_xld_inv
  • ploar_trans_image(已过时)

有缩小的定义域、区域和模板的图像

在我们谈到图像坐标之前的部分。当涉及到使用的坐标系原点的位置,在处理有缩小的定义域、区域和模板的图像上,与图像不同。

有缩小的定义域和区域的图像

有缩小的定义域和区域的图像都保留了图像创建时的坐标系。这意味着,它们继承了原点,点都保留了它们在原始图像中的坐标。

模板

模板,在另一方面,可以有一个它自己的坐标系,例如,通过create_shape_model创建的模板的原点在模板被创建的感兴趣区域的重心。更多信息见“Solution Guid II-B - Matching”。

标定坐标

当使用像素单元是,我们不能直接提取到关于现实世界距离的任何信息。当一个相机标定后,矫正图像是有可能的。在这个案例中,可以将世界坐标分配到图像中。更多信息参见“Solution Guide III-C -3D Vision”。

算子列表

affine_trans_pixel
在像素坐标应用一个任意二维仿射变换。
affine_trans_point_2d
在点上应用一个任意二维仿射变换。
deserialize_hom_mat2d
反序列化一个序列化的齐次二维变换矩阵。
hom_mat2d_compose
两个齐次二维变换矩阵相乘。
hom_mat2d_determinant
计算齐次二维变换矩阵的行列式
hom_mat2d_identity
生成一个相同的二维变换的齐次变换矩阵。
hom_mat2d_invert
逆变换一个齐次二维变换矩阵。
hom_mat2d_reflect
添加一个反射到齐次二维变换矩阵。
hom_mat2d_reflect_local
添加一个反射到齐次二维变换矩阵。
hom_mat2d_rotate
添加一个旋转到齐次二维变换矩阵。
hom_mat2d_rotate_local
添加一个旋转到齐次二维变换矩阵。
hom_mat2d_scale
添加一个缩放到齐次二维变换矩阵。
hom_mat2d_scale_local
添加一个缩放到齐次二维变换矩阵。
hom_mat2d_slant
添加一个扭曲到齐次二维变换矩阵。
hom_mat2d_slant_local
添加一个扭曲到齐次二维变换矩阵。
hom_mat2d_to_affine_par
从一个齐次二维变换矩阵中计算放射变换参数。
hom_mat2d_translate
添加一个位移到齐次二维变换矩阵。
hom_mat2d_translate_local
添加一个位移到齐次二维变换矩阵。
hom_mat2d_transpose
转置一个齐次二维变换矩阵。
hom_mat3d_project
将一个三维放射变换矩阵映射到二维投影变换矩阵。
hom_vector_to_proj_hom_mat2d
通过给定的点计算一个齐次变换矩阵。
point_line_to_hom_mat2d
Approximate an affine transformation from point-to-line correspondences.
projective_trans_pixel
Project pixel coordinates using a homogeneous projective transformation matrix.
projective_trans_point_2d
Project a homogeneous 2D point using a projective transformation matrix.
serialize_hom_mat2d
序列化一个齐次二维矩阵。
vector_angle_to_rigid
Compute a rigid affine transformation from points and angles.
vector_field_to_hom_mat2d
Approximate an affine map from a displacement vector field.
vector_to_aniso
Approximate an anisotropic similarity transformation from point correspondences.
vector_to_hom_mat2d
Approximate an affine transformation from point correspondences.
vector_to_proj_hom_mat2d
Compute a projective transformation matrix using given point correspondences.
vector_to_proj_hom_mat2d_distortion
Compute a projective transformation matrix and the radial distortion coefficient using given image point correspondences.
vector_to_rigid
Approximate a rigid affine transformation from point correspondences.
vector_to_similarity
Approximate an similarity transformation from point correspondences.

posted @ 2022-06-13 17:02  yutou2016  阅读(88)  评论(0编辑  收藏  举报