8点矩形框绘制
根据输入的最小点和最大点依次构造立体框的8个顶点
// 计算立体框的8个点
void calculate3DBox_8points(pcl::PointXYZ min_point, pcl::PointXYZ max_point, pcl::PointCloud<pcl::PointXYZRGB>::Ptr &outCloud) {
pcl::PointXYZRGB pt1(min_point.x, min_point.y, min_point.z, 255., 0., 0.);
pcl::PointXYZRGB pt2(min_point.x, min_point.y, max_point.z, 255., 0., 0.);
pcl::PointXYZRGB pt3(max_point.x, min_point.y, max_point.z, 255., 0., 0.);
pcl::PointXYZRGB pt4(max_point.x, min_point.y, min_point.z, 255., 0., 0.);
pcl::PointXYZRGB pt5(min_point.x, max_point.y, min_point.z, 255., 0., 0.);
pcl::PointXYZRGB pt6(min_point.x, max_point.y, max_point.z, 255., 0., 0.);
pcl::PointXYZRGB pt7(max_point.x, max_point.y, max_point.z, 255., 0., 0.);
pcl::PointXYZRGB pt8(max_point.x, max_point.y, min_point.z, 255., 0., 0.);
outCloud->clear();
outCloud->push_back(pt1);
outCloud->push_back(pt2);
outCloud->push_back(pt3);
outCloud->push_back(pt4);
outCloud->push_back(pt5);
outCloud->push_back(pt6);
outCloud->push_back(pt7);
outCloud->push_back(pt8);
}
根据计算的八个点确定12条连接线
void ShowPointCloudBox(pcl::PointCloud<pcl::PointXYZRGB>::Ptr& cloud, pcl::PointCloud<pcl::PointXYZRGB>::Ptr Point3d_BOX)
{
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Point Cloud Viewer"));
viewer->setBackgroundColor(255., 255., 255.);
pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
viewer->addPointCloud<pcl::PointXYZRGB>(cloud, rgb, "RGB cloud");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "RGB cloud");
viewer->addCoordinateSystem(5);// 添加坐标系
float r = 255 / 255.0;
float g = 0 / 255.0;
float b = 0 / 255.0;
std::string box_Linename = "Box3D_";
for (int j = 0; j < 12; j++) {
viewer->removeShape(box_Linename + std::to_string(j));
}
viewer->addLine<pcl::PointXYZRGB>(Point3d_BOX->points[0], Point3d_BOX->points[1], r, g, b, box_Linename + std::to_string(0));
viewer->addLine<pcl::PointXYZRGB>(Point3d_BOX->points[0], Point3d_BOX->points[3], r, g, b, box_Linename + std::to_string(1));
viewer->addLine<pcl::PointXYZRGB>(Point3d_BOX->points[0], Point3d_BOX->points[4], r, g, b, box_Linename + std::to_string(2));
viewer->addLine<pcl::PointXYZRGB>(Point3d_BOX->points[4], Point3d_BOX->points[5], r, g, b, box_Linename + std::to_string(3));
viewer->addLine<pcl::PointXYZRGB>(Point3d_BOX->points[4], Point3d_BOX->points[7], r, g, b, box_Linename + std::to_string(4));
viewer->addLine<pcl::PointXYZRGB>(Point3d_BOX->points[1], Point3d_BOX->points[5], r, g, b, box_Linename + std::to_string(5));
viewer->addLine<pcl::PointXYZRGB>(Point3d_BOX->points[5], Point3d_BOX->points[6], r, g, b, box_Linename + std::to_string(6));
viewer->addLine<pcl::PointXYZRGB>(Point3d_BOX->points[6], Point3d_BOX->points[7], r, g, b, box_Linename + std::to_string(7));
viewer->addLine<pcl::PointXYZRGB>(Point3d_BOX->points[1], Point3d_BOX->points[2], r, g, b, box_Linename + std::to_string(8));
viewer->addLine<pcl::PointXYZRGB>(Point3d_BOX->points[3], Point3d_BOX->points[7], r, g, b, box_Linename + std::to_string(9));
viewer->addLine<pcl::PointXYZRGB>(Point3d_BOX->points[2], Point3d_BOX->points[3], r, g, b, box_Linename + std::to_string(10));
viewer->addLine<pcl::PointXYZRGB>(Point3d_BOX->points[2], Point3d_BOX->points[6], r, g, b, box_Linename + std::to_string(11));
// 直到窗口关闭才结束循环
while (!viewer->wasStopped()) {
// 每次循环调用内部的重绘函数
viewer->spinOnce();
}
}
绘制结果
绘制箭头
std::string arrow_id = "arrow_"+ "-" + to_string("1");
viewer->removeShape(arrow_id);
viewer->addArrow<pcl::PointXYZ>(start, end, r, g, b,false, arrow_id);
绘制文字(不包含中文字体)
location(x,y,z) :文字绘制的位置。
int size, 修改文字的大小
std::string txt_name, txt_id;
txt_id = "txt-" + to_string(1);
txt_name = txt_id + "-1";
viewer->removeText3D(txt_id);
viewer->addText3D(txt_name, location, size, r, g, b, txt_id);