我在进行点云SAC初始匹配时,出现了点云色彩丢失的问题。如下图所示:
我用了两种方法:一种是直接对PointXYZRGB格式的点云进行SAC配准,得到配准后的图像。另一种是以PointXYZ格式载入点云进行配置,根据得到旋转矩阵对PointXYZRGB格式点云进行旋转,两种方式都会出现上述现象。打开对应的pcd文件,可以看到:
彩色缺失的部分全部变为了:nan.
从PCL 1.0.1版本开始,用字符串“nan”表示NaN,此字符表示该点的值不存在或非法等。
我不知道哪里出了问题,有知道的请告诉我。
我的解决办法是重新给点云配色。程序如下:
#include <iostream>
#include <vector>
#include <Eigen/Core>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
using namespace std;
typedef pcl::PointXYZ PointT;
typedef pcl::PointCloud<pcl::PointXYZ> pointcloud;
typedef pcl::PointCloud<pcl::PointXYZRGB> pointcloudColor;
int main(int argc, char ** argv)
{
pointcloud::Ptr src1 (new pointcloud);
pointcloudColor::Ptr src2 (new pointcloudColor);
pointcloudColor::Ptr tgt (new pointcloudColor);
pcl::io::loadPCDFile<pcl::PointXYZ>(argv[1],*src1);
pcl::io::loadPCDFile<pcl::PointXYZRGB>(argv[2],*src2);
pointcloud Final1 = *src1;
pointcloudColor Final2 = *src2;
cout<<"1:"<<Final1.points.size()<<"/n"<<"2:"<<Final2.points.size();
for(int i=0;i< Final1.points.size();i++)
{
pcl::PointXYZRGB basic_point;
//pcl::PointXYZ basic_point;
basic_point.x = Final1.points[i].x;
basic_point.y = Final1.points[i].y;
basic_point.z = Final1.points[i].z;
basic_point.rgb = Final2.points[i].rgb;
tgt->points.push_back(basic_point);
}
tgt->width = 1;
tgt->height = tgt->points.size();
pcl::io::savePCDFile ("color.pcd", *tgt);
}
思路如下:
设源点云为彩色点云src2,sac配准旋转后对应点云为src1.根据src2中对应位置的色彩,对src1重新上色。
效果如下:
ps:由于历史原因(PCL源于ROS包),RGB信息被打包成一个整数并被转换为浮点数。更具体的可以参考:http://docs.pointclouds.org/1.7.0/structpcl_1_1_point_x_y_z_r_g_b.html