Open3D是一个开源的用于三维数据处理和可视化的库,提供了丰富的功能和工具。以下是Open3D库的一些主要功能:
-
几何数据处理:Open3D提供了处理点云、网格和曲线等几何数据的功能。您可以读取、保存、合并、裁剪、滤波、采样和变换几何数据,以及计算法线、曲率、几何特征等。
-
三维重建:Open3D支持基于RGBD图像或深度图像的三维重建。您可以执行体素集成、三维表面重建、密集地图生成等操作,以重建场景的三维模型。
-
优化和配准:Open3D提供了优化和配准算法,用于将不同视角或时间步骤的三维数据对齐。您可以执行点云配准、局部/全局配准、位姿估计等操作,以实现对齐和融合数据。
-
物体检测与分割:Open3D支持物体检测和分割算法,用于识别和提取场景中的物体。您可以执行点云或网格的物体分割、边界框检测、语义分割等操作。
-
深度学习集成:Open3D可以与深度学习框架(如PyTorch和TensorFlow)无缝集成。您可以使用预训练的深度学习模型进行物体检测、语义分割、姿态估计等任务,并将结果应用于三维数据。
-
可视化:Open3D提供了强大的可视化功能,用于可视化点云、网格、体素以及其他几何数据。您可以在窗口中交互式地浏览、旋转、缩放和选择几何对象,以及渲染光照、材质和纹理。
-
文件格式支持:Open3D支持多种常见的三维数据文件格式,包括PLY、OBJ、XYZ、PCD、STL等。您可以读取和保存这些文件,方便地与其他软件和工具进行数据交换。
这些只是Open3D库提供的一些主要功能。它是一个持续发展的项目,还有更多功能和工具在不断增加。您可以访问Open3D的官方文档和示例代码,以了解更多详细信息和使用方法 www.open3d.org/docs/%EF%BC…
可以下载现成的,也可以通过源码编译 下载地址 Build from source — Open3D 0.17.0 documentation
对比PCL和Opencv以及OPENGL优点
- 在显示功能点云和MESH和效果比PCL和Opencv好用
- 在显示2D贴图和纹理时,比OPENGL方便不需要自己定义着色器
- 在包含相关头文件时,不像PCL需要包含一堆头文件和库,导致IDE编译器VS卡顿
- API调用方便简单,比PCL容易管理项目代码 同样也有不足,文档较少,默认的滚轮放大缩小也存在最大和最小值,需要通过修改源码重新编译解除
环境配置CMAKE+Open3d 我的open3d头文件夹放在了3rdparty下
然后链接Open3D.lib库即可,同时把Open3D.dll放到对应的运行程序目录即可
#include <open3d/Open3D.h>
int main()
{
// 读取点云文件
open3d::geometry::PointCloud pcd;
open3d::io::ReadPointCloud("path/to/pointcloud.pcd", pcd);
// 可视化点云
open3d::visualization::DrawGeometries({pcd});
return 0;
}
如果想要使用Qt,将Open3d窗口嵌入到Qt的QWidget中
void WidgetMain::InitOpen3dWidget()
{
int width = 600;
int height = 600;
//WidgetMain.h定义 std::shared_ptr<open3d::visualization::Visualizer> visualizer = nullptr;
visualizer = std::make_shared<open3d::visualization::Visualizer>();
// std::cout << width << std::endl;
// std::cout << height << std::endl;
// 创建一个窗口
visualizer->CreateVisualizerWindow("open3d", width, height, 50, 50, true);
// 设置MouseCallback回调函数
// 设置窗口背景色
Eigen::Vector3d backcolo(128 / 255.0, 138 / 255.0, 135 / 255.0);
Eigen::Vector3d blackBackground(0, 0, 0);
visualizer->GetRenderOption().background_color_ = blackBackground;
visualizer->GetRenderOption().show_coordinate_frame_ = true;
// 查找窗口
WId wid = (WId)FindWindow(NULL, L"open3d");
QWindow *m_window = QWindow::fromWinId(wid);
m_window->setFlags(m_window->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint);
// 绑定到QT 同时设置窗口大小
//m_widget是你的QWidget指针
m_widget = QWidget::createWindowContainer(m_window, ui.widget);
m_widget->setMinimumSize(width, height);
}
Qt实现点击按钮,选择STL或者PLY文件加载MESH的功能
void WidgetMain::LoadMesh()
{
QString filename = QFileDialog::getOpenFileName(nullptr, "Open .stl or ./ply File", ".", "(*.stl *.ply)");
std::cout << std::string(filename.toLocal8Bit()) << std::endl;
if (filename.isEmpty())
{
printf("LoadMesh filename isEmpty\n");
return;
}
std::string filePath = std::string(filename.toLocal8Bit());
std::cout << "ReadTriangleMesh File" << std::endl;
open3d::geometry::TriangleMesh mesh;
if (open3d::io::ReadTriangleMesh(filePath, &mesh)
{
//用于计算网格模型中每个顶点的法线向量。可以使得MESH正面有光照颜色
//法线向量是垂直于网格表面的矢量,对于渲染、光照和几何处理等操作非常重要
mesh.ComputeVertexNormals();
visualizer->RemoveGeometry(&mesh);
// std::cout << "File ok!" << std::endl;
// // 把点云add进去,只add一次,不然显示出来视角不能转
visualizer->AddGeometry(&mesh);
// MESH数据更新时,需要调用更新显示
visualizer->UpdateGeometry(&mesh);
}
}