PointXYZRGB点云和meshcolor网格互相转化

news/2025/1/8 20:42:21/

PointXYZRGB转meshcolor

参考:如何使用PCL将XYZRGB点云转换为彩色mesh模型

#include <iostream>
#include <string>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/features/normal_3d_omp.h>
#include <pcl/features/normal_3d.h>
#include <pcl/surface/gp3.h>
#include <pcl/surface/poisson.h>
#include <pcl/visualization/pcl_visualizer.h>void PointXYZRGB2meshcolor(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud)
{pcl::NormalEstimationOMP<pcl::PointXYZRGB, pcl::Normal> ne;ne.setNumberOfThreads(8);ne.setInputCloud(cloud);ne.setKSearch(10);Eigen::Vector4f centroid;compute3DCentroid(*cloud, centroid);ne.setViewPoint(centroid[0], centroid[1], centroid[2]);//将向量计算原点置于点云中心pcl::PointCloud<pcl::Normal>::Ptr cloud_normals(new pcl::PointCloud<pcl::Normal>);ne.compute(*cloud_normals);//将法向量反向for (size_t i = 0; i < cloud_normals->size(); ++i){cloud_normals->points[i].normal_x *= -1;cloud_normals->points[i].normal_y *= -1;cloud_normals->points[i].normal_z *= -1;}//融合RGB点云和法向pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr cloud_smoothed_normals(new pcl::PointCloud<pcl::PointXYZRGBNormal>);pcl::concatenateFields(*cloud, *cloud_normals, *cloud_smoothed_normals);//泊松重建pcl::Poisson<pcl::PointXYZRGBNormal> poisson;poisson.setDegree(2);poisson.setDepth(8);poisson.setSolverDivide(8);poisson.setIsoDivide(8);poisson.setConfidence(false);poisson.setManifold(false);poisson.setOutputPolygons(false);poisson.setInputCloud(cloud_smoothed_normals);pcl::PolygonMesh mesh;poisson.reconstruct(mesh);//给mesh染色pcl::PointCloud<pcl::PointXYZRGB> cloud_color_mesh;pcl::fromPCLPointCloud2(mesh.cloud, cloud_color_mesh);pcl::KdTreeFLANN<pcl::PointXYZRGB> kdtree;kdtree.setInputCloud(cloud); //使用kdtree在原RGB点云上建立一个搜索索引int K = 10;std::vector<int> pointIdxNKNSearch(K);std::vector<float> pointNKNSquaredDistance(K);for (int i = 0; i < cloud_color_mesh.points.size(); ++i){uint8_t r = 0, g = 0, b = 0;int sum_r = 0, sum_g = 0, sum_b = 0;float dist = 0.0;if (kdtree.nearestKSearch(cloud_color_mesh.points[i], K, pointIdxNKNSearch, pointNKNSquaredDistance) > 0) //对mesh上的每一个点都搜索对应原RGB点云上的临近点{	//求得这些对应临近点的RGB通道均值,作为mesh上那个点的颜色信息for (int j = 0; j < pointIdxNKNSearch.size(); ++j){r = cloud->points[pointIdxNKNSearch[j]].r;g = cloud->points[pointIdxNKNSearch[j]].g;b = cloud->points[pointIdxNKNSearch[j]].b;sum_r += int(r);sum_g += int(g);sum_b += int(b);dist += 1.0 / pointNKNSquaredDistance[j];}}cloud_color_mesh.points[i].r = int(sum_r / pointIdxNKNSearch.size() + 0.5);cloud_color_mesh.points[i].g = int(sum_g / pointIdxNKNSearch.size() + 0.5);cloud_color_mesh.points[i].b = int(sum_b / pointIdxNKNSearch.size() + 0.5);}pcl::toPCLPointCloud2(cloud_color_mesh, mesh.cloud);pcl::io::savePLYFile("mesh.ply", mesh);pcl::visualization::PCLVisualizer viewer("viewer");viewer.addPolygonMesh(mesh);while (!viewer.wasStopped()){viewer.spinOnce(100);}
}int main(int argc, char** argv)
{pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);pcl::io::loadPCDFile("bunny_color.pcd", *cloud);PointXYZRGB2meshcolor(cloud);return 0;
}

在这里插入图片描述

PointXYZRGB转meshcolor

#include <iostream>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/visualization/pcl_visualizer.h>void meshcolor2PointXYZRGB(pcl::PolygonMesh mesh)
{pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);pcl::fromPCLPointCloud2(mesh.cloud, *cloud);pcl::io::savePCDFile("bunny_cloud.pcd", *cloud);pcl::io::savePLYFile("bunny_cloud.ply", *cloud);std::ofstream outfile;outfile.open("bunny_cloud.txt");for (size_t i = 0; i < cloud->size(); i++){pcl::PointXYZRGB p = cloud->points[i];outfile << p.x << " " << p.y << " " << p.z << " " << (int)p.r << " " << (int)p.g << " " << (int)p.b << std::endl;}outfile.close();pcl::visualization::PCLVisualizer viewer("Viewer");viewer.addPointCloud(cloud, "cloud");while (!viewer.wasStopped()){viewer.spinOnce(100);}
}int main(int argc, char** argv)
{pcl::PolygonMesh mesh;pcl::io::loadPLYFile("mesh.ply", mesh);meshcolor2PointXYZRGB(mesh);return 0;
}

在这里插入图片描述


http://www.ppmy.cn/news/247186.html

相关文章

审计 Linux 系统的操作行为的 5 种方案对比

点击上方 "编程技术圈"关注, 星标或置顶一起成长 后台回复“大礼包”有惊喜礼包&#xff01; 每日英文 Sometimes our hearts just need time to accept what our heads already know. 有时候&#xff0c;虽然能想明白&#xff0c; 但心里就是接受不了。 每日掏心话 …

2021秋招学习笔记

PS&#xff1a;csdn上有很多图片加载不出来&#xff0c;有PDF版在我的资源。&#xff08;如果没有1积分可以评论我&#xff0c;直接发给你邮箱&#xff09; 文章目录 Java基础篇学习(7/3-7/4)数据类型泛型、反射、注解、序列化&#xff08;加实例&#xff09;1、reflect类方法…

使用Redis中间件解决商品秒杀活动中出现的超卖问题(使用Java多线程模拟高并发环境)...

一、引入Jedis依赖 可以新建Spring或Maven工程&#xff0c;在pom文件中引入Jedis依赖&#xff1a; <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version></dependency>复制代…

使用Redis中间件解决商品秒杀活动中出现的超卖问题(使用Java多线程模拟高并发环境)

说明&#xff1a;正文中对代码的解释性文字较少&#xff0c;因为代码中有详细的注释。 一、引入Jedis依赖 可以新建Spring或Maven工程&#xff0c;在pom文件中引入Jedis依赖&#xff1a; <dependency><groupId>redis.clients</groupId><artifactId>j…

(学习日记)2023.06.06

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

mysql究竟是否适合运行在docker容器中

目前&#xff0c;容器和 Docker 依旧是技术领域最热门的词语&#xff0c;无状态的服务容器化已经是大势所趋&#xff0c;同时也带来了一个热点问题被大家所争论不以&#xff1a;数据库 MySQL 是否需要容器化&#xff1f; 文章目录 认真分析大家的各种观点&#xff0c;发现赞同者…

Redis主从集群与哨兵集群

一、Redis 哨兵集群原理 Redis 哨兵集群是一种高可用性的解决方案&#xff0c;用于监控 Redis 实例的状态并在实例出现故障时自动进行故障转移。 Redis 哨兵集群由多个哨兵实例组成&#xff0c;每个哨兵实例都运行在独立的服务器上。每个哨兵实例都会周期性地向 Redis 实例发…