通过提取Z坐标,最大、最小值,进而进行渐变色的处理。
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/common/common.h>
#include <pcl/visualization/cloud_viewer.h>
using namespace std;
int main()
{
pcl::PointCloud<pcl::PointXYZ>::Ptr basic_cloud_ptr(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr(new pcl::PointCloud<pcl::PointXYZRGB>);
if (pcl::io::loadPCDFile("00003.pcd", *basic_cloud_ptr) < 0)
{
PCL_ERROR("Couldn't read file 00003.pcd\n");
return(-1);
}//加载点云数据。
std::cout << "basic_point_ptr大小为:" << basic_cloud_ptr->size() << endl;
for (int i = 0; i < basic_cloud_ptr->points.size(); i++)
{
pcl::PointXYZRGB point;
point.x = basic_cloud_ptr->points[i].x;
point.y = basic_cloud_ptr->points[i].y;
point.z = basic_cloud_ptr->points[i].z;
point.r = 0;
point.g = 0;
point.b = 0;
point_cloud_ptr->points.push_back(point);
}
std::cout << "point_cloud_ptr大小为:" << point_cloud_ptr->size() << endl;
void render(pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr);
{
pcl::PointXYZRGB min, max;
pcl::getMinMax3D(*point_cloud_ptr, min, max);
std::cout << "Z轴最大值为:" << max.z << endl;
std::cout << "Z轴最小值为:" << min.z << endl;
//计算出Z轴的最大值,最小值。
float L;
float L_2;
L = max.z - min.z;
L_2 = L / 2.0;
for (size_t i = 0; i < point_cloud_ptr->size(); ++i)//这里先用i的初始值+1,在循环。
{
if ((point_cloud_ptr->points[i].z - min.z) < L_2)
{
point_cloud_ptr->points[i].r = 0;
point_cloud_ptr->points[i].g = (255 * ((point_cloud_ptr->points[i].z - min.z) / L_2));
point_cloud_ptr->points[i].b = (255 * (1 - ((point_cloud_ptr->points[i].z - min.z) / L_2)));//(0,0,225)开始
}
else
{
point_cloud_ptr->points[i].r = (255 * (point_cloud_ptr->points[i].z - min.z - L_2) / L_2);
point_cloud_ptr->points[i].g = (255 * (1 - (point_cloud_ptr->points[i].z - min.z - L_2) / L_2));
point_cloud_ptr->points[i].b = 0;
}//(cloud->points[i].z - min.z) = L_2时,为(0,225,0);当(cloud->points[i].z - min.z) = L时,为(225,0,0)
}
}
pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
viewer->setBackgroundColor(0, 0, 0);
viewer->addPointCloud<pcl::PointXYZRGB>(point_cloud_ptr);
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
std::this_thread::sleep_for(100ms);
}//可视化
return 0;
}
结果如下图显示,同理也可以根据X、Y轴进行渐变色的处理。