Open3d C++用法

1,176 阅读3分钟

Open3D是一个开源的用于三维数据处理和可视化的库,提供了丰富的功能和工具。以下是Open3D库的一些主要功能:

  1. 几何数据处理:Open3D提供了处理点云、网格和曲线等几何数据的功能。您可以读取、保存、合并、裁剪、滤波、采样和变换几何数据,以及计算法线、曲率、几何特征等。

  2. 三维重建:Open3D支持基于RGBD图像或深度图像的三维重建。您可以执行体素集成、三维表面重建、密集地图生成等操作,以重建场景的三维模型。

  3. 优化和配准:Open3D提供了优化和配准算法,用于将不同视角或时间步骤的三维数据对齐。您可以执行点云配准、局部/全局配准、位姿估计等操作,以实现对齐和融合数据。

  4. 物体检测与分割:Open3D支持物体检测和分割算法,用于识别和提取场景中的物体。您可以执行点云或网格的物体分割、边界框检测、语义分割等操作。

  5. 深度学习集成:Open3D可以与深度学习框架(如PyTorch和TensorFlow)无缝集成。您可以使用预训练的深度学习模型进行物体检测、语义分割、姿态估计等任务,并将结果应用于三维数据。

  6. 可视化:Open3D提供了强大的可视化功能,用于可视化点云、网格、体素以及其他几何数据。您可以在窗口中交互式地浏览、旋转、缩放和选择几何对象,以及渲染光照、材质和纹理。

  7. 文件格式支持: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下

image.png

image.png

然后链接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);
	}
}