Haclon 3D边缘提取(edges_object_model_3d)

edges_object_model_3d( : : ObjectModel3DMinAmplitudeGenParamNameGenParamValue : ObjectModel3DEdges)

一 、说明

该操作符仅支持从包含XYZ映射的3D物体模型中提取边缘,例如使用xyz_to_object_model_3d创建的模型或通过传感器获取的具有映射关系的模型。

ObjectModel3DEdges中的点法向量还包含了从视点到边缘点的每个3D边缘点的观察方向。此外,属性'edge_dir_x', 'edge_dir_y'和'edge_dir_z'包含一个垂直于边缘方向和观看方向的矢量。在find_surface_model中设置属性,使3D对象模型可以用于基于边缘支持的表面匹配。

 二 、参数

MinAmplitude

MinAmplitude定义了被分类为边缘的不连续性的最小振幅。它以与ObjectModel3D中使用的相同单位给出。

依次为0.01,0.1,0.5倍的直径时的结果,越大点数越小

最大间距

该参数指定了在关闭的XYZ图像中的最大间隙大小(以像素为单位)。大于此值的间隙将在其边界处包含边缘,而小于此值的间隙则不会。这样可以抑制未被传感器重建的较小补丁周围的边缘以及不连续性更远部分的边缘。对于具有非常高分辨率传感器的情况,应增加该值以避免虚假边缘出现。

依次为0.01,0.1,0.5倍的直径时的结果,越大点数越小

视点:

此参数指定从哪个视点查看3D数据。它用于确定观察方向和边缘方向。它默认为3D数据的原点'0 0 0'。如果投影中心在不同的位置,例如,如果3D对象模型使用rigid_trans_object_model_3d进行了转换,或者3D传感器执行了类似的转换,则必须设置原始视点。为此,GenParamValue必须包含一个由视点的三个坐标(x, y和z)组成的字符串,用空格分隔。视点定义在与ObjectModel3D相同的坐标框架中。

视点设置为(0 0 0)和(100 0 0)对比

三、Halcon源码

dev_update_off ()
gen_empty_obj (EmptyObject)
ImagePath := 'time_of_flight/'
dev_close_window ()
read_image (Image, ImagePath + 'engine_cover_xyz_01')
decompose3 (Image, Xm, Ym, Zm)
* Remove the background plane
threshold (Zm, ModelZ, 0, 650)
* Find connected regions
connection (ModelZ, ConnectedModel)
* Select the regions for the ROI of the reference model
select_obj (ConnectedModel, ModelROI, [10,9])
union1 (ModelROI, ModelROI)
* Create the ROI
reduce_domain (Xm, ModelROI, Xm)
* 
* Display model image and ROI
dev_open_window_fit_image (Zm, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_display (Zm)
dev_set_line_width (2)
dev_set_draw ('margin')
dev_set_color ('green')
dev_display (ModelROI)
disp_message (WindowHandle, 'Create surface model from XYZ image region', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_clear_window ()
* 
* Create the surface model from the reference view
xyz_to_object_model_3d (Xm, Ym, Zm, ObjectModel3DModel)
create_surface_model (ObjectModel3DModel, 0.03, [], [], SFM)
* 
* Display the model
Instructions[0] := 'Rotate: Left button'
Instructions[1] := 'Zoom:   Shift + left button'
Instructions[2] := 'Move:   Ctrl  + left button'
* 
Message := 'Surface model'
visualize_object_model_3d (WindowHandle, ObjectModel3DModel, [], [], [], [], Message, [], Instructions, PoseOut)
get_object_model_3d_params (ObjectModel3DModel, 'diameter', DiameterScene)
edges_object_model_3d (ObjectModel3DModel, DiameterScene*0.1, ['max_gap'], [DiameterScene*0.2], ObjectModel3DEdges)

visualize_object_model_3d (WindowHandle, ObjectModel3DEdges, [], [], 'normal_color', 'green', Message, [], Instructions, PoseOut)
stop()
* Initial, Minimum and Maximum parameter values
get_object_model_3d_params (ObjectModel3DModel, 'center', CenterScene)
get_object_model_3d_params (ObjectModel3DModel, 'diameter', DiameterScene)

DefaultAmplitude := 10
MinAmplitude := 0.0001 * DiameterScene
MaxAmplitude := DiameterScene
DefaultMaxGap := 30
* 
get_object_model_3d_params (ObjectModel3DModel, 'mapping_size', MappingSize)
MinMaxGap := 0
MaxMaxGap := max(MappingSize)
* 
Viewpoint := [100,0,0]
ViewpointStr := Viewpoint[0] + ' ' + Viewpoint[1] + ' ' + Viewpoint[2]
* With this method, the viewpoint would be very far away in view 2, leading to not-so-nice
* visualization. Adapt the distance to be always <= SceneDiameter.
Direction := Viewpoint - CenterScene
Length := sqrt(sum(Direction * Direction))
LengthRel := Length / DiameterScene
if (LengthRel > 1)
    Direction := Direction / LengthRel
endif
ViewpointViz := CenterScene + Direction
* 
try
    edges_object_model_3d (ObjectModel3DModel, DefaultAmplitude, ['max_gap','viewpoint'], [DefaultMaxGap,ViewpointStr], ObjectModel3DEdges)
    sample_object_model_3d (ObjectModel3DEdges, 'fast_compute_normals', DiameterScene * 0.02, [], [], ObjectModel3DEdges)
    get_object_model_3d_params (ObjectModel3DEdges, 'edge_dir_' + ['x','y','z'], EdgeDirs)
    set_object_model_3d_attrib (ObjectModel3DEdges, 'point_normal_' + ['x','y','z'], [], EdgeDirs, ObjectModel3DEdgeDirs)
catch (Exception)
    * Unable to extract edges -> create a dummy 3D object model instead
    gen_empty_object_model_3d (ObjectModel3DEdges)
    gen_empty_object_model_3d (ObjectModel3DEdgeDirs)
endtry
* 
* We only define a viewpoint, not a full camera. "Fake" a camera that looks towards the center of
* gravity of the scene. Do not point it towards the center of the bounding box, since that is rather
* unstable (a single outlier point would distort it).
moments_object_model_3d (ObjectModel3DModel, 'mean_points', CenterSceneGravity)
gen_object_model_3d_from_points ([ViewpointViz[0],CenterScene[0]], [ViewpointViz[1],CenterScene[1]], [ViewpointViz[2],CenterScene[2]], OM3DLineSphereToScene)
set_object_model_3d_attrib_mod (OM3DLineSphereToScene, 'lines', [], [2,0,1])


visualize_object_model_3d (WindowHandle, [ObjectModel3DEdges,OM3DLineSphereToScene], [], [],['disp_normals','disp_lines','line_color'], ['true','true','green'], Message, [], Instructions, PoseOut)

















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值