如何学习、上手点云算法(三):用VsCode、Visual Studio来debug基于PCL、Open3D的代码
写在前面
-
本文内容
以PCL 1.14.0,Open3D0.14.1为例,对基于PCL、Open3D开发的代码进行源码debug;
如何学习、上手点云算法系列:
如何学习、上手点云算法(一):点云基础
如何学习、上手点云算法(二):点云处理相关开源算法库、软件、工具
如何学习、上手点云算法(三):用VsCode、Visual Studio来debug基于PCL、Open3D的代码
更多点云基础、算法相关内容请关注专栏:
点云处理基础
点云配准(PointCloud Registration)
Open3D点云处理
PCL点云处理
点云算法 -
平台/环境
Windows10, CMake, Open3D, PCL -
转载请注明出处:
https://blog.csdn.net/qq_41102371/article/details/136504094
目录
- 写在前面
- PCL
- 准备
- 编译debug版本
- 配置launch.json
- Visual Studio
- Open3D
- 准备
- 添加open3d测试
- 调试
- 参考
- 完
PCL
准备
安装PCL1.14.0: PCL1.14.0安装、使用教程
VsCode配置PCL: VsCode配置PCL、Open3D自动补全
在此基础上,下载debug需要的pdb文件:https://github.com/PointCloudLibrary/pcl/releases

打开压缩包

将pdb文件复制到之前装PCL的bin路径下,我这里是
D:\carlos\install\PCL 1.14.0\bin

注:PDB文件的作用见vs2019配置opencv+contrib-440 + PCL1.10.0 + 源码单步调试
编译debug版本
在VsCode配置PCL、Open3D自动补全和的基础上,新建一个compile_debug.bat:
cmake -DCMAKE_BUILD_TYPE=Debug ^
-DPCL_DIR="D:/carlos/install/PCL 1.14.0/cmake" ^
-S ./ -B ./build_debugcmake --build ./build_debug --config Debug --target ALL_BUILD

然后使用compile_debug.bat进行编译,完了会自动生成build_debug

配置launch.json
创建launch

添加配置

修改配置
"program"就是我们debug的程序对象,"environment"就是为当前程序添加PCL的环境变量,让其能找到PCL、VTK、FLANN等的动态库(.dll)
示例:
{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [{"name": "(Windows) Launch","type": "cppvsdbg","request": "launch","program": "${workspaceFolder}/build_debug/Debug/statistical_removal.exe","args": [],"stopAtEntry": false,"cwd": "${fileDirname}","environment": [{"name": "PATH","value": "D:/carlos/install/PCL 1.14.0/bin;D:/carlos/install/PCL 1.14.0/3rdParty/FLANN/bin;D:/carlos/install/PCL 1.14.0/3rdParty/VTK/bin;D:/carlos/install/PCL 1.14.0/3rdParty/Qhull/bin;D:/carlos/install/PCL 1.14.0/3rdParty/OpenNI2/Tools;$(PATH)"}],"console": "externalTerminal"}]
}

在statistical_removal.cpp中随便加一个断点,然后使用F5或者右上角的Debug C/C++ File, 开始debug

然后就可以看到程序运行到了断点处,左侧有变量状态,自己添加监控,线程的显示

Visual Studio
打开文件夹,找到.sln文件双击打开

鼠标右键,将statistical_removal设置为启动项目

再点开最下面的属性,Debug–调试–环境–编辑,输入
PATH=;D:\carlos\install\PCL 1.14.0\bin;
D:\carlos\install\PCL 1.14.0\3rdParty\FLANN\bin;
D:\carlos\install\PCL 1.14.0\3rdParty\VTK\bin;
D:\carlos\install\PCL 1.14.0\3rdParty\Qhull\bin;
D:\carlos\install\PCL 1.14.0\3rdParty\OpenNI2\Tools;
$(PATH)

确定


Open3D
准备
Open3D没有像PCL提供Debug版的lib和对应的pdb文件,需要自己编译,在Open3D0.14.1编译、安装、demo使用教程中我们已经编译好了debug版本,现在需要去build_debug/lib/Debug中找到pdb文件
然后将pdb文件复制到install的目录中

添加open3d测试
在上面PCL示例project中,我们添加一个open3d的测试,在编译脚本中添加open3d的debug版的路径

compile_debug.bat:
cmake -DCMAKE_BUILD_TYPE=Debug ^
-DPCL_DIR="D:/carlos/install/PCL 1.14.0/cmake" ^
-DOpen3D_DIR="D:/carlos/install/open3d141_d/CMake" ^
-S ./ -B ./build_debugcmake --build ./build_debug --config Debug --target ALL_BUILD
添加一个测试代码test_open3d.cpp,该代码作用是平面拟合,并把拟合出的平面与剩下点云用不同颜色显示
#include <open3d/Open3D.h>int main()
{std::shared_ptr<open3d::geometry::PointCloud> pcd(new open3d::geometry::PointCloud);open3d::io::ReadPointCloud("./table_scene_lms400.pcd", *pcd);pcd->SegmentPlane();pcd->PaintUniformColor({1, 0, 0});open3d::visualization::DrawGeometries({pcd});return 0;
}
修改CMakeLists.txt
cmake_minimum_required(VERSION 3.18)project(statistical_removal)# PCL
find_package(PCL 1.2 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
# PCL test
add_executable(statistical_removal statistical_removal.cpp)
target_link_libraries(statistical_removal ${PCL_LIBRARIES})# Open3D
option(STATIC_WINDOWS_RUNTIME "Use static (MT/MTd) Windows runtime" ON)
if(STATIC_WINDOWS_RUNTIME)set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
else()set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
endif()
find_package(Open3D REQUIRED)
include_directories(${Open3D_INCLUDE_DIRS})# Open3D test
add_executable(test_open3d test_open3d.cpp)
target_link_libraries(test_open3d ${Open3D_LIBRARIES})
然后使用compile_debug.bat进行编译
调试
修改launch.json
{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [{"name": "(Windows) Launch","type": "cppvsdbg","request": "launch",// "program": "${workspaceFolder}/build_debug/Debug/statistical_removal.exe","program": "${workspaceFolder}/build_debug/Debug/test_open3d.exe","args": [],"stopAtEntry": false,"cwd": "${fileDirname}","environment": [{"name": "PATH","value": "D:/carlos/install/PCL 1.14.0/bin;D:/carlos/install/PCL 1.14.0/3rdParty/FLANN/bin;D:/carlos/install/PCL 1.14.0/3rdParty/VTK/bin;D:/carlos/install/PCL 1.14.0/3rdParty/Qhull/bin;D:/carlos/install/PCL 1.14.0/3rdParty/OpenNI2/Tools;$(PATH)"}],"console": "externalTerminal"}]
}
在源码添加断点,开始调试

平面分割结果可视化

用Visual Studio debug参照上面PCL示例,打开.sln,设置启动项

但是Open3D是静态库,所以不用设置环境变量就可以了,另外用Visual Studio调试前把代码中点云读取路径改成绝对路径再重新编译一下,不然会找不到点云

参考
https://code.visualstudio.com/docs/cpp/launch-json-reference
其余文中已列出
完
主要做激光/影像三维重建,配准、分割等常用点云算法,熟悉open3d、pcl等开源点云库,技术交流、咨询可私信
相关文章:
如何学习、上手点云算法(三):用VsCode、Visual Studio来debug基于PCL、Open3D的代码
写在前面 本文内容 以PCL 1.14.0,Open3D0.14.1为例,对基于PCL、Open3D开发的代码进行源码debug; 如何学习、上手点云算法系列: 如何学习、上手点云算法(一):点云基础 如何学习、上手点云算法(二):点云处理相…...
【干货】alzet渗透泵操作说明
alzet渗透泵是一款小型、可植入式的胶囊渗透泵产品,此产品由于其独特的渗透原理,深受广大科研人员的喜爱。该泵可适用于小鼠、大鼠及其他实验动物的研究,并且alzet渗透泵可减轻科研人员夜间及周末给药的困扰。alzet渗透泵无需外部连接或频繁处…...
CVPR 2022 Oral | Bailando: 基于编舞记忆和Actor-Critic GPT的3D舞蹈生成
目录 测试结果: 02 提出的方法 测试结果: 预测有3个步骤,速度比较慢 02 提出的方法 1. 针对舞蹈序列的VQ-VAE和编舞记忆 与之前的方法不同,我们不学习从音频特征到 3D 关键点序列的连续域的直接映射。相反,我们先让…...
解读电影级视频生成模型 MovieFactory
Diffusion Models视频生成-博客汇总 前言:MovieFactory是第一个全自动电影生成模型,可以根据用户输入的文本信息自动扩写剧本,并生成电影级视频。其中针对预训练的图像生成模型与视频模型之间的gap提出了微调方法非常值得借鉴。这篇博客详细解读一下这篇论文《MovieFactory:…...
【Python从入门到进阶】50、当当网Scrapy项目实战(三)
接上篇《49、当当网Scrapy项目实战(二)》 上一篇我们讲解了的Spider与item之间的关系,以及如何使用item,以及使用pipelines管道进行数据下载的操作,本篇我们来讲解Scrapy的多页面下载如何实现。 一、多页面下载原理分…...
【调试记录】vscode远程连接问题汇总
1. kex_exchange_identification kex_exchange_identification: read: Connection reset by xxx.xx.xx.x 一直连不上实验室的服务器,用PUTTY和Mobaxterm也不行(报错:Remote side unexpectedly closed network connection)。已知…...
基于springboot的疾病防控综合系统
采用技术 基于springboot的疾病防控综合系统的设计与实现~ 开发语言:Java 数据库:MySQL 技术:SpringBootMyBatis 工具:IDEA/Ecilpse、Navicat、Maven 系统效果展示 用户功能效果 打卡管理 接种记录查看 公告信息查看 社区…...
js实现文本内容过长中间显示...两端正常展示
实现效果 实现思路 获取标题盒子的真实宽度, 我这里用的是clientWidth;获取文本内容所占的实际宽度;根据文字的大小计算出每个文字所占的宽度;判断文本内容的实际宽度是否超出了标题盒子的宽度;通过文字所占的宽度累加之和与标题…...
Buran勒索病毒通过Microsoft Excel Web查询文件进行传播
Buran勒索病毒首次出现在2019年5月,是一款新型的基于RaaS模式进行传播的新型勒索病毒,在一个著名的俄罗斯论坛中进行销售,与其他基于RaaS勒索病毒(如GandCrab)获得30%-40%的收入不同,Buran勒索病毒的作者仅占感染产生的25%的收入,…...
中间件 | Redis - [基本信息]
INDEX 1 常规用法2 QPS3 pipeline 1 常规用法 分布式锁 最常见用法,需要注意分布式锁的redis需要单点 分布式事务 分布式事务中,核心的技术难点其实是分布式事务这个事本身作为数据的持久化 2PC,比如 seata 的 AT 模式下,将 un…...
【Docker】Neo4j 容器化部署
Neo4j环境标准软件基于Bitnami neo4j 构建。当前版本为5.17.0 你可以通过轻云UC部署工具直接安装部署,也可以手动按如下文档操作,该项目已经全面开源,可以从如下环境获取 配置文件地址: https://gitee.com/qingplus/qingcloud-platform Qin…...
Visual studio编译器报1个无法解析的外部命令
解决思路:(以下思路需对照代码进行逐点分析) ①:代码里函数有声明,但是没有定义 (初学者错这个比较多) ②:类中有静态变量成员,没有对它进行初始化(是变量&…...
微信小程序(五十三)修改用户头像与昵称
注释很详细,直接上代码 上一篇 新增内容: 1.外界面个人资料基本模块 2.资料修改界面同步问题实现(细节挺多,考虑了后期转服务器端的方便之处) 源码: app.json {"window": {},"usingCompone…...
VUE3 显示Echarts百度地图
本次实现最终效果 技术基础以及环境要求 vue3 echarts 百度地图API 要求1: VUE3 环境搭建:https://blog.csdn.net/LQ_001/article/details/136293795 要求2: VUE3 echatrs 环境搭建:https://blog.csdn.net/LQ_001/article/details/1363…...
FFmpeg将视频包AVPacket通过视频流方式写入本地文件
1.写视频头 void writeVideoHeader(const char* videoFileName){int r avformat_alloc_output_context2(&pFormatCtx, nullptr, nullptr,videoFileName);if(r < 0){qDebug()<<"Error: avformat_alloc_output_context2: "<<av_err2str(r);return;…...
C语言连接【MySQL】
稍等更新图片。。。。 文章目录 安装 MySQL 库连接 MySQLMYSQL 类创建 MySQL 对象连接数据库关闭数据库连接示例 发送命令设置编码格式插入、删除或修改记录查询记录示例 参考资料 安装 MySQL 库 在 CentOS7 下,使用命令安装 MySQL: yum install mysq…...
_note_09
1.说一说类加载的过程 加载(Loading) -> 验证(Verification) -> 准备(Preparation) -> 解析(Resolution) -> 初始化(Initialization)类的加载是…...
是否可以在HTTP中缓存POST方法
如果您想知道是否可以缓存post请求,并尝试研究该问题的答案,那么您很可能不会成功。当搜索“缓存post请求”时,第一个结果是这个StackOverflow问题。 答案是令人困惑的,包括缓存应该如何工作,缓存如何根据RFC工作&…...
Xilinx 7系列FPGA配置(ug470)
Xilinx 7系列FPGA配置(ug470) 配置模式串行配置模式接口从-连接方式主-连接方式串行菊花链(非同时配置)串行配置(同时配置)时序 主SPI配置模式SPIx1/x2 连接图SPIx1模式时序SPIx4 连接图SPI操作指令操作fla…...
3分钟开通GPT-4
AI从前年12月份到现在已经伴随我们一年多了,还有很多小伙伴不会开通,其实开通很简单,环境需要自己搞定,升级的话就需要一张visa卡,办理visa卡就可以直接升级chatgptPLSU 一、虚拟卡支付 这种方式的优点是操作简单&…...
技术判断力之AI三问峭
认识Pass层级结构 Pass范围从上到下一共分为5个层级: 模块层级:单个.ll或.bc文件 调用图层级:函数调用的关系。 函数层级:单个函数。 基本块层级:单个代码块。例如C语言中{}括起来的最小代码。 指令层级:单…...
彻底告别OpenClaw使用焦虑:我给他装上了“透视眼”和“批量克隆模组凡
指令替换 项目需求:将加法指令替换为减法 项目目录如下 /MyProject ├── CMakeLists.txt # CMake 配置文件 ├── build/ #构建目录 │ └── test.c #测试编译代码 └── mypass2.cpp # pass 项目代码 一,测试代码示例 test.c // test.c #includ…...
PingCraft:从需求文档到可追踪工作项的 Agent 实践之路段
整体排查思路 我们的目标是验证以下三个环节是否正常: 登录成功时:服务器是否正确生成了Session并返回了包含正确 JSESSIONID的Cookie给浏览器。 浏览器端:浏览器是否成功接收并存储了该Cookie。 后续请求:浏览器在执行查询等操作…...
怎么查询MongoDB中数组长度大于N的文档_基于索引的额外长度字段方案
MongoDB中用$expr$size查数组长度大于N的文档虽原生支持,但无法走索引,适合中小集合或配合其他可索引条件使用;而维护tags_length字段并建索引可实现高效范围查询,前提是严格保证写时一致性。用 $expr $size 直接查数组长度大于 …...
浅谈MIKE前处理中投影坐标处理问题
MIKE 中投影坐标一直是个问题,尤其对 2d 里的科氏力影响很大, 由于我们现获取基础资料都是 CAD 格式,在 GIS 里转 shp 后我们会发现很多是地方坐标,对于这种情况,小编也是无能无力,只有想办法 让 CAD 提供方…...
Marimo 远程命令执行漏洞复现(CVE-2026-39987)
免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 前…...
基于AI大模型的电动三轮车短视频生成与售后智能体系统——架构设计与代码实现
基于AI大模型的电动三轮车短视频生成与售后智能体系统——架构设计与代码实现 摘要 随着短视频营销和智能客服在企业数字化运营中的重要性日益凸显,基于AI大模型的智能体系统为企业提供了高效的自动化解决方案。本文设计并实现了两大智能体系统:电动三轮车短视频生成智能体…...
如何用番茄小说下载器构建个人数字图书馆:5步快速入门指南
如何用番茄小说下载器构建个人数字图书馆:5步快速入门指南 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 在网络小说阅读日益流行的今天,你是否遇到过这样的困扰&a…...
Unity新手必看:如何用Input系统实现FPS游戏的键盘鼠标控制(附完整代码)
Unity FPS游戏开发实战:Input系统高级控制与优化技巧 第一次在Unity中尝试制作FPS游戏时,我花了两天时间才让角色不再像喝醉酒一样摇晃行走。键盘和鼠标输入的微妙配合、视角旋转的平滑处理、不同设备间的控制切换——这些看似基础的功能背后藏着许多新手…...
西门子S7-200SMART与三菱变频器通讯程序:Modbus RTU协议下的高效控制解决方案
西门子S7-200SMART与三菱变频器通讯程序,实际效果如视频所示,认准店名未来电气,支持。 只是程序,不发快递物流,采用modbus rtu协议。 型号:plc西门子200smart,威纶通MT8071IE,变频器FR-E700(FR-…...
