二维变换
算子列表 ↓
要在图像中指定位置,我们需要一套规范来实现。这种规范通过坐标系来设定。HALCON 中使用了多种坐标系,本文将重点说明二维图像中使用的坐标系。
像素是离散的,为定位像素,我们采用仅使用整数值的坐标系统——像素坐标系。若需超越像素网格的高精度定位,则需使用浮点坐标(如 。由此形成亚像素级精度的坐标系统。在 HALCON 中,我们实现了三种不同的亚像素坐标系统:
-
像素中心坐标系,HALCON 标准亚像素坐标系
-
边缘中心坐标系
-
极坐标系
其中前两者仅在坐标原点处存在差异,如下图所示。通过标定可将图像坐标距离映射至真实世界距离。有关这些校准坐标的更多信息,请参阅 “解决方案指南 III-C - 三维视觉”。
HALCON 标准坐标系
- 像素精度坐标系
-
像素坐标系将图像视为由离散元素(像素)组成的网格。在 HALCON 中,我们将原点 置于左上角像素的中心位置。现在,我们通过指定像素的行和列来分配其坐标,如同矩阵中的操作方式。
请注意,这意味着对于尺寸为高度 宽度 =
像素的图像,行坐标值从 到 ,列坐标值从 到 ,如下图所示。
- 亚像素精度坐标系:像素中心
-
该坐标系的原点位于图像左上角像素的中心,其轴线分别沿行方向(r)和列方向(c)延伸。由此约定嵌入了像素坐标系。图像左上角的坐标为
,对于尺寸为高度
宽度= 像素的图像,右下角的坐标为
(即 ,请注意坐标值从 0 开始计数)。这也意味着像素点(k,l)覆盖了矩形区域
,,,。该约定称为标准坐标系,或图像坐标系。
HALCON 非标准笛卡尔坐标系
若将图像围绕其原点旋转 (即90度),则要求两幅图像的边缘相接但不重叠。同时,缩放图像时不应产生负坐标值。为此,必须将原点 设置在图像某个角上。这促使我们采用以下坐标系。
- 亚像素精度坐标系:边缘中心
-
对于该坐标系,我们将原点设在图像左上角。因此左上角像素点的中心坐标为
,对于尺寸为高度
宽度= 像素的图像,右下角坐标为
。像素点 覆盖矩形区域
,,,。
在此坐标系中,旋转定义为数学正方向,即逆时针方向。旋转 (即 90 度)将第一轴(即 x 轴)映射到第二轴(即 y 轴)。因此,轴的映射关系为:行对应 x 坐标,列对应 y 坐标。
在任意笛卡尔坐标系中算子的预期参数
算子 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_ll 和 angle_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_model 和 find_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 像素的偏差。需注意,此现象仅在涉及旋转操作时才会显现。
非笛卡尔坐标系
- 亚像素精度坐标系:极坐标
-
在极坐标系中,点通过距离和角度来定义。距离称为径向坐标,以固定点(极点)为基准。角度坐标则以定义的轴(极轴)为基准。在 HALCON 中,极点由
指定,极轴为水平轴。角度坐标以弧度为单位表示。
经过 polar_trans_image_extpolar_trans_image_extPolarTransImageExtPolarTransImageExtPolarTransImageExtpolar_trans_image_ext 变换后,输出图像左上角的像素始终对应于输入图像中由 RadiusStartRadiusStartRadiusStartRadiusStartradiusStartradius_start
和 AngleStartAngleStartAngleStartAngleStartangleStartangle_start 指定的点。类似地,输出图像右下角的像素对应于输入图像中由 RadiusEndRadiusEndRadiusEndRadiusEndradiusEndradius_end 和 AngleEndAngleEndAngleEndAngleEndangleEndangle_end 指定的点。在常规模式下(AngleStartAngleStartAngleStartAngleStartangleStartangle_start < AngleEndAngleEndAngleEndAngleEndangleEndangle_end 且
RadiusStartRadiusStartRadiusStartRadiusStartradiusStartradius_start < RadiusEndRadiusEndRadiusEndRadiusEndradiusEndradius_end),极坐标变换按数学正向(逆时针)执行。此外,半径较小的点位于输出图像的上半部分。通过适当交换这些参数的值(例如 AngleStartAngleStartAngleStartAngleStartangleStartangle_start
> AngleEndAngleEndAngleEndAngleEndangleEndangle_end 或 RadiusStartRadiusStartRadiusStartRadiusStartradiusStartradius_start >
RadiusEndRadiusEndRadiusEndRadiusEndradiusEndradius_end),可实现输出图像的任意所需方向。
极坐标用于以下算子:
具有缩减域、区域和模型的图像
在前文我们讨论了图像的坐标。当涉及到所用坐标系原点的位置时,具有缩减域、区域和模型的图像与普通图像的处理方式不同。
- 具有缩减域和区域的图像
-
具有缩减域和区域的两种图像均保留其原始图像的坐标系。这意味着它们继承了原始图像的坐标原点,且各点保持着原始图像中的坐标值。
- 模型
另一方面,模型可以拥有局部坐标系。例如,通过 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向量至相似性
- 从点对应关系近似相似性变换。