根据最大点最小点绘制矩形包围框、箭头、文字

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);

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LuLaDe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值