背景:
点云的形状大小不一,根据点云形状画出包纳点云底面的网格,可以更具体地观察点云。
正文:
c++ pcl 中点云画任意形状的网格的代码片段:
...
//画根据点云形状的网格
std::string id = "id";
int width = 90;
int height = 210;
//横线
for (int i = 0; i <= height; i += 10) {
viewer->addLine(pcl::PointXYZ(-width, i, 0), pcl::PointXYZ(width, i,0), std::to_string(i+200)+id, 0);
}
//纵线
for (int i = -width; i <= width; i += 10) {
viewer->addLine(pcl::PointXYZ(i, 0, 0), pcl::PointXYZ(i, height, 0), std::to_string(i), 0);
}
...
当点云中的点旋转时:
...
//画根据点云旋转的网格
std::string id = "id";
int width = 90;
int height = 210;
//横线
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_h(new pcl::PointCloud<pcl::PointXYZ>);
for (int i = 0; i <= height; i += 10) {
cloud_h->push_back(pcl::PointXYZ(-width, i, 0));
cloud_h->push_back(pcl::PointXYZ(width, i,0));
pcl::transformPointCloud (*cloud_h, *cloud_h, config_lidar.transform1);
viewer->addLine(cloud_h->at(0), cloud_h->at(1), std::to_string(i+200)+id, 0);
cloud_h->clear();
}
//纵线
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_l(new pcl::PointCloud<pcl::PointXYZ>);
for (int i = -width; i <= width; i += 10) {
cloud_l->push_back(pcl::PointXYZ(i, 0, 0));
cloud_l->push_back(pcl::PointXYZ(i, height, 0));
pcl::transformPointCloud (*cloud_l, *cloud_l, config_lidar.transform1);
viewer->addLine(cloud_l->at(0), cloud_l->at(1), std::to_string(i), 0);
cloud_l->clear();
}
...
线不能用 pcl::transformPointCloud 进行旋转,取巧把线的两个点放入 vector 中,当成小点云,用
pcl::transformPointCloud 旋转后,按顺序取出线的两个点进行连接。