当前位置: 首页 > article >正文

halcon三维点云数据处理(十四)在3D场景中去除背景的三种方式

目录

  • 一、基于二值化去除背景
  • 二、基于参考平面去除背景
  • 三、基于参考场景去除背景
  • 四、总结

一、基于二值化去除背景

在2D空间中:reduce_object_model_3d_by_view (Regions, ObjectModel3DScene, [], [], ObjectModel3DReduced) 首先二值化得到region,然后按region进行筛选。
在3D空间中:select_points_object_model_3d (ObjectModel3DScene, ‘point_coord_z’, MinDist, MaxDist, ObjectModel3DReduced) 通过选取点进行筛选

for SceneIdx := 2 to 4 by 1
    * Get 3D Scene from XYZ-image.
    read_image (ImageXYZ, 'boxes/cardboard_boxes_xyz_' + SceneIdx$'02d')
    read_image (Image, 'boxes/cardboard_boxes_' + SceneIdx$'02d')
    decompose3 (ImageXYZ, XScene, YScene, ZScene)
    xyz_to_object_model_3d (XScene, YScene, ZScene, ObjectModel3DScene)
    xyz_attrib_to_object_model_3d (XScene, YScene, ZScene, Image, '&gray', ObjectModel3DScene)
    * 
    * Determine threshold values.
    MaxDist := 0.72
    MinDist := 0.28
    * 
    * Remove background.
    get_object_model_3d_params (ObjectModel3DScene, 'has_xyz_mapping', HasXYZMappings)
    if (HasXYZMappings == 'true')
        * In 2D space.
        threshold (ZScene, Regions, MinDist, MaxDist)
        reduce_object_model_3d_by_view (Regions, ObjectModel3DScene, [], [], ObjectModel3DReduced)
        dev_open_window (0, 608, 600, 600, 'black', WindowHandle1)
        set_display_font (WindowHandle1, 16, 'mono', 'true', 'false')
        dev_display (ZScene)
        dev_set_color ('#f28d26')
        dev_display (Regions)
        dev_disp_text ('Apply threshold on Z-image', 'window', 'top', 'left', 'black', [], [])
        dev_set_window (WindowHandle)
        Instructions[0] := 'Rotate: Left button'
        Instructions[1] := 'Zoom:   Shift + left button'
        Instructions[2] := 'Move:   Ctrl  + left button'
        PoseVis := [-0.19, -0.52, 4.5, 310, 15, 330, 0]
        visualize_object_model_3d (WindowHandle, ObjectModel3DScene, [], PoseVis, 'intensity_0', '&gray', 'Full Scene', [], Instructions, PoseOut)
        dev_set_window (WindowHandle1)
        dev_close_window ()
    else
        * In 3D space.
        dev_set_window (WindowHandle)
        Instructions[0] := 'Rotate: Left button'
        Instructions[1] := 'Zoom:   Shift + left button'
        Instructions[2] := 'Move:   Ctrl  + left button'
        PoseVis := [-0.19, -0.52, 4.5, 310, 15, 330, 0]
        visualize_object_model_3d (WindowHandle, ObjectModel3DScene, [], PoseVis, 'intensity_0', '&gray', 'Full Scene', [], Instructions, PoseOut)
        select_points_object_model_3d (ObjectModel3DScene, 'point_coord_z', MinDist, MaxDist, ObjectModel3DReduced)
    endif
    * 
    * Visualization.
    Text := 'Reduced Scene'
    visualize_object_model_3d (WindowHandle, ObjectModel3DReduced, [], PoseOut, 'intensity_0', '&gray', Text, [], Instructions, PoseOut)
endfor
disp_continue_message (WindowHandle, 'black', 'true')
stop ()

二、基于参考平面去除背景

通过估计一个(背景),去除背景。
拟合和生成参考平面:fit_surface_first_order (ROI, ZScene, ‘tukey’, 5, 2, Alpha, Beta, Gamma)
get_image_size (ZScene, Width, Height)
gen_image_surface_first_order (ImageSurface, ‘real’, Alpha, Beta, Gamma, Width / 2, Height / 2, Width, Height)
真实平面和生成参考平面做差值,选取非背景区域:
sub_image (ZScene, ImageSurface, ImageSub, 1, 0)
threshold (ImageSub, Regions, -1, -0.03)
reduce_object_model_3d_by_view (Regions, ObjectModel3D, ‘xyz_mapping’, [], ObjectModel3DReduced)

dev_open_window (0, 0, 600, 600, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
PoseVis := [-0.19, -0.52, 4.5, 310, 15, 330, 0]
* 
* Online step: Apply estimated plane
* to acquired scenes.
for i := 2 to 4 by 1
    * 
    read_image (ImageXYZ, 'boxes/cardboard_boxes_xyz_' + i$'02d')
    read_image (Image, 'boxes/cardboard_boxes_' + i$'02d')
    decompose3 (ImageXYZ, XScene, YScene, ZScene)
    * 
    xyz_attrib_to_object_model_3d (XScene, YScene, ZScene, Image, '&gray', ObjectModel3D)
    * 
    Instructions[0] := 'Rotate: Left button'
    Instructions[1] := 'Zoom:   Shift + left button'
    Instructions[2] := 'Move:   Ctrl  + left button'
    visualize_object_model_3d (WindowHandle, ObjectModel3D, [], PoseVis, 'intensity_0', '&gray', 'Full scene', [], Instructions, PoseOut)
    object_model_3d_to_xyz (X, Y, Z, ObjectModel3D, 'from_xyz_map', [], [])
    * 
    * Remove duplicated points in 2D.
    threshold (Z, Regions1, 0.2, 0.5)
    * 
    * Remove background.
    sub_image (ZScene, ImageSurface, ImageSub, 1, 0)
    threshold (ImageSub, Regions, -1, -0.03)
    reduce_object_model_3d_by_view (Regions, ObjectModel3D, 'xyz_mapping', [], ObjectModel3DReduced)
    * 
    * Visualization .
    visualize_object_model_3d (WindowHandle, ObjectModel3DReduced, [], PoseVis, 'intensity', '&gray', 'Reduced Scene', [], Instructions, PoseOut)
endfor

三、基于参考场景去除背景

1、获取一个没有任何物体的参考场景(离线步骤,场景中没有目标)。
2、从有目标场景的z映射中减去参考场景的z映射,然后二值化,删除噪声。

dev_disp_introduction_reference_scene ()
stop ()
* 
* Read reference scene.
dev_disp_text ('Reading model. This may take a moment.', 'window', 'bottom', 'right', 'black', [], [])
read_image (ImageRefPlane, 'metal-parts/metal_parts_reference_plane_xyz')
decompose3 (ImageRefPlane, XRef, YRef, ZRef)
xyz_to_object_model_3d (XRef, YRef, ZRef, ReferenceScene)
* Initialize visualization.
dev_close_window ()
dev_open_window (0, 0, 600, 600, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
PoseVis := [-135, -500, 4000, 300, 15, 45, 0]
VisParams := ['alpha', 'color', 'point_size']
VisValues := [0.1, 'gray', 1]
Instructions[0] := 'Rotate: Left button'
Instructions[1] := 'Zoom:   Shift + left button'
Instructions[2] := 'Move:   Ctrl  + left button'
* 
visualize_object_model_3d (WindowHandle, ReferenceScene, [], PoseVis, VisParams, VisValues, 'Reference scene', [], Instructions, PoseOut)
* 
PoseVis := [-96, -522, 2047, 296, 11, 57, 0]
* Online step. Subtract reference scene from
* acquired scene.
for I := 1 to 2 by 1
    dev_disp_text ('Reading model. This may take a moment.', 'window', 'bottom', 'right', 'black', [], [])
    read_image (ImageScene, 'metal-parts/metal_parts_xyz_' + I$'02')
    decompose3 (ImageScene, ImageX, ImageY, ImageZ)
    xyz_to_object_model_3d (ImageX, ImageY, ImageZ, ObjectModel3D)
    visualize_object_model_3d (WindowHandle, ObjectModel3D, [], PoseVis, VisParams, VisValues, 'Full scene', [], Instructions, PoseOut)
    * Subtract reference scene in 2D.
    sub_image (ZRef, ImageZ, ImageSub, 1, 0)
    * 
    * Apply a threshold smaller than the thickness of the object.
    threshold (ImageSub, Region, 0.7, 1e+10)
    * 
    * Remove noise.
    connection (Region, ConnectedRegions)
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 100, 1e+10)
    union1 (SelectedRegions, RegionUnion)
    * 
    * Reduce the point cloud to the objects on plane.
    reduce_object_model_3d_by_view (RegionUnion, ObjectModel3D, [], [], ObjectModel3DReduced)
    * 
    * Visualization.
    VisParamsResult := ['color_0', 'alpha_0', 'color_1', 'alpha_1', 'point_size_0', 'point_size_1']
    VisValuesResult := ['gray', 0.3, 'forest green', 0.3, 1, 2]
    Text := 'Reduced Scene'
    Text[1] := 'The objects have been separated from the background'
    visualize_object_model_3d (WindowHandle, [ObjectModel3D,ObjectModel3DReduced], [], PoseOut, VisParamsResult, VisValuesResult, Text, [], Instructions, PoseOut)
endfor
* 

四、总结

1、上面三种方式,本质上第一步都是在Z-mapping筛选目标Region。
2、第二部根据使用reduce_object_model_3d_by_view函数,裁剪3D模型


http://www.kler.cn/a/543565.html

相关文章:

  • 小结:OSPF的网络类型,LSA
  • 栈的简单介绍
  • NO.12十六届蓝桥杯备战|关系操作符|操作符连用|浮点数比较|练习2道(C++)
  • Spring中常见的设计模式
  • 【AI赋能】蓝耘智算平台实战指南:3步构建企业级DeepSeek智能助手
  • 开源机器人+具身智能 解决方案+AI
  • [SAP ABAP] OO ALV报表练习1
  • 算法与数据结构(合并两个有序数组)
  • OpenCV2D 特征框架 (24)处理矩形框集合函数groupRectangles()的使用
  • 免费体验,一键部署!Alaya NeW应用市场正式上线DeepSeek系列模型
  • Linux零基础快速入门(非常详细),全覆盖Linux的基础知识,看完这一篇就够了。
  • 基于CanMV IDE 开发软件对K210图像识别模块的开发
  • 基于单片机的仓库安防系统(论文+源码)
  • (篇六)基于PyDracula搭建一个深度学习的软件之新版本ultralytics-8.3.28调试
  • 机器学习 - 机器学习模型的评价指标
  • HackerRank C++面试,中等难度题目 - Attribute Parser
  • 【C++高并发服务器WebServer】-18:事件处理模式与线程池
  • 基于Java的分布式系统架构设计与实现
  • Kafka的ISR是什么,HW是什么,怎么保证可靠性,Kafka怎么实现顺序消息?为什么Kafka的broker上的topic越多,效率越慢?
  • 嵌入式WebRTC压缩至670K,目标将so动态库压缩至500K,.a静态库还可以更小
  • 基于SpringBoot+Vue的扶贫助农管理系统
  • ubuntu下ollama/vllm两种方式在本地部署Deepseek-R1
  • 用语言模型探索语音风格空间:无需情感标签的情 感TTS
  • 常用HAL库
  • 【05】RUST常用的集合函数宏类型
  • 通过openresty和lua实现随机壁纸