auto cloud_ptr = std::make_shared<open3d::geometry::PointCloud>(); //创建一个存放点云的指针
open3d::visualization::Visualizer visualizer; //创建一个可视化对象
visualizer.CreateVisualizerWindow("open3d",640,480,50,50,true); //创建一个窗口
visualizer.GetRenderOption().point_size_ = 0.1;//设置点云点的大小
Eigen::Vector3d backcolo(0,0,0);
visualizer.GetRenderOption().background_color_ = backcolo;//设置窗口背景色
visualizer.GetRenderOption().show_coordinate_frame_ = true;
int flag = 0;//做逻辑判断用
float* p3D = (float)malloc(m_iP3DLen); //malloc 一个大的内存 存放实时更新的点云,格式为下xyzxyzxyz...
while(true)
{
Get_Point(p3D);//这里自己实现点云的获取
for (int a = 0; a < DEPTH_WIDE * DEPTH_HEIG; ++a) // 存放点云
{
Eigen::Vector3d ppp(p3D[a*3], p3D[a*3 + 1], p3D[a*3 + 2]);
cloud_ptr->points_.push_back(ppp);
}
for (int a = 0; a < DEPTH_WIDE * DEPTH_HEIG; ++a) //把颜色数据放进去
{
double r = 1; //这里可以换成点云的真实颜色,显示出来的就是彩色点云了
double g = 2;
double b = 3;
cloud_ptr->colors_.push_back(Eigen::Vector3d(b, g, r));
}
cloud_ptr->NormalizeNormals();
auto mcloud_ptr = cloud_ptr->VoxelDownSample(0.05);//下体素采样
mcloud_ptr->EstimateNormals(open3d::geometry::KDTreeSearchParamHybrid(0.01, 50));//设置法线,好像没什么效果
open3d::geometry::AxisAlignedBoundingBox a = mcloud_ptr->GetAxisAlignedBoundingBox();//获取点云的包围框
std::shared_ptr<open3d::geometry::AxisAlignedBoundingBox> mbox(new open3d::geometry::AxisAlignedBoundingBox(a));
mbox->color_ = Eigen::Vector3d(1, 0, 0);//设置包围框颜色
if (!flag)
{
flag = 1;
visualizer.AddGeometry(cloud_ptr); //把点云add进去,只add一次,不然显示出来视角不能转
动
visualizer.AddGeometry(mbox);//add包围框
}
visualizer.UpdateGeometry(cloud_ptr);//更新显示
visualizer.AddGeometry(mbox);//更新包围框
visualizer.PollEvents(); //下头这两个不清楚啥用
visualizer.UpdateRender();
cloud_ptr->points_.clear();
cloud_ptr->colors_.clear();
}
大致代码如上,修改修改就能用