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

devtools/2025/2/13 2:26:45/

目录

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

一、基于二值化去除背景

在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.72MinDist := 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 1dev_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.ppmy.cn/devtools/158356.html

相关文章

对React中类组件和函数组件的理解?

React 中的 类组件 和 函数组件 是两种不同的组件定义方式,它们都可以用来创建 UI,但在语法、特性和使用场景上有一些区别。以下是它们的详细对比和理解: 1. 类组件(Class Components) 特点 基于 ES6 的类&#xff1a…

UIAbility 生命周期方法

生命周期流程图 UIAbility的生命周期官方文档地址https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/uiability-lifecycle-V13 1. onCreate(want: Want, launchParam: LaunchParam) 触发时机:Ability首次创建时 作用:初始化核心资源…

Lucene 中的并发错误:如何修复乐观并发失败

作者:来着 Elastic Benjamin Trent 及 Ao Li 感谢 CMU PASTA 实验室开发的确定性并发测试框架 Fray,我们找到了一个棘手的 Lucene 漏洞并将其修复。 是的,另一个修复错误博客。但这个故事有一个转折,一位开源英雄突然出现并拯救了…

Stylelint 如何处理 CSS 预处理器

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Android Studio:键值对存储sharedPreferences

一、了解 SharedPreferences SharedPreferences是Android的一个轻量级存储工具,它采用的存储结构是Key-Value的键值对方式,类似于Java的Properties,二者都是把Key-Value的键值对保存在配置文件中。不同的是,Properties的文件内容形…

【Java 面试 八股文】MySQL 篇

MySQL 篇 1. MySQL中,如何定位慢查询?2. 那这个SQL语句执行很慢,如何分析呢?3. 了解过索引吗?(什么是索引)4. 索引的底层数据结构了解过吗?5. B树和B树的区别是什么呢?6.…

云原生时代的后端开发:架构、工具与最佳实践

随着云计算的迅猛发展,云原生(Cloud Native)逐渐成为后端开发的主流趋势。云原生后端不仅能够提高应用的灵活性和可扩展性,还能显著优化开发和运维流程。本文将围绕云原生后端的关键概念、当前热门技术及最佳实践,帮助…

【练习】图论

F. Friendly Group 图中选择一个点-1 边两端点都选择1 边一个端点选择-1 添加链接描述 #include<iostream> using namespace std; #include<vector> #include<cstring> const int N300010; int n,m; vector<int> G[N]; int temp1,temp2; bool vis[N…