3D基于形状的匹配

Halcon算子之3D基于形状匹配

1.在一张图像中,找到一个3D图形的最佳匹配

find_shape_model_3d(Image : : ShapeModel3DID, MinScore, Greediness, NumLevels, GenParamNames,

GenParamValues : Pose, CovPose, Score)
该方法是在图像Image中找到ShapeModel3DID的最佳匹配。要说明的是用来匹配的3D模板图形的必须由
create_shape_model_3d 或 read_shape_model_3d两个算子创建得到。另外,图像Image是一个3D模型
在相机坐标系下的投影。通过变换相机的位置和角度,即3D模型相对于相机有不同的位姿,通过投影得到
不同的图像,进而迭代找出3D模板图像与3D模型的最佳匹配。在图像中匹配到的图形的位姿保存在Pose中。
这个位姿就是用来生成图像Image的3D模型在相机坐标系下的姿态。这个位姿所在的坐标系也需要说明一下。
虽然,3D图形是由create_shape_model_3d生成,但是pose不是生成这个模型的算子决定的。这个位姿是由
最初生成这个3D模型的CAD文件中保存的点线面等几何信息所在坐标系决定的。
一旦找到最佳匹配,匹配结果pose中会保存6个位姿参数,即,x轴平移,y轴平移,z轴平移,x轴旋转,
y轴旋转,z轴旋转。这个匹配过程是通过迭代来完成的。迭代过程中这个6个参数的匹配精度会保存在CovPose
中,默认情况下CovePose中只保存了这个6个参数在的标准差,当你通过设置通用参数名cov_pose_mode及其参数值
为covariances时,CovePose中保存的不在是6个标准差,而是,这个6个变换参数(变量)(x,y,z,r_x,r_y,r_z)
的协方差矩阵。当然,这个CovPose只反映的是执行一次这个算子内部计算过程中的精度,而与得到pose本身的精度是不一样。即pose,是这个算子的一个结果,在求解这个pose过程中迭代了很多次,这个迭代过程的精度保存在了CovPose中。
匹配完成之后会得到一个匹配分数,保存在Score。这个数值归一化到了0-1之间,这只是一个近似测量值,它表示的是模板图像在图像中相似度有多高。当将模型遮挡一半在投影生成图像时,这个匹配分数不会超过0.5。
这个算子中有最大匹配分数MaxScore和最小匹配分数MinScore。表示的是当模板图形与图形的区域达到多大的相似度才认为该区域是模板的投影。MinScore越大,搜索速度越快。如果模型在投影过程中不被遮挡,那么这个最小的匹配分数可以设置到0.8-0.9。如果投影图像中有较强的背景纹理或者很多杂乱的背景,最小匹配分数不能超过0.7,否则会导致错误的匹配。
参数Greediness 表示搜索过程的贪婪程度,如果设置为0,搜索过程将会是一个安全的启发式搜索(不达目的誓不罢休地搜索),对于一个比较明显的匹配目标,它无论如何都会搜索到。但是,这个过程比较耗时。如果设置为1,搜索过程会很快,但是在有些不多见的情况下,不一定能找到匹配目标,也就是说这个过程不安全了,即使图像中存在一个比较明显的目标也不保证能匹配到。所以,总得来说,要保证一定能搜索到匹配目标同时兼顾速度这个值通常设为0.9。
NumLevels表示的是在匹配搜索过程中使用到的图像金字塔的层级。3D模型的原始数据是保存在图像中,并通过create_shape_model_3d创建得到。在必要情况下,金字塔的层数可以设置为这个原始图像所处的金字塔层级,这个图像所在的层数就是0层。此外,这个NumLevels可以是一个数组,这个数组包含要搜索的金字塔的最高层和最底层。例如【4,2】表示,匹配最开始是从金字塔的第4层开始搜索的,一直搜索到第二层结束(最底层为1层)。这个机制可用来减少匹配时间,如果使用中最低金字塔层数设置过高,则不能达到期望的精度,或者匹配到错误的目标,这是因为在高层金字塔,模型的细节不够突出,使得匹配不能稳定地匹配正确的目标。在这种情况下,使用的最低金字塔层数要设置的低一些。
除了上面说的参数之外,还有一些通用参数,这些参数通常不用特殊指定,只需要设置为默认值即可。

2.将一个3D图形的边缘投影到图像坐标系

project_shape_model_3d( : ModelContours : ShapeModel3DID, CamParam, Pose, HiddenSurfaceRemoval, MinFaceAngle : )
这个算子将使用3D图形ShapeModel3D投影到图像坐标系,并且将边界信息保存在ModelContours中。这个3D图形坐标系是世界坐标系。这个投影过程分为两步,首先,通过给定位姿Pose,将3D图形转换到相机坐标系;然后,这个相机坐标系根据给定的相机内部参数CamParam投影到图形坐标系。相机内参表示的是相机的投影特点,位姿Pose表示的是世界坐标系相对于相机坐标系的位置和方向。
HiddenSurfaceRemoval用来设置是否显示投影过程中被遮挡的表面。如果HiddenSurfaceRemove被设置为true,只会将相机视角下3D模型没有被遮挡的边界投影的图像上。如果设置为false,3D模型所有的边界都被投影到图像上,这个过程比较快。
如果系统变量opengl_hidden_surface_removal_enable被设置为true,并且HiddenSurfaceRemoval被设置为true,模型的投影过程会使用显卡加速。使用显卡加速的算法会显著提高执行效率。基于OpenGL的投影结果和基于解析方法的投影结果略有不同。需要注意的是,这种投影方式只会在给定相机参数下可见的轮廓投影到图像上。
不是3D模型所有的边界都会被投影到图像上,而是形成这个边界的两个平面的夹角大于MinFaceAngle时,这个边界才会被投影。如果MinFaceAngle设置为0,所有的边界都会被投影,如果MinFaceAngle设置为pi(180度),只有3D物体最外面的边缘轮廓才会被投影。这个参数可以用来抑制曲面内部边界,例如要获得圆柱体的轮廓时,可以用这个参数来抑制曲面内部的边(即使内部有很多细节也会被忽略),只保留外部的边,获取圆柱体的外部轮廓。
对于由create_shape_model_3d算子创建的模型,如果创建时union_adjacent_contours被激活,相邻的边界会被连接在一起。如果通过project_object_model_3d创建了3D模型, project_shape_model_3d和project_object_model_3d会得到相同的投影结果。在基础模型不再可用的情况下,使用Project_shape_model_3d可视化find_shape_model_3d返回的匹配结果非常有用。

3.3D图形坐标转换

trans_pose_shape_model_3d(ShapeModel3DID, PoseIn, Transformation : PoseOut)
算子通过Transformation中指定的转换方向将ShapeMode3DID的位姿从PoseIn转换到PoseOut。在大多说情况下,这个算子是用来变换相机位姿的,即相机从相对于源坐标系的位姿转换到相对于目标坐标系下的位姿。
首先,说一下源坐标系。源坐标系是传入ShapeModel3DID的对应的3D模型的所参考的坐标系。这个参考坐标系的原点与基础的3D模型的参考点重合。参考坐标系的方向由使用create_shape_model_3d创建这个3D模型时指定的方向确定。
接着,说一下目标坐标系,也就是世界坐标系,也就是创建3D模型最基础的3维坐标系。这个坐标系隐含在CAD模型文件中,这个文件中保存的几何坐标信息就是参考这个坐标系得到。可以通过read_object_model_3d这个算子读CAD文件得到3D模型。
如果Transfomation被设置为ref_to_model,就认为PoseIn所指的坐标系就是3D模型的参考坐标系。输出结果PoseOut所指的坐标系是转换3D模型的目标坐标系。
如果Transfomation被设置为model_to_ref,就认为PoseIn所指的坐标系是转换3D模型的目标坐标系。输出结果PoseOut所指的坐标系也是3D模型的参考坐标系。

4.获取在制定视角下3D模型的轮廓表示

get_shape_model_3d_contours( : ModelContours : ShapeModel3DID, Level, View : ViewPose)
View表示的是投影3D模型到2D图像的视角,level表示的是图像金字塔的层数。ModelContous是获得的轮廓。这个轮廓通常被用来可视化和评价3D模型。有了这个方法,可以用它来判断3D模型的哪一层金字塔适合用来做3D匹配。如果在高层图像金字塔上轮廓细节不突出,应该调整到低层去做匹配。同样道理,如果高层金字塔细节太多,就应该选择更高层去搜索匹配。
此外,所选视角的3D模型的位姿保存在ViewPose中。这个位姿可以用project_shape_model_3d将3D模型投影到2D图像,得到轮廓。可以用这个轮廓和ModelContours对比,用来评价ModelContorus。注意,由于径向变形的存在,这两个轮廓的位置可能存在略微的差别。

5.通过相机中心和视线方向创建3D相机的位姿

create_cam_pose_look_at_point( : : CamPosX, CamPosY, CamPosZ, LookAtX, LookAtY, LookAtZ, RefPlaneNormal, CamRoll : CamPose)
通过两个点和相机的旋转角度创建3D相机相对于世界坐标系的位姿。第一个点是(CamPosX,CamPosY,CamPosZ),第二个点是(LookAtX,lookAtY,lookAtZ)。第一个点定义了相机的光学中心在世界坐标系中的位置,即相机坐标系的原点。第二个点定义了相机的观察点,也确定了观察方向。因此,第二个点位于相机坐标系的z轴上。确定了这两个点之后,剩下需要确定的就是相机绕z轴旋转的角度。为了确定这个旋转角度,需要指定一个参考平面,RefPlaneNormal表示这个参考平面的法向量,它确定相机的参考方向。最后,相机的旋转角度通过CamRoll来指定,这个角度表示的是相机围绕z轴相对于其参考方向的旋转。也就是说RefPlaneNormal确定了投影的方向,CamRoll,再使得相机相对于这个参考方向旋转一个角度
下面说一下投影方向和投影平面。
当RefPlaneNormal 设置为x时,参考平面为yz平面时,x轴垂直投影得到的2D图像,指向图形外面;
当RefPlaneNormal 设置为-x时,参考平面为yz平面时,x轴垂直投影得到的2D图像,指向图形里面;
当RefPlaneNormal 设置为y时,参考平面为xz平面时,y轴垂直投影得到的2D图像,指向图形外面;
当RefPlaneNormal 设置为-y时,参考平面为xz平面时,y轴垂直投影得到的2D图像,指向图形里面;
当RefPlaneNormal 设置为z时,参考平面为xy平面时,z轴垂直投影得到的2D图像,指向图形外面;
当RefPlaneNormal 设置为-z时,参考平面为xy平面时,z轴垂直投影得到的2D图像,指向图形里面;
除了上面说明的几个方向,RefPlaneNormal可以通过一个数组给出[x,y,z],表示任意的方向,并不严格限定为坐标系的坐标轴。
需要指出的是,相机的光学中心和相机的观察点必须不一样。此外,参考平面的法向量不能和z坐标轴平行,否则,相机位姿不能很好地确定。
当一个3D模型或者3D图形从一个特定的相机位置投影,使用create_cam_pose_look_at_point可视化非常有用。在这种情况下,由这个算子创建的位姿pose可以传入project_object_model_3d or project_shape_model_3d进行投影计算。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值