open3d+opencv实现矩形框裁剪点云操作(C++)
👑主页:吾名招财
👓简介:工科学硕,研究方向机器视觉,爱好较广泛…
💫签名:面朝大海,春暖花开!
open3d+opencv实现矩形框裁剪点云操作(C++)
- 1,引言
- 2,相关测试数据资源如下
- 3,彩色图、深度图和相机内参
- 4,C++代码
- 5,最终效果
1,引言
针对彩色图和深度图以及相机内参可以合成点云,而对某一区域的点云数据截取,可以通过二维ROI区域截取深度图及彩色图出来。不过不能整张图像裁剪,其图像大小不能变,把除了截取区域外的给置为0就行了。
2,相关测试数据资源如下
本人上传了一个用于三维重建测试的公开数据集,内含彩色图、深度图、相机内参、相机位姿等相关数据,可用于相关测试
https://download.csdn.net/download/qq_44870829/90236553

3,彩色图、深度图和相机内参


4,C++代码
#include <string>
#include <iostream>
#include "Open3D/Open3D.h"
#include <opencv2/opencv.hpp>using namespace std;open3d::geometry::Image o3d_cv(const cv::Mat& A) {open3d::geometry::Image B;int bytes_per_channel = (A.depth() / 2 + 1);//refer to the fuction depthB.Prepare(A.cols, A.rows, A.channels(), bytes_per_channel);std::memcpy(B.data_.data(), A.data, A.total() * A.channels() * bytes_per_channel);return B;
}int main(int argc, char* argv[]) {//--------------------------------------1,相关参数----------------------------------//要截取的ROI区域大小int x = 285;int y = 363;int w = 150;int h = 120;//相机内参设置int width = 640; // 输入图像的宽度int height = 480; // 输入图像的高度double fx = 585; // x轴焦距 double fy = 585; // y轴焦距double cx = 320; // 相机原点的x坐标double cy = 240; // 相机原点的y坐标// 方式一auto intrinsic = open3d::camera::PinholeCameraIntrinsic(width, height, fx, fy, cx, cy); // 使用自定义内参方式二open3d::camera::PinholeCameraIntrinsic intrinsic = open3d::camera::PinholeCameraIntrinsic();intrinsic.SetIntrinsics(width, height, fx, fy, cx, cy);//open3d::camera::PinholeCameraIntrinsic intrinsic = open3d::camera::PinholeCameraIntrinsic(// open3d::camera::PinholeCameraIntrinsicParameters::PrimeSenseDefault); // 使用默认内参// -RGBD图像参数设置double depth_scale = 1000.0; // 深度值的缩放倍数double depth_trunc = 3.0; // 深度值的截断系数bool convert_rgb_to_intensity = false; // 是否将彩色图转为强度图//-------------------------------------2,读取图像并裁剪-------------------------------------//用opencv读取二维彩色图及深度图像,将某一ROI区域裁剪出来,然后再进行点云生成cv::Mat colorimg = cv::imread("frame-000276.color.jpg");cv::Mat depthimg = cv::imread("frame-000276.depth.png", -1); //深度图要读取原图//制作ROI区域掩膜cv::Mat templateImg_color = cv::Mat::zeros(colorimg.size(), colorimg.type());cv::Mat mask = cv::Mat::zeros(colorimg.size(), colorimg.type());cv::rectangle(mask, cv::Point(x, y), cv::Point(x + w, y + h), cv::Scalar(255, 255, 255), -1);//矩形的两个顶点,两个顶点都包括在矩形内部colorimg.copyTo(templateImg_color, mask);cv::Mat templateImg_depth = cv::Mat::zeros(depthimg.size(), depthimg.type());cv::Mat mask2 = cv::Mat::zeros(depthimg.size(), CV_8UC1);cv::rectangle(mask2, cv::Point(x, y), cv::Point(x + w, y + h), cv::Scalar(255, 255, 255), -1);//矩形的两个顶点,两个顶点都包括在矩形内部//cv::bitwise_and();depthimg.copyTo(templateImg_depth, mask2);//-------------------------------------3,显示未裁剪前的原始点云-------------------------------------open3d::geometry::Image color_o = o3d_cv(colorimg);open3d::geometry::Image depth_o = o3d_cv(depthimg);// 生成RGBD图像std::shared_ptr<open3d::geometry::RGBDImage> rgbd_image_o = open3d::geometry::RGBDImage::CreateFromColorAndDepth(color_o, // 输入的彩色图像depth_o, // 输入的深度图像depth_scale, // 深度值的缩放倍数depth_trunc, // 深度值大于该值将被截断为0convert_rgb_to_intensity);// 设置是否将彩色图像转为强度图// RGBD转点云auto pcd_o = open3d::geometry::PointCloud::CreateFromRGBDImage(*rgbd_image_o, intrinsic);open3d::visualization::DrawGeometries({ pcd_o });//-------------------------------------4,显示并保存裁剪后的点云-------------------------------------open3d::geometry::Image color = o3d_cv(templateImg_color);open3d::geometry::Image depth = o3d_cv(templateImg_depth);直接使用open3d读取图像//open3d::geometry::Image color, depth;//open3d::io::ReadImage("0.png", color); // 读取彩色图像//open3d::io::ReadImage("0_depth.png", depth); // 读取深度图像//将裁剪后的深度图及彩色图转换成点云并显示保存//输出图像基本信息open3d::utility::LogInfo("Reading RGBD image : ");open3d::utility::LogInfo(" Color : {:d} x {:d} x {:d} ({:d} bits per channel)",color.width_, color.height_, color.num_of_channels_,color.bytes_per_channel_ * 8);open3d::utility::LogInfo("Depth : {:d} x {:d} x {:d} ({:d} bits per channel)",depth.width_, depth.height_, depth.num_of_channels_,depth.bytes_per_channel_ * 8);// 生成RGBD图像std::shared_ptr<open3d::geometry::RGBDImage> rgbd_image = open3d::geometry::RGBDImage::CreateFromColorAndDepth(color, // 输入的彩色图像depth, // 输入的深度图像depth_scale, // 深度值的缩放倍数depth_trunc, // 深度值大于该值将被截断为0convert_rgb_to_intensity);// 设置是否将彩色图像转为强度图// RGBD转点云auto pcd = open3d::geometry::PointCloud::CreateFromRGBDImage(*rgbd_image, intrinsic);open3d::visualization::DrawGeometries({ pcd });//5.保存点云文件 保存open3d::io::WritePointCloudToPCD("moban.pcd", *pcd, false);//open3d::io::WritePointCloudToPCD("search.pcd", *pcd, false);return 0;
}
5,最终效果
未裁剪前的点云

裁剪后的点云

相关文章:
open3d+opencv实现矩形框裁剪点云操作(C++)
👑主页:吾名招财 👓简介:工科学硕,研究方向机器视觉,爱好较广泛… 💫签名:面朝大海,春暖花开! open3dopencv实现矩形框裁剪点云操作(Cÿ…...
git 本地操作
一、git.vscode 撤回本地提交 要在Git中撤销本地的最后一次提交,可以使用以下命令: git reset --soft HEAD^ 这将会撤销最后一次的提交,但是保留工作区以及暂存区的内容,方便重新提交。 如果你想完全撤销最后一次提交…...
PL/SQL语言的文件操作
PL/SQL语言的文件操作 PL/SQL(Procedural Language/SQL)是Oracle公司开发的一种过程化扩展SQL的语言,广泛应用于Oracle数据库的开发和管理。PL/SQL不仅支持SQL指令,还支持过程化编程,例如条件控制、循环控制、异常处理…...
linux lsof 和 fuser命令介绍
lsof 和 fuser 是两个在 Linux 系统中用于查看文件占用情况的重要工具。它们都可以用于查看哪些进程正在使用某些文件、设备或端口。下面是这两个命令的介绍、举例和背景。 lsof (List Open Files) 命令介绍: lsof 命令用于列出当前系统中所有打开的文件以及与之相关的进程。它…...
[Python学习日记-76] 网络编程中的 socket 开发 —— 介绍、工作流程、socket 模块用法和函数介绍
[Python学习日记-76] 网络编程中的 socket 开发 —— 介绍、工作流程、socket 模块用法和函数介绍 简介 socket 介绍 socket 的工作流程及用法 简介 前面在[Python学习日记-75] 计算机基础与网络当中介绍了一大堆基础知识之后我们终于开始进入到网络编程的开发阶段了&#x…...
vue(七) vue进阶
目录 第一课:Vue方法、计算机属性及侦听器 一、数组变化侦测 方法1:变更方法 方法2:替换一个数组 例子:小Demo:合并两个数组 二、计算属性 1.基础(不推荐) 2.使用计算属性来完成案例 3.使用函数的方…...
[Transformer] The Structure of GPT, Generative Pretrained Transformer
The Structure of Generative Pretrained Transformer Reference: The Transformer architecture of GPT models How GPT Models Work...
Django Admin 自定义操作封装
1. 为什么需要封装? 在Django开发中,我们经常需要在Admin界面添加自定义操作按钮,以便管理员执行特定的任务。通过封装,我们可以: 减少重复代码统一管理自定义操作的逻辑提高代码的可维护性和可扩展性 © ivwdcwso (ID: u012172506)2. CustomActionMixin 的实现 让我…...
http和https有哪些不同
http和https有哪些不同 1.数据传输的安全性:http非加密,https加密 2.端口号:http默认80端口,https默认443端口 3.性能:http基于tcp三次握手建立连接,https在tcp三次握手后还有TLS协议的四次握手确认加密…...
PL/SQL语言的数据库交互
PL/SQL语言的数据库交互 引言 在当今的信息化时代,数据库管理系统(DBMS)在各行各业中扮演着至关重要的角色。为了高效地与数据库进行交互,许多程序员、数据库管理员和系统分析师选择使用PL/SQL(Procedural Language/…...
亿道三防丨三防笔记本是什么意思?和普通笔记本的优势在哪里?
三防笔记本是什么意思?和普通笔记本的优势在哪里? 在现代社会中,笔记本电脑已经成为人们工作和生活中不可或缺的一部分。然而,在一些特殊行业或环境中,普通笔记本电脑由于其脆弱性和对环境条件的敏感性,往…...
从项目代码看 React:State 和 Props 的区别及应用场景实例讲解
在 React 中,state 和 props 是组件的两个重要概念,它们有不同的作用和应用场景。理解它们之间的区别对于开发 React 应用至关重要。 1. state 和 props 的区别 props (属性): props 是由父组件传递给子组件的数据或函数。props 是只读的&am…...
Vue 学习之旅:核心技术学习总结与实战案例分享(vue指令下+计算属性+侦听器)
Vue 学习之旅:核心技术学习总结与实战案例分享 文章目录 Vue 学习之旅:核心技术学习总结与实战案例分享一、指令补充(一)指令修饰符(二)v-bind 对样式操作的增强(三)v-model 应用于其…...
freertos的基础(二)内存管理:堆和栈
1. 堆(Heap) 定义 堆是 FreeRTOS 中用于动态内存分配的内存区域。FreeRTOS 提供了多种堆管理方案(如 heap_1、heap_2、heap_4 等),开发者可以根据需求选择合适的内存管理策略。 作用 用于动态分配内存,例…...
vue \n 换行不不显示
Vue 中,直接使用包含 \n 的字符串进行渲染时,换行符不会被识别为 HTML 的换行,因为 Vue 默认会将其视为普通文本。 对此提供两种解决办法 方法一:使用 v-html 指令替换 \n 为 <br> <template><div v-html"…...
GPT 系列论文精读:从 GPT-1 到 GPT-4
学习 & 参考资料 前置文章 Transformer 论文精读 机器学习 —— 李宏毅老师的 B 站搬运视频 自监督式学习(四) - GPT的野望[DLHLP 2020] 來自猎人暗黑大陆的模型 GPT-3 论文逐段精读 —— 沐神的论文精读合集 GPT,GPT-2,GPT-3 论文精读【论文精读】…...
在 Ubuntu 上安装和配置 Redis
在 Ubuntu 上安装和配置 Redis,并使用发布-订阅(Pub/Sub)功能,可以按照以下步骤进行: 一、安装 Redis 1. 更新包列表 首先,更新本地的包列表以确保获取到最新的软件包信息: sudo apt update…...
Excel中双引号问题
背景: 从Excel中读取数据时,发现有的单元格读出来是一个双引号,有的是一个双引号 "{""accountName"": ""全字段"",""accountState"": ""NORMAL"",&q…...
【机器学习】主动学习-增加标签的操作方法-流式选择性采样(Stream-based selective sampling)
Stream-Based Selective Sampling Stream-based selective sampling 是一种主动学习方法,在处理大量数据流时特别有用。它允许学习算法动态选择是否对当前数据实例进行标注(通过与 Oracle 交互)。此方法主要应用于流数据场景中,目…...
elementUI项目中,只弹一个【token过期提示】信息框的处理
关键代码 let msgArr document.querySelectorAll(.token401Message)if (!msgArr.length) {Message({customClass: token401Message,message: response.data.msg,type: error,onClose: () > {msgArr []}})} 完整代码 import axios from axios import { getToken } from…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
