点云处理及三维重建软件(Point Cloud Viewer, PCV)的设计与实现

news2024/11/24 6:23:28

GitHub
地址:point-cloud-viewer

文章目录

  • 使用教程以及相关工具库
    • Step 1 搭建环境
    • Step 2 使用Cmake构建工程
    • Step3 使用VS 编写code并编译执行
  • 点云处理及三维重建软件(PCV)的设计与实现
  • 一, 软件总体设计
    • 1.1 软件设计流程
      • 需求分析
      • 总体设计
      • 技术选型
      • 详细设计
      • 功能实现
      • 运行测试
    • 1.2 软件组成结构
      • 点云IO模块
      • 点云处理模块
      • 三维可视化模块
    • 1.3 软件工作流程
  • 二,软件开发平台及功能介绍
    • 2.1 软件开发平台
      • 集成开发环境
      • PCL点云数据处理库
      • 编译配置工具CMake
    • 2.2 软件主界面设计
      • 菜单栏
      • 工具栏
      • 点云属性窗口以及主窗口
      • 点云处理记录窗口
      • 软件相关数据结构
  • 三,软件点云处理相关功能
    • 3.1 点云预处理功能
    • 3.2 点云配准功能
    • 3.3 点云表面重建功能
    • 3.4 点云分割功能
      • 点云属性计算功能
  • 四,软件运行和测试
    • 4.1 点云预处理功能测试
    • 4.2 点云配准功能测试
    • 4.3 点云表面重建功能测试
    • 4.4 点云分割功能测试
    • 4.5 点云属性计算功能测试
  • 五,总结

Point Cloud Viewer, PCV是一款基于集成点云显示以及点云处理的软件,点云处理功能主要包括以下功能:

  1. 点云分割
  2. 点云离群点移除
  3. 点云滤波
  4. 点云配准
  5. 关键点提取
  6. 点云表面重建
  7. 几何属性计算

软件采用Qt设计实现,其界面设计参考Cloud Compare,内核算法基于点云处理工具库PCL实现。具体的设计实现详情见下文。

以下是一些demo:
在这里插入图片描述

请添加图片描述

请添加图片描述
请添加图片描述
请添加图片描述

使用教程以及相关工具库

下表为本软件所采用的技术方案,读者如果想要跑通本工程,建议参考下表:

序号技术采用方案
1编程语言C++ 11
2点云工具库PCL 1.9.1
3可视化工具库VTK 8.1
4GUI框架Qt 5.13.2
5IDE(开发环境)VS2017+Qt Creator
6编译器MSVC 2017
7运行环境Windows / Linux / Mac OS

Step 1 搭建环境

  1. 安装PCL 1.9.1,与之对应的VTK版本为VTK 8.1 。为了便于读者复现,原本想把PCL1.9.1的整个工程上传到Github项目中,奈何文件过大无法上传。于是我上传到了CSDN,该项目工程中已包含了VTK 8.1,读者可自行获取。
  2. 安装 Cmake
  3. 安装 Qt
  4. 安装 Visual Studio

Step 2 使用Cmake构建工程

本项目使用Cmake来构建工程:

其中最重要的是CMakeLists.txt的编写:

cmake_minimum_required(VERSION 3.5)

project(PointCloudViewer VERSION 0.1 LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package (VTK REQUIRED)
IF (VTK_FOUND)
    MESSAGE(STATUS "VTK found.")
    INCLUDE(${VTK_USE_FILE})
ENDIF()

find_package (PCL 1.7.0 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets REQUIRED)

set(PROJECT_SOURCES
        main.cpp
        pclvisualizer.cpp
        pclvisualizer.h
        pclvisualizer.ui
        # 测试
        inputdialog.h
        inputdialog.cpp
        inputdialog.ui
                images.qrc
		logo.rc

)

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(PointCloudViewer
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
    )
# Define target properties for Android with Qt 6 as:
#    set_property(TARGET PointCloudViewer APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
#                 ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation
else()
    if(ANDROID)
        add_library(PointCloudViewer SHARED
            ${PROJECT_SOURCES}
        )
# Define properties for Android with Qt 5 after find_package() calls as:
#    set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
    else()
        add_executable(PointCloudViewer
           # 是否打开控制台
           # WIN32
            ${PROJECT_SOURCES}
        )
    endif()
endif()

target_link_libraries(PointCloudViewer PRIVATE Qt${QT_VERSION_MAJOR}::Widgets ${PCL_LIBRARIES} ${VTK_LIBRARIES})

set_target_properties(PointCloudViewer PROPERTIES
    MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
)

if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(PointCloudViewer)
endif()

具体的使用方法:

在这里插入图片描述

Step3 使用VS 编写code并编译执行

构建完成后,在输出文件夹里有PointCloudViewer.sln 文件,使用VS打开即可
在这里插入图片描述
在这里插入图片描述

如果出现无法启动程序的问题,参考博文:

使用CMake+Visual Studio编译生成的项目出现无法启动程序的问题解决办法

将PointCloudViewer设为启动项目即可:

在这里插入图片描述

点云处理及三维重建软件(PCV)的设计与实现

本章将围绕点云处理及三维重建软件(Point Cloud Veiwer, PCV)的总体设计、功能开发以及运行测试而展开。

一, 软件总体设计

在对本文点云处理及三维重建软件进行设计之前,需要遵守两个通用的软件设计准则:

  1. 稳定性准则。在设计软件时,应在优先考虑稳定性的前提下,再去提高其性能和效率。比如在开发软件时,应尽量选用已经成熟的技术方案以及高效稳健的算法。
  2. 可扩展性准则。具有良好的兼容性和可扩展性的软件当面对用户需求增加或者改变时,可以很快地进行升级或者更新,而不是将旧的软件淘汰,重新进行开发。

1.1 软件设计流程

图 1为本文点云处理及三维重建软件的设计流程图,一个成熟可靠的软件的设计与实现首先需要完整清晰的设计思路,以及遵守规范的软件系统设计原则。

在这里插入图片描述

图 1 点云处理及三维重建软件的设计流程

从图 1中可知本文软件的设计流程主要有6大步骤:

需求分析

软件在设计实现之前,必须分析用户需求,即明确当前软件需要实现哪些功能以及需达到的最终效果,以解决用户当前遇到的问题。如表 1所示,为本章所设计实现的点云处理及三维重建软件的需求分析表格。

表 1 点云处理及三维重建软件功能列表

序号需求功能描述
1点云数据采集与激光雷达建立通信,将采集到的数据保存
2点云预处理对点云数据进行下采样、去噪和平滑
3点云配准将多帧点云数据拼接,生成目标物体的完整的三维模型
4点云表面重建还原目标物体真实的表面细节特征
5点云模型可视化显示对点云模型进行可视化操作(旋转、平移以及缩放)
6点云模型导出将生成的点云模型导出的多种指定格式
7点云分割按照点云的不同特征,对点云数据进行分割
8点云属性计算计算点云的表面积、体积、质心以及外接圆半径等属性

总体设计

在需求分析后,设计出软件的总体架构,以及确定其各个功能模块。软件的总体架构见图 2。

技术选型

开发者根据当前预算、开发周期以及开发者自身的知识储备来选择合适的软硬件环境来进行软件的开发,这个过程称为技术选型。本文根据实际情况,在对当前点云三维重建关键技术进行研判后,为点云处理及三维重建软件的开发所列出的技术选型清单如表 2所示。

表 2 点云处理及三维重建软件技术选型

序号技术采用方案
1编程语言C++ 11
2点云工具库PCL 1.9.1
3可视化工具库VTK 8.1
4GUI框架Qt 5.13.2
5IDE(开发环境)VS2017+Qt Creator
6编译器MSVC 2017
7运行环境Windows / Linux / Mac OS

详细设计

通过软件的总体设计与技术选型后,已经初步确定了该软件的技术方向以及功能模块。接下来就是对每个功能模块进行具体的设计。例如模块中算法的设计或选择,操作界面的设计等等。

功能实现

通过对软件的详细设计之后,开始对软件的具体功能进行开发实现,主要包括软件界面的开发以及三维重建关键技术相关的算法代码的实现。

运行测试

软件开发完成后,需要对软件进行测试,通过使用一些数据量大、表面特性复杂的点云数据作为输入,以测试软件的极限性能。

1.2 软件组成结构

图 2为本文所设计的点云处理及三维重建软件的总体架构图,从图中可知,本文软件主要可分为三个功能模块:点云IO模块,点云处理模块以及三维可视化模块。

在这里插入图片描述

图 2 点云处理及三维重建软件架构图

下面为这三个主要功能模块进行简短的说明介绍:

点云IO模块

点云IO(Input / Output)模块主要负责点云数据的读取、转换以及保存。值得一提的是,本文软件有两种点云读取方式:一是与激光雷达建立通信,实时读取激光雷达扫描得到的点云数据,并在本地另存,目前支持的激光雷达品牌有Velodyne和镭神。二是直接读取现有的点云数据文件,本文软件目前支持的文件格式有:PCD、PLY、STL、PCAP、TXT以及OBJ等6种格式,并支持这些格式的相互转换。

点云处理模块

点云处理模块是本文软件的核心功能模块,它具有五大主要功能:点云预处理、点云配准、表面重建、点云分割以及点云属性提取。其中,点云预处理、点云配准以及表面重建等功能属于基于激光雷达的三维重建的关键技术,是本文的研究重点,其中不仅融合了本文提出的各种改进算法,还集成了大量的国内外经典的点云处理算法。算法的选择具有较高的自由度,便于用户根据待重建目标点云的实际情况,选择合适的算法进行三维重建。此外,点云分割以及点云属性提取为在三维重建技术的基础上进行拓展,而开发的功能,用于辅助用户解决在三维重建中的遇到的各种问题,比如对目标点云进行分割提取,获取点云的具体几何属性等。

三维可视化模块

三维可视化模块主要包含可视化界面、可视化显示以及可视化操作等功能。可视化界面由主窗口、点云属性窗口、点云处理控制台窗口、工具栏、菜单栏等五部分组成,其界面设计友好,易用性强。点云的可视化显示与操作功能通过QVTKWidget插件,将三维重建过程中产生的结果进行实时可视化,并可以任意旋转、缩放、平移以及改变点云颜色,以便于用户更加细致地观察点云模型。

1.3 软件工作流程

基于点云处理及三维重建软件的三个主要功能模块,其工作流程如图 3所示:

在这里插入图片描述

图 3 点云处理及三维重建软件工作流程图

从图 3中可知,本章软件的主要工作流程有以下步骤:

  • 步骤1:读取点云数据。本文软件支持多达6种格式的点云数据。

  • 步骤2:点云格式转换。不同格式的点云文件携带的点云信息各有不同,为了能进行高效的点云处理及三维重建,用户可以将点云格式进行转换,删除冗余数据,只保留点云处理过程中需要的信息(如描述数据点的XYZ坐标,RGB颜色信息等)。

  • 步骤3:点云处理及三维重建。将点云数据进行预处理、点云配准以及点云表面重建等操作。从而将原始的由离散数据点构成的点云图像转换成能展现目标物体表面细节特征的三维模型。并且还可以对点云进行点云分割和点云属性计算,以提取其他有效信息。

  • 步骤4:三维可视化显示与操作。用户可以通过对点云模型进行旋转、平移以及缩放等操作,可以全方位地观察三维模型。

  • 步骤5:保存三维模型。用户可以选择将重建好的三维模型保存成不同格式的三维模型。

二,软件开发平台及功能介绍

2.1 软件开发平台

集成开发环境

本文所设计的点云处理及三维重建软件主要基于Microsoft Visual Studio 2017以及Qt Creator两个集成开发环境,来完成代码的编写、分析、编译以及调试工作。此外,本文主要基于Qt框架来完成软件界面的设计以及内部逻辑功能的实现,Qt具有一套代码,多平台运行的特点,因此使用此框架开发的软件不仅能够在Windows和Linux等操作系统上运行,还能在MacOS上运行。也正是因为Qt的跨平台开发的特性,也使得本章所设计的软件可以在多个操作系统中正常运行。不仅如此,Qt还可以结合PCL进行开发,通过使用QVTKWidget插件,可以开发处具有GUI的点云处理软件。Qt使用的集成开发环境为Qt Creator,本章主要使用此IDE完成软件UI的设计。

PCL点云数据处理库

点云库(Point Cloud Library)简称PCL,它同样具有跨平台开发的特性,采用BSD开源协议,不仅允许开发者在PCL工具库的基础上进行二次开发,而且还鼓励国内外学者们将自己的点云数据相关研究成果以代码的形式共享出来。因此,PCL中大量地集成了国内外点云数据获取及处理的通用算法以及高效的点云相关数据结构。常用的算法模块有:表面重建模块、点云滤波模块以及点云配准模块。常用点云相关数据结构有OC-TREE和KD-TREE等。本文中的大部分算法实现均以PCL工具库为基础,在其提供的算法源码上进行改进优化,此外本文所使用的可视化类为pcl∷PCLVisualizer,并通过重新编译视觉化工具库(Visualization Toolkit, VTK)源码,生成与PCL对应版本的QVTKWidget插件,装载在基于Qt的可视化软件中用以显示点云处理结果。

编译配置工具CMake

CMake是一款高级编译(安装)配置工具,它同样支持跨平台的特性,因此可以根据当前选择的平台(如VS2017)以及编译器(如MSVC或MinGW等)输出对应的Makefile文件或Project文件。CMake的使用比较简单,只需要在其组态档(一种构建项目专用的CMake脚本)中编写配置环境变量以及依赖库的命令语句即可。CMake的组态档以CMakeLists.txt命名。本文中使用的PCL、VTK以及Qt均使用CMake工具进行编译环境的配置。

在这里插入图片描述

图 4 PCL功能模块

2.2 软件主界面设计

图 5为本文软件启动时的加载页面,软件主界面的布局如图 6所示,其参考了国外的开源点云处理软件Cloud Compare,除此之外,本文软件的内部逻辑功能及各种算法的具体实现均由本文独立设计开发。从图 7可知,软件共有六大功能区,分别是:菜单栏、点云处理工具栏、点云视图操作工具栏、点云属性窗口、点云显示主窗口以及操作记录窗口。

在这里插入图片描述

在这里插入图片描述
文件菜单
在这里插入图片描述
快捷键菜单

图 7软件主界面详解

菜单栏

本文软件的菜单栏中共有13个菜单,如图 8所示,除了点云处理相关功能菜单外,菜单栏中还有文件菜单栏和快捷键菜单栏等提高软件使用效率的功能。图 9为软件中与点云文件处理相关的菜单示意图,不仅支持各种格式点云的导入导出,还支持将点云处理日志导出。图 9为软件中的快捷键菜单,用户既可以点击菜单项也可以之间按下快捷键,来运行软件的某些功能,如屏幕快照、数据点大小设置以及点云视图缩放等。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

图 9 文件菜单及快捷键菜单

工具栏

用户既可以在菜单栏中点击相应的菜单项来运行具体功能,也可以通过点击工具栏中的图标按钮进行快速操作。软件工具栏有两个,图 10为可视化操作工具栏, 表 3为工具栏各按钮图标的功能释义。通过点击其中的按钮,可以快速地操作点云视图,比如有快速查看目标点云的六视图、点云旋转固定角度以及点云缩放等操作。图 11为软件算法工具栏,表 4为算法工具栏各按钮图标的功能释义,算法工具栏中涵盖了点云处理相关操作功能,比如有点云的复制粘贴、点云导出以及点云三维重建相关的快捷操作等操作。

在这里插入图片描述
在这里插入图片描述

表 3 软件可视化操作工具栏图标功能详解
在这里插入图片描述
在这里插入图片描述

点云属性窗口以及主窗口

图 12右侧为点云主窗口,用于显示当前加载的点云文件,不仅可以使用鼠标对目标点云进行拖拽、缩放以及旋转等操作,还可以在窗口中添加坐标轴和标尺等工具,便于对目标点云进行可视化操作。图 12左侧为点云属性主窗口,通过此窗口,可知软件当前加载以及选中的点云文件的具体属性,如文件格式、文件名称、点云数量、数据格式以及所含字段等信息。

在这里插入图片描述

图 12 点云属性窗口及主窗口

点云处理记录窗口

由于点云处理的相关步骤较多,为了使用户在点云处理过程中步骤更加清晰明了,本文软件特别设置了一个点云处理记录窗口,用于记录当前点云操作的具体详情,如图 13所示,每条记录主要有三部分组成:操作时间、操作结果以及操作详情。不仅如此,点云处理记录还支持一键导出,方便用户对点云处理中各流程进行记录和分析。

在这里插入图片描述

图 13软件点云处理记录窗口

软件相关数据结构

本文所设计的点云处理及三维重建软件不仅支持直接读取点云数据进行处理,也可以实时读取激光雷达所扫描到的点云数据,并保存到本地。以Velodyne激光雷达为例,上位机与激光雷达建立网络通信后,本文软件将持续性地读取Velodyne激光雷达发送过来的UDP报文,并将UDP报文解析,并以PCAP文件的形式将原始的点云数据保存到本地,PCAP的文件结构如图 14。PCAP文件中保存的是点云数据流,换言之,一个PCAP文件中包含了多帧的点云图像,每帧点云图像数据都有自己的数据头部(Packet Header)以及时间戳(Timestamp)。在实际的点云处理过程中,并不需要多帧重复的点云图像,因此,只需要在PCAP文件中提取其中一帧点云图像,并将冗余的信息移除,即可得到描述目标物体的关键帧点云图像。单帧的点云图像根据其用途以及处理方式的不同,其存储方式有很多,常见的比如有PCD、PLY以及STL格式。

在这里插入图片描述

图 14 PCAP文件结构

由于本文软件是基于PCL工具库而设计开发的,而PCL不但对PCD格式的兼容度最高,而且对PCD文件的读写速度也比其他格式要快,所以本软件也选择PCD格式作为点云数据读写的首要格式。在PCD文件的头部(前10行),都必须先声明当前点云数据的各种属性,属性包含10个字段,每个字段占一行,表 5所示为PCD各个字段的意义说明。从FIELDS字段中可以知道当前点云每个数据点所包含的信息,从表 5中可以看到,例如 ,则说明每个数据点包含坐标信息,若是,则说明每个数据点除了坐标信息外,还包含每个点云颜色属性(RGB)。此外POINTS、WIDTH以及HEIGTH字段有 的关系,若当前点云为无序点云,则HEIGTH的值为1,WIDTH也可以表示当前点云中点的个数。DATA字段之后的内容为点云的数据部分,在.7版本的PCD中,支持格式和格式。需要注意的是,PCD文件中各个字段有严格的顺序要求且不能缺失,必须按照表 5所示顺序进行描述。

表 5 PCD文件字段含义

序号字段字段含义示例
1VERSIONPCD文件版本.7
2FIELDS点数据的维度和内容x y z
3SIZE每一个维度的字节数4 4 4
4TYPE每一个维度的类型F F F
5COUNT每一个维度包含的元素数目1 1 1
6WIDTH点云数据集的宽度56258
7HEIGTH点云数据集的高度1
8VIEWPOINT点云的获取视点0001000
9POINTS点云中点的数目56258
10DATA点云数据的数据类型,包括格式和

三,软件点云处理相关功能

在上文图 2中的软件组成结构中提到了点云处理模块,其中点云处理模块包含了五大功能:点云预处理、点云配准、点云表面重建、点云分割以及点云属性提取。除了点云预处理、点云配准和表面重建等三维重建相关功能外,本文软件还以此为基础,拓展了点云分割和点云属性提取等功能。点云处理相关功能是本文软件的核心功能,其中涵盖了本文改进算法在内的国内外优秀点云处理相关算法78个,相关功能函数多达156个。并且每种点云处理算法都可独立设置输入参数,不同算法间可自由搭配使用。下面将对每个功能进行详细介绍。

3.1 点云预处理功能

点云预处理功能主要包括三部分:点云采样、点云离群点移除、点云滤波等。本文软件在点云采样功能中集成了基于体素栅格的下采样、均匀采样以及增采样在内的5种算法。如图 15(a)所示,此外还有KD-TREE、OC-TREE以及法线估计等功能。对于离群点移除功能,如图 15(b)所示,本文软件集成了基于统计、基于密度、基于聚类的DBSCAN离群点移除算法。此外,本文软件的点云滤波功能集成了高斯滤波、平均滤波以及拉普拉斯滤波在内的9种点云滤波方法,用户可以根据当前点云的实际情况选择合适的滤波方法。此外,该菜单中还有“一键移除”和“一键滤波”等功能,该功能可以使用预先设置好的算法以及算法参数对点云进行快速处理。


在这里插入图片描述
在这里插入图片描述

图 15点云预处理相关功能菜单

3.2 点云配准功能

点云配准相关功能包括关键点提取算法以及点云配准算法。如图 16(a)所示,为关键点提取相关功能菜单,本文软件集成了Agast关键点、Harris关键点、ISS关键点以及SIFT关键点在内的8种关键点提取算法。而图 16(b)为点云配准相关的功能菜单,从图中可知,本文软件集成了ICP、NDT、Super 4PCS以及本文改进的基于ISS关键点的Super 4PCS算法在内的9种配准算法。此外,对于关键点提取和和配准,本文软件也设置了“一键提取”和“一键配准”等快捷功能。

在这里插入图片描述
在这里插入图片描述

图 16 点云配准相关功能菜单

3.3 点云表面重建功能

图 17为本文软件点云表面重建相关的功能菜单,本文软件支持MLS、泊松算法、贪婪投影三角化算法以及本文提出的改进贪婪投影三角化算法在内的8种表面重建算法,并且还支持“一键重建”的快捷功能。此外本文软件还可以将重建好的三维模型导出为OBJ、STL以及PLY等格式的文件,可广泛用于3D打印等其他应用场景。

3.4 点云分割功能

本文软件的点云分割功能集成了平面分割、圆柱体分割、欧式距离分割以及基于颜色的分割等算法在内的10种点云分割算法,软件的点云分割功能菜单如图 18所示。点云分割的目的是从含有多目标的点云数据中,提取用户所需的目标点云。用户可以根据点云的不同属性对目标点云采用不同的分割算法,点云分割完成后可将分割得到的不同子点云分别进行保存,以便进行下一步的处理。

在这里插入图片描述
在这里插入图片描述

点云属性计算功能

本文软件的几何属性提取功能菜单如图 19所示,软件可以计算目标点云的表面积、体积、外接圆、质心、密度以及协方差矩阵等几何属性,这些属性可以自由选择进行提取计算,也可以点击菜单中“一键提取”菜单项,将目标点云是所有属性全部计算出来。值得一提的是,本文软件中关于表面积和体积的计算功能,需要在目标点云进行表面重建后,才能进行计算。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
AABB包围盒示意图
在这里插入图片描述
OBB包围盒示意图

图 19 点云属性计算功能菜单

该功能不仅能计算目标点云的表面积,还能得出重建表面的最大单元面积和最小单元面积。事实上,经过表面重建后的曲面是由若干个单元面片拼接而成,比如使用贪婪投影三角化表面重建算法生成的曲面,就是由若干个单元三角形面片拼接而成。此外,本文软件除了能计算目标点云的实际体积外,还能计算目标点云的轴对齐包围盒(AABB)体积以及有向包围盒(OBB)体积,AABB包围盒和OBB包围盒的示意图如图 19©和图 19(d)所示,这两种体积的求取对真实目标物体的包装运输有一定的现实意义[78]。

四,软件运行和测试

本节将使用本文开发的点云处理及三维重建软件对不同场景的点云数据进行点云处理预处理实验、点云配准实验、点云表面重建实验、点云分割实验以及点云属性计算实验,以验证本文软件的有效性和实用性。图 20为选取的两个主要的实验点云图像,图 20(a)为桌子的点云图像,该点云图像数据量较大,有460400个数据点。从图像中可以看出,该点云中含有较多的离群噪声点,且点云空间不闭合,对此类点云进行三维重建的难度较大。图 20(b)为中国龙的点云图像,该点云数据量也较大,共有437645个数据点,与图 20(a)不同,该点云的空间特性呈闭合形态,但是该点云表面曲率复杂且变化大,有较多的凸起区域,对其进行三维重建同样也有较大难度。

在这里插入图片描述
在这里插入图片描述

图 20 实验点云对象

4.1 点云预处理功能测试

如图 21(a)和图 21(b)所示,为使用本文软件对两个点云图像进行加载显示的主界面。然后点击软件功能按钮,对当前点云图像进行离群点移除(使用KD-TREE加速的KANN-DBSCAN离群点移除算法)、滤波平滑(高斯滤波)以及下采样(基于体素的下采样)等预处理操作。图 21©和图 21(d)为软件处理点云时的工作示意图。图 21(e)和图 21(f)为点云预处理之后的结果。从图中可以看到,本文软件不仅将两幅点云图像中的离群点移除干净,还使得点云数据在保留其表面特征的前提下,其点云规模得到极大的精简。从表 6中可以看到,对桌子点云的点云预处理时间为1955 ms,点云精简率为0.07。中国龙点云的处理时间为1373 ms,其精简率为0.055。虽然两点云图像点云规模都从十万级精简到了万级,但是点云的轮廓特征并没有受到影响。

桌子点云图像加载完成:
在这里插入图片描述
桌子点云图像预处理中
在这里插入图片描述
桌子点云图像预处理完成
在这里插入图片描述
中国龙点云图像加载完成:
在这里插入图片描述
中国龙点云图像预处理中:
在这里插入图片描述
中国龙点云图像预处理完成:
在这里插入图片描述

图 21 软件点云预处理示意图

表 6 点云预处理实验结果

序号点云名称预处理前点云数量预处理后点云数量处理时间(ms)精简率
1桌子4604003230619550.070
2中国龙4376452414713730.055

4.2 点云配准功能测试

原始点云数据经过点云预处理操作之后,即可被用来进行点云配准实验。首先将两帧不同位置的点云数据读取到软件中,如图 22所示,图 22(a)为桌子点云的两帧处于不同位姿的点云图像,图 22(b)为中国龙在不同位姿下的两帧点云。通过点击软件上的功能按钮,选择配准算法,进行配准实验。如图 22©和图 22(d)所示,为软件正在进行配准工作的示意图。配准结果见图 22(e)和图 22(f),可以看到红色和蓝色的两帧点云几乎完全重合,点云间的重合度越高,点云配准效果越好。在软件中的点云属性窗口可以看到当前源点云(红色)到目标点云(蓝色)的转换矩阵:

在这里插入图片描述

表 7所示为点云配准的结果分析表格,上文提到过FitnessScore越小,代表两帧点云之间的距离越近,重合度越高,如果FitnessScore为0则说明两帧点云完全重合,从表中可知,桌子点云经过迭代配准11次后,其配准得分为,而中国龙经过15次迭代配准后,其配准得分为。两点云的配准得分都近似为0,说明配准效果较为精确。

在这里插入图片描述

图 22 点云配准实验示意图

表 7 点云配准实验结果

序号点云名称迭代次数处理时间(ms)FitnessScore
1桌子111069[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qgFM7Ece-1682158089230)(introduction/media/clip_image002-168213585086414.gif)]
2中国龙151585[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hhMbcxnZ-1682158089231)(introduction/media/clip_image002-168213586801317.gif)]

4.3 点云表面重建功能测试

点云配准成功后,通过点击软件中的功能按钮,选择贪婪投影三角化表面重建算法,对两个目标点云分别进行表面重建。图 23 (a)和图 23 (b)为本文软件正在进行表面重建的工作示意图。图 23 ©和图 23 (d)为经过软件表面重建后的三维模型,可以看到重建效果较好,不仅无虚假曲面生成,也没有产生曲面空洞。图 24为点云三维重建前后的对比图,从对比图中可知,即使是未闭合的曲面或者是点云表面含有大量的细节特征,本文提出的改进的表面重建算法都能很好地对点云表面细节进行还原重建。

在这里插入图片描述

图 23 软件表面重建实验示意图

在这里插入图片描述

图 24 点云表面重建前后对比

4.4 点云分割功能测试

本文软件的点云分割功能集成了10种不同类型的点云分割算法,比如平面分割、圆柱体分割、欧式距离分割以及区域生长分割等等,不同的分割算法适用于不同的点云场景以及分割需求。由于本文篇幅有限,本小节只选取软件中的点云平面分割功能以及圆柱体分割功能进行测试。

在这里插入图片描述

图 25 对桌子点云进行平面分割

在这里插入图片描述

图 26桌子点云平面分割结果示意图

图 25为本文软件对桌子点云进行平面分割的示意图,从图中可知,软件在桌子点云图像中搜索到两个平面,并分别用红色和绿色进行标记,设红色的为平面1,绿色的为平面2。点击“确定”按钮即可将搜索得到的点云平面进行提取,并另存到本地。如图 26所示,为桌子点云的分割结果,图 26(a)为点云分割的效果图,图 26(b)和图 26(d)为本文软件从桌子点云中进行平面分割得到的平面1和平面2,将两个平面抽取出后的结果如图 26©所示,可见两个平面均被完整地抽取。不仅如此,平面在三维空间中的方程如式(5.1)所示[79]:
在这里插入图片描述

根据此公式可以分别拟合得到平面1和平面2在三维点云空间中的平面方程,两平面方程参数见表 8:

表 8 桌子点云平面分割数据结果

序号点云名称参数A参数B参数C参数D
1平面1-0.0027061-0.865354-0.501154-0.494968
2平面2-0.00651102-0.87519-0.483735-1.17735

此外,本文软件还可以对点云数据进行多重分割,即通过使用不同的点云分割算法依次对点云进行分割处理。图 27(a)为另一个用于点云分割测试的原始点云数据俯视图,图 27(b)为其侧视图,从两图中可知,该点云图像所描述的场景为:一个水杯放置在桌子平面上,其中水杯带有一个半圆形的水杯把。从整体的视角可以发现,原始点云中包含了一个平面(桌子)和一个圆柱体(水杯)。

在这里插入图片描述

图 27 平面分割和圆柱体分割处理

使用本文软件对该原始点云依次进行平面分割和圆柱体分割。平面分割结果如图 27©所示,图 27(d)为圆柱体分割结果。从平面分割结果中可以看到,本文软件可以完整地将点云平面提取出来。从圆柱体的分割结果中,可见水杯的圆柱体被完整的提取出,并且没有将水杯把提取。此外,圆柱体在三维点云空间中的方程如式(5.2)所示:

在这里插入图片描述

其中,为圆柱轴线C上任意一点,为轴线C的方向向量,为圆柱的半径。根据此公式可以得到拟合出圆柱体方程参数为:

此外根据式(5.1),可以得到平面方程参数为:

4.5 点云属性计算功能测试

本文软件的点云属性计算功能支持计算点云的表面积、体积、外接圆、点云质心在内的6种属性,本次测试将主要对表面积和体积两种属性的计算而展开。

在这里插入图片描述

图 28中国龙点云属性计算

在这里插入图片描述

图 29猴子点云属性计算

图 28(a)为对中国龙点云的表面积体积计算的软件工作示意图,图 28(b)为表面积和体积的计算结果,从结果中可知,中国龙点云的表面积为0.0725956平方米,其体积为0.00478281立方米,并且其AABB包围盒体积为0.00271155立方米,OBB包围盒体积为0.00298459立方米。图 29 (a)则是软件对猴子点云进行表面积和体积计算的工作图,从计算结果图 29(b)中可知,猴子点云的表面积为10.7531平方米,其体积为2.45824立方米,并且其AABB包围盒体积为8.14628立方米,OBB包围盒体积为8.11579立方米。

五,总结

本文软件有点云IO、点云处理以及三维可视化等三大功能模块,其中共有12个主要功能。然后介绍本文软件具体的功能开发,其中包括软件的开发平台,主界面设计、软件相关数据结构以及点云处理相关功能等。点云处理相关功能是本文软件的核心功能,其中涵盖了本文改进算法在内的国内外优秀点云处理相关算法78个,相关功能函数多达156个。不仅如此,每种点云处理算法都可独立设置输入参数,不同算法间可自由搭配使用,用户对算法的选择自由度较高。最后使用不同的点云数据对软件进行点云预处理、点云配准、点云表面重建、点云分割以及点云属性计算等功能进行测试,软件测试结果表明,本章所设计开发的软件具有较高的实用性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/448992.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【RestFul系列】RestFul学习笔记

目录 一、REST定义 二、REST架构的主要原则 三、RESTful介绍 1、资源(Resources) 2、 表现层(Representation) 3、 状态转化(State Transfer) 四、RESTful的使用 1、RESTful资源操作 2、接口示例&…

verilog设计实现8b-10b编码器包括3b4b,5b6b 及modelsim仿真

下面是8b10b编码器的设计步骤。 确定数据输入和输出接口。例如,您需要确定8位并行数据输入和10位串行数据输出。 计算数据带宽。这与芯片中可用的时钟速度密切相关。 选择编码表。根据应用选择最佳编码表,8b10b编码器至少应使用一张编码表。详细了解和选择编码表有利于改善编…

图的存储及基本操作总结(邻接矩阵、邻接表)及C/C++代码实现

文章目录 前言一、邻接矩阵1.概念2.图像示例3. 代码实现注意邻接矩阵的特点 二、邻接表1.概念2.图像示例3.代码实现邻接表的特点 前言 图是一种比较复杂的数据结构,每个结点之间可以有多种关系。 所以,一个图可以呈现出千奇百怪的形式。 对于不同的形式…

使用FFMPEG库将YUV编码为H264

准备 ffmpeg 4.4 p准备一段yuv420p的格式的视频原始数据 这里我们使用命令直接提取 ffmpeg -i .\beautlWorld.mp4 -pixel_format yuv420p -s 1280x720 yuv420p_1280x720.yuv 编码流程 大致可以分为以下几步: 1.初始化编码器并设置参数 2.初始化AVPacket和AVFr…

【Java基础 1】Java 环境搭建

🍊 欢迎加入社区,寒冬更应该抱团学习:Java社区 📆 最近更新:2023年4月22日 文章目录 1 java发展史及特点1.1 发展史1.2 Java 特点1.2.1 可以做什么?1.2.2 特性 2 Java 跨平台原理2.1 两种核心机制2.2 JVM…

Activiti入门

目录 一、了解工作流 1、什么是工作流 2、工作流引擎 3、常见工作流引擎 4、Activiti7概述 4.1、Activiti介绍 4.2、建模语言BPMN 4.3、Activiti使用流程 一、了解工作流 1、什么是工作流 工作流(Workflow),就是通过计算机对业务流…

SSeg总体思路

1:在train中加载train和test数据集。 2:指定数据集为kitti,确定训练验证的batchsize。 3:提前定义好数据预处理,首先是几何变换,包括随机裁切等。 4:然后是外观变换,包括高斯滤波…

计算同列排斥力的一种可能方法

假设神经网络同列数字之间有一种排斥力,且这种排斥力也与距离的平方成反比。设0是环境,1是粒子,则两个1之间的排斥力就是距离平方的倒数。 考虑任意遥远的两个粒子之间都有排斥力,可以得到同列排斥力的计算方法为 如计算"01…

移动硬盘数据恢复软件实用技巧

在我们日常生活中,移动硬盘已经成为了我们不可或缺的存储设备之一。但是,由于各种原因,移动硬盘中的数据有时会丢失或损坏,这时候我们就需要使用移动硬盘数据恢复软件来帮助恢复数据。那么,移动硬盘数据恢复软件有哪些…

Windows环境下实现设计模式——中介者模式(JAVA版)

我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下Windows环境下如何编程实现中介者模式(设计模式)。 不知道大家有没有这样的感觉,看了一大堆编程和设计模式的书,却还是很难理解设计模式&#xff…

modbus指令测试

目录 一.抓包二.modbus与plc三.usb包分析四.编写modbus指令测试五.调试工具 一.抓包 1.串口抓包?wireshark!: https://xuxeu.github.io/uart-catch/ 2.Windows&Linux USB抓包方法总结:https://zhuanlan.zhihu.com/p/267820933 3.USB The Setup Pack…

(“树” 之 前中后序遍历 ) 94. 二叉树的中序遍历 ——【Leetcode每日一题】

基础概念:前中后序遍历 1/ \2 3/ \ \ 4 5 6层次遍历顺序:[1 2 3 4 5 6]前序遍历顺序:[1 2 4 5 3 6]中序遍历顺序:[4 2 5 1 3 6]后序遍历顺序:[4 5 2 6 3 1] 层次遍历使用 BFS 实现,利用的就是 BFS…

一文搞懂Java中的异常问题

思考几个问题 1:JavaWeb系统中,我的代码未做任何处理,报错了还会往下执行吗? 2:JavaWeb系统中,我的代码做了 try catch finally, 报错了还会往下执行吗? 3:JavaWeb系统中&#xff0c…

软考高频考点--《项目采购管理》

现在离2023年上半年软考还有一个多月的时间,相信各位小伙伴们已经进入紧张的备考状态了。 小编今天为大家整理了软考的一些高频考点–《项目采购管理》,希望对正在备考软考的你有所帮助! 采购是从项目团队外部获得产品、服务或成果的完整的购…

alsa_lib移植到IMX6ULL

简介 ALSA是Advanced Linux Sound Architecture的缩写,目前已经成为了linux下的主流音频体系架构,提供了音频和MIDI的支持。 交叉编译alsa_lib和alsa_utils 下载alsa_lib 在官网中下载AlsaProject 编译 先将文件解压,然后进入alsa_lib…

运筹说 第94期|论文速读之基于关键路径的置换流水车间调度问题

前几期的推送已经讲解了网络计划的基本知识、数学模型和相关算法,相信大家对网络计划已经有了充分的了解,这期小编将带大家一起来读一篇基于关键路径的置换流水车间调度问题的文章。 1.文章信息 题目:An efficient critical path based meth…

手把手教你分析解决MySQL死锁问题

在生产环境中出现MySQL死锁问题该如何排查和解决呢,本文将模拟真实死锁场景进行排查,最后总结下实际开发中如何尽量避免死锁发生。 一、准备好相关数据和环境 当前自己的数据版本是8.0.22 mysql> select version; ----------- | version | --------…

Arduino 多任务软件定时器:Simpletimer库的使用

Arduino 多任务软件定时器:Simpletimer库的使用 📌Simpletimer库Arduino官方介绍信息:https://playground.arduino.cc/Code/SimpleTimer/✨该库也是利用了millis()函数来实现任务轮询的。与之类似的还有ESP8266固件自带的Ticker库,但是Ticker库使用仅限于ESP8266内调用,Si…

Discourse Google Analytics 3 的升级提示

根据 Google 官方的消息: Google Analytics(分析)4 是我们的新一代效果衡量解决方案,即将取代 Universal Analytics。自 2023 年 7 月 1 日起,标准 Universal Analytics 媒体资源将停止处理新的命中数据。如果您仍在使…

linux-01-基础回顾

文章目录 Linux-Day01课程内容1. 前言1.1 什么是Linux1.2 为什么要学Linux1.3 学完Linux能干什么 2. Linux简介2.1 主流操作系统2.2 Linux发展历史2.3 Linux系统版本 3. Linux安装3.1 安装方式介绍3.2 安装VMware3.3 安装Linux TODO3.4 网卡设置3.5 安装SSH连接工具3.5.1 SSH连…