二维变换

算子列表 ↓

要在图像中指定位置,我们需要一套规范来实现。这种规范通过坐标系来设定。HALCON 中使用了多种坐标系,本文将重点说明二维图像中使用的坐标系。

像素是离散的,为定位像素,我们采用仅使用整数值的坐标系统——像素坐标系。若需超越像素网格的高精度定位,则需使用浮点坐标(如 。由此形成亚像素级精度的坐标系统。在 HALCON 中,我们实现了三种不同的亚像素坐标系统:

其中前两者仅在坐标原点处存在差异,如下图所示。通过标定可将图像坐标距离映射至真实世界距离。有关这些校准坐标的更多信息,请参阅 “解决方案指南 III-C - 三维视觉”

HALCON 标准坐标系

像素精度坐标系

像素坐标系将图像视为由离散元素(像素)组成的网格。在 HALCON 中,我们将原点 置于左上角像素的中心位置。现在,我们通过指定像素的行和列来分配其坐标,如同矩阵中的操作方式。

请注意,这意味着对于尺寸为高度 宽度 = 像素的图像,行坐标值从 ,列坐标值从 ,如下图所示。

亚像素精度坐标系:像素中心

该坐标系的原点位于图像左上角像素的中心,其轴线分别沿行方向(r)和列方向(c)延伸。由此约定嵌入了像素坐标系。图像左上角的坐标为 ,对于尺寸为高度 宽度= 像素的图像,右下角的坐标为 (即 ,请注意坐标值从 0 开始计数)。这也意味着像素点(k,l)覆盖了矩形区域 。该约定称为标准坐标系,或图像坐标系。

image/svg+xml (0,0) (0,5) (0,2) (6,0) (2,0) image/svg+xml (0.0,0.0) r c
( 1) ( 2)
HALCON 标准像素与亚像素笛卡尔坐标系的可视化展示。叉号标记指示右下角图像像素点的位置。该像素点中心坐标为 (像素坐标系下(1)), (标准亚像素坐标系下(2))。圆心坐标为

HALCON 非标准笛卡尔坐标系

若将图像围绕其原点旋转 (即90度),则要求两幅图像的边缘相接但不重叠。同时,缩放图像时不应产生负坐标值。为此,必须将原点 设置在图像某个角上。这促使我们采用以下坐标系。

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

对于该坐标系,我们将原点设在图像左上角。因此左上角像素点的中心坐标为 ,对于尺寸为高度 宽度= 像素的图像,右下角坐标为 。像素点 覆盖矩形区域

image/svg+xml (0.0,0.0) y x
HALCON 非标准亚像素笛卡尔坐标系的可视化展示。叉号标记指示右下角图像像素点的位置,其中心坐标为 。圆心坐标为

在此坐标系中,旋转定义为数学正方向,即逆时针方向。旋转 (即 90 度)将第一轴(即 x 轴)映射到第二轴(即 y 轴)。因此,轴的映射关系为:行对应 x 坐标,列对应 y 坐标。

image/svg+xml x y 0 α
使用边缘中心坐标系对旋转( )进行可视化。

在任意笛卡尔坐标系中算子的预期参数

算子 affine_trans_point_2daffine_trans_point_2dAffineTransPoint2dAffineTransPoint2dAffineTransPoint2daffine_trans_point_2d 将由 HomMat2DHomMat2DHomMat2DHomMat2DhomMat2Dhom_mat_2d 给定的变换应用于点坐标。这意味着,只要确保点和变换在同一坐标系中给定,affine_trans_point_2daffine_trans_point_2dAffineTransPoint2dAffineTransPoint2dAffineTransPoint2daffine_trans_point_2d 就能在两个笛卡尔坐标系中工作。

算子 angle_llangle_llAngleLlAngleLlAngleLlangle_llangle_lxangle_lxAngleLxAngleLxAngleLxangle_lx 可接受像素中心坐标系中的输入点,但返回的角度遵循数学正方向旋转的惯例,即逆时针方向,且水平轴定义为 0 度,与边缘中心坐标系一致。

在不同坐标系中算子的预期参数

在 HALCON 中还存在这样的情况:某个算子要求其输入采用不同的坐标系。一方面,该算子期望对象采用常规坐标系(即标准坐标系);另一方面,对于变换矩阵 HomMat2DHomMat2DHomMat2DHomMat2DhomMat2Dhom_mat_2d,该算子则要求采用边缘中心坐标系——该坐标系在上述变换中具有显著优势。该算子将对象的坐标从 HALCON 标准坐标系(原点位于左上角像素中心)转换为边缘中心坐标系(原点位于左上角像素左上角)。经 HomMat2DHomMat2DHomMat2DHomMat2DhomMat2Dhom_mat_2d 变换后,结果将重新转换回标准坐标系。

这些算子是

表示像素中心坐标系中变换的矩阵可转换为表示相同变换(例如围绕同一点的旋转)的边缘中心坐标系表示形式,例如通过

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

请注意,上述以 projective_ 开头的算子使用投影变换矩阵。这些变换矩阵可通过三维相机姿态等途径获取。此时使用的矩阵是在三维坐标系内 xy 平面的投影中表示的。因此,坐标轴的映射关系为:行对应 y 坐标,列对应 x 坐标,故需对坐标进行转换。

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

基于形状匹配的结果(例如 find_generic_shape_modelfind_generic_shape_modelFindGenericShapeModelFindGenericShapeModelFindGenericShapeModelfind_generic_shape_model)以边缘中心坐标形式呈现。返回的匹配结果已完成变换。可通过 get_generic_shape_model_resultget_generic_shape_model_resultGetGenericShapeModelResultGetGenericShapeModelResultGetGenericShapeModelResultget_generic_shape_model_result 获取对应的齐次变换矩阵。

基于相关性的匹配结果(如 find_ncc_modelfind_ncc_modelFindNccModelFindNccModelFindNccModelfind_ncc_modelfind_ncc_modelsfind_ncc_modelsFindNccModelsFindNccModelsFindNccModelsfind_ncc_models)同样以边缘中心坐标计算,但变换参数会单独返回。利用这些结果可创建直接适用的变换矩阵 HomMat2DHomMat2DHomMat2DHomMat2DhomMat2Dhom_mat_2d,例如可用于 affine_trans_contour_xldaffine_trans_contour_xldAffineTransContourXldAffineTransContourXldAffineTransContourXldaffine_trans_contour_xld 以及上文 在不同坐标系中算子的预期参数 段落中列出的其他算子。

为显示基于相关性的匹配结果,我们强烈建议使用函数 dev_display_ncc_matching_results

在下图中,我们分别展示了在正确坐标系和错误坐标系中使用变换矩阵时,匹配结果可能呈现的效果。对于后者(如图(3)所示),由于转换矩阵同样采用像素中心坐标系,因此 affine_trans_contour_xldaffine_trans_contour_xldAffineTransContourXldAffineTransContourXldAffineTransContourXldaffine_trans_contour_xld 显示的匹配结果存在 0.5 像素的偏差。需注意,此现象仅在涉及旋转操作时才会显现。

image/svg+xml image/svg+xml image/svg+xml
( 1) ( 2) ( 3)
回形针的原始图像(1)、输入坐标正确的匹配部分(2),以及输入坐标错误的匹配(3)。

非笛卡尔坐标系

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

在极坐标系中,点通过距离和角度来定义。距离称为径向坐标,以固定点(极点)为基准。角度坐标则以定义的轴(极轴)为基准。在 HALCON 中,极点由 指定,极轴为水平轴。角度坐标以弧度为单位表示。

经过 polar_trans_image_extpolar_trans_image_extPolarTransImageExtPolarTransImageExtPolarTransImageExtpolar_trans_image_ext 变换后,输出图像左上角的像素始终对应于输入图像中由 RadiusStartRadiusStartRadiusStartRadiusStartradiusStartradius_startAngleStartAngleStartAngleStartAngleStartangleStartangle_start 指定的点。类似地,输出图像右下角的像素对应于输入图像中由 RadiusEndRadiusEndRadiusEndRadiusEndradiusEndradius_endAngleEndAngleEndAngleEndAngleEndangleEndangle_end 指定的点。在常规模式下(AngleStartAngleStartAngleStartAngleStartangleStartangle_start < AngleEndAngleEndAngleEndAngleEndangleEndangle_endRadiusStartRadiusStartRadiusStartRadiusStartradiusStartradius_start < RadiusEndRadiusEndRadiusEndRadiusEndradiusEndradius_end),极坐标变换按数学正向(逆时针)执行。此外,半径较小的点位于输出图像的上半部分。通过适当交换这些参数的值(例如 AngleStartAngleStartAngleStartAngleStartangleStartangle_start > AngleEndAngleEndAngleEndAngleEndangleEndangle_endRadiusStartRadiusStartRadiusStartRadiusStartradiusStartradius_start > RadiusEndRadiusEndRadiusEndRadiusEndradiusEndradius_end),可实现输出图像的任意所需方向。

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)
例如,我们展示一个由极点(RowRowRowRowrowrow,ColumnColumnColumnColumncolumncolumn) (+)、极轴(...)、两个角坐标 AngleStartAngleStartAngleStartAngleStartangleStartangle_start ( )、AngleEndAngleEndAngleEndAngleEndangleEndangle_end ( ) 以及两个径向坐标 RadiusStartRadiusStartRadiusStartRadiusStartradiusStartradius_start ( )、RadiusEndRadiusEndRadiusEndRadiusEndradiusEndradius_end ( ) 定义的环形弧。(1) 原图像及定义环形弧的参数。(2) 通过 polar_trans_image_extpolar_trans_image_extPolarTransImageExtPolarTransImageExtPolarTransImageExtpolar_trans_image_ext 处理后,在极坐标等距网格中呈现的环形弧。(3) 原图像表示中的环形弧。通过对图像(2)进行 polar_trans_image_invpolar_trans_image_invPolarTransImageInvPolarTransImageInvPolarTransImageInvpolar_trans_image_inv 处理获得笛卡尔坐标系,坐标原点位于左上角像素中心。

极坐标用于以下算子:

具有缩减域、区域和模型的图像

在前文我们讨论了图像的坐标。当涉及到所用坐标系原点的位置时,具有缩减域、区域和模型的图像与普通图像的处理方式不同。

具有缩减域和区域的图像

具有缩减域和区域的两种图像均保留其原始图像的坐标系。这意味着它们继承了原始图像的坐标原点,且各点保持着原始图像中的坐标值。

模型

另一方面,模型可以拥有局部坐标系。例如,通过 create_generic_shape_modelcreate_generic_shape_modelCreateGenericShapeModelCreateGenericShapeModelCreateGenericShapeModelcreate_generic_shape_model 创建的模型,其原点位于生成该模型的 ROI 区域的质心位置。更多信息请参阅 “解决方案指南II-B - 匹配”

校准坐标

在处理像素单位时,我们无法直接提取任何关于真实世界距离的信息。当相机经过校准后,即可对图像进行校正。此时可为图像赋予世界坐标。更多信息请参阅 “解决方案指南 III-C - 三维视觉”


算子列表

affine_trans_pixelAffineTransPixelaffine_trans_pixelAffineTransPixelaffine_trans_pixel仿射变换像素
对像素坐标应用任意仿射二维变换。
affine_trans_point_2dAffineTransPoint2daffine_trans_point_2dAffineTransPoint2daffine_trans_point_2d仿射变换点二维
对点应用任意仿射二维变换。
deserialize_hom_mat2dDeserializeHomMat2ddeserialize_hom_mat2dDeserializeHomMat2ddeserialize_hom_mat2d反序列化齐次矩阵二维
反序列化一个序列化的齐次二维变换矩阵。
hom_mat2d_composeHomMat2dComposehom_mat2d_composeHomMat2dComposehom_mat2d_compose齐次矩阵二维组合
将两个齐次二维变换矩阵相乘。
hom_mat2d_determinantHomMat2dDeterminanthom_mat2d_determinantHomMat2dDeterminanthom_mat2d_determinant齐次矩阵二维行列式
计算齐次二维变换矩阵的行列式。
hom_mat2d_identityHomMat2dIdentityhom_mat2d_identityHomMat2dIdentityhom_mat2d_identity齐次矩阵二维相同
生成相同二维变换的齐次变换矩阵。
hom_mat2d_invertHomMat2dInverthom_mat2d_invertHomMat2dInverthom_mat2d_invert齐次矩阵二维反转
反转一个齐次二维变换矩阵。
hom_mat2d_reflectHomMat2dReflecthom_mat2d_reflectHomMat2dReflecthom_mat2d_reflect齐次矩阵二维反射
将反射添加到齐次二维变换矩阵中。
hom_mat2d_reflect_localHomMat2dReflectLocalhom_mat2d_reflect_localHomMat2dReflectLocalhom_mat2d_reflect_local齐次矩阵二维反射局部
将反射添加到齐次二维变换矩阵中。
hom_mat2d_rotateHomMat2dRotatehom_mat2d_rotateHomMat2dRotatehom_mat2d_rotate齐次矩阵二维旋转
向齐次二维变换矩阵添加旋转。
hom_mat2d_rotate_localHomMat2dRotateLocalhom_mat2d_rotate_localHomMat2dRotateLocalhom_mat2d_rotate_local齐次矩阵二维旋转局部
向齐次二维变换矩阵添加旋转。
hom_mat2d_scaleHomMat2dScalehom_mat2d_scaleHomMat2dScalehom_mat2d_scale齐次矩阵二维缩放
为齐次二维变换矩阵添加缩放。
hom_mat2d_scale_localHomMat2dScaleLocalhom_mat2d_scale_localHomMat2dScaleLocalhom_mat2d_scale_local齐次矩阵二维缩放局部
为齐次二维变换矩阵添加缩放。
hom_mat2d_slantHomMat2dSlanthom_mat2d_slantHomMat2dSlanthom_mat2d_slant齐次矩阵二维倾斜
向齐次二维变换矩阵添加倾斜。
hom_mat2d_slant_localHomMat2dSlantLocalhom_mat2d_slant_localHomMat2dSlantLocalhom_mat2d_slant_local齐次矩阵二维倾斜局部
向齐次二维变换矩阵添加倾斜。
hom_mat2d_to_affine_parHomMat2dToAffineParhom_mat2d_to_affine_parHomMat2dToAffineParhom_mat2d_to_affine_par齐次矩阵二维至仿射参数
从齐次二维变换矩阵计算仿射变换参数。
hom_mat2d_translateHomMat2dTranslatehom_mat2d_translateHomMat2dTranslatehom_mat2d_translate齐次矩阵二维平移
将平移添加到齐次二维变换矩阵中。
hom_mat2d_translate_localHomMat2dTranslateLocalhom_mat2d_translate_localHomMat2dTranslateLocalhom_mat2d_translate_local齐次矩阵二维平移局部
将平移添加到齐次二维变换矩阵中。
hom_mat2d_transposeHomMat2dTransposehom_mat2d_transposeHomMat2dTransposehom_mat2d_transpose齐次矩阵二维转置
转置一个齐次二维变换矩阵。
hom_mat3d_projectHomMat3dProjecthom_mat3d_projectHomMat3dProjecthom_mat3d_project齐次矩阵三维组合
将两个齐次三维变换矩阵相乘。
hom_vector_to_proj_hom_mat2dHomVectorToProjHomMat2dhom_vector_to_proj_hom_mat2dHomVectorToProjHomMat2dhom_vector_to_proj_hom_mat2d齐次向量至投影齐次矩阵二维
使用给定的点对应关系计算齐次变换矩阵。
point_line_to_hom_mat2dPointLineToHomMat2dpoint_line_to_hom_mat2dPointLineToHomMat2dpoint_line_to_hom_mat2d点线至齐次矩阵二维
近似从点至线对应的仿射变换。
projective_trans_pixelProjectiveTransPixelprojective_trans_pixelProjectiveTransPixelprojective_trans_pixel投影变换像素
使用齐次投影变换矩阵投影像素坐标。
projective_trans_point_2dProjectiveTransPoint2dprojective_trans_point_2dProjectiveTransPoint2dprojective_trans_point_2d投影变换点二维
使用投影变换矩阵投影一个齐次二维点。
serialize_hom_mat2dSerializeHomMat2dserialize_hom_mat2dSerializeHomMat2dserialize_hom_mat2d序列化齐次矩阵二维
序列化齐次二维变换矩阵。
vector_angle_to_rigidVectorAngleToRigidvector_angle_to_rigidVectorAngleToRigidvector_angle_to_rigid向量角至刚性
从点和角度计算刚性仿射变换。
vector_field_to_hom_mat2dVectorFieldToHomMat2dvector_field_to_hom_mat2dVectorFieldToHomMat2dvector_field_to_hom_mat2d向量场至齐次矩阵二维
从位移向量场近似仿射图。
vector_to_anisoVectorToAnisovector_to_anisoVectorToAnisovector_to_aniso向量至各向异性
从点对应关系近似各向异性相似性变换。
vector_to_hom_mat2dVectorToHomMat2dvector_to_hom_mat2dVectorToHomMat2dvector_to_hom_mat2d向量至齐次矩阵二维
根据点对应关系近似仿射变换。
vector_to_proj_hom_mat2dVectorToProjHomMat2dvector_to_proj_hom_mat2dVectorToProjHomMat2dvector_to_proj_hom_mat2d向量至投影齐次矩阵二维
使用给定的点对应关系计算投影变换矩阵。
vector_to_proj_hom_mat2d_distortionVectorToProjHomMat2dDistortionvector_to_proj_hom_mat2d_distortionVectorToProjHomMat2dDistortionvector_to_proj_hom_mat2d_distortion向量至投影齐次矩阵二维畸变
使用给定的图像点对应关系计算投影变换矩阵和径向畸变系数。
vector_to_rigidVectorToRigidvector_to_rigidVectorToRigidvector_to_rigid向量至刚性
从点对应关系近似刚性仿射变换。
vector_to_similarityVectorToSimilarityvector_to_similarityVectorToSimilarityvector_to_similarity向量至相似性
从点对应关系近似相似性变换。