Open3d系列 | 3. Open3d实现点云上采样、点云聚类、点云分割以及点云重建

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
简介: Open3d系列 | 3. Open3d实现点云上采样、点云聚类、点云分割以及点云重建

1. Open3d点云下采样


点云下采样是对点云以一定的采样规则重新进行采样,目的是在保证点云整体几何特征不变的情况下,降低点云的密度,进而可以降低相关处理的数据量和算法复杂度。下面介绍三种下采样方式:体素下采样、均匀下采样、随机下采样


1.1 体素下采样

体素下采样就是把落在每个体素中的点用一个点来表示。这个点的坐标取值就是体素中所有点坐标的平均值,也就是体素中各个点的质心,点云质心可以通过pcd.get_center()或者是简单的np.mean(axis=1)来获得。


Open3d中体素的下采样函数有两个接口:voxel_down_sample与voxel_down_sample_and_trace,参数说明如下所示:


def voxel_down_sample(self, voxel_size): # real signature unknown; restored from __doc__
    """
    voxel_down_sample(self, voxel_size)
    Function to downsample input pointcloud into output pointcloud with a voxel. Normals and colors are averaged if they exist.
    Args:
        voxel_size (float): Voxel size to downsample into.
    Returns:
        open3d.geometry.PointCloud 直接返回点云pcd
    """
    pass
def voxel_down_sample_and_trace(self, voxel_size, min_bound, max_bound, approximate_class=False): # real signature unknown; restored from __doc__
    """
    voxel_down_sample_and_trace(self, voxel_size, min_bound, max_bound, approximate_class=False)
    Function to downsample using PointCloud.VoxelDownSample. Also records point cloud index before downsampling
    Args:
        voxel_size (float): Voxel size to downsample into.
        min_bound (numpy.ndarray[numpy.float64[3, 1]]): Minimum coordinate of voxel boundaries 体素边界的最小坐标
        max_bound (numpy.ndarray[numpy.float64[3, 1]]): Maximum coordinate of voxel boundaries 体素边界的最大坐标
        approximate_class (bool, optional, default=False) :approximate_class就是用来控制采样后的点云颜色
            当approximate_class=True时,体素采样后的点的颜色由体素中大多数点的颜色决定
            当approximate_class=False时,体素采样后的点的颜色由体素中所有点的平均颜色决定
    Returns:
        Tuple[open3d.geometry.PointCloud, numpy.ndarray[numpy.int32[m, n]], List[open3d.utility.IntVector]]
        返回两个内容:稀疏后的点云pcd 与 稀疏后的点云在原点云中的索引
    """
    pass


参考代码:


def open3d_downsample():
    # 读取点云文件
    pcd_path = r"E:\Study\Machine Learning\Dataset3d\points_pcd\cat.pcd"
    pcd = open3d.io.read_point_cloud(pcd_path)
    pcd = open3d.geometry.PointCloud(pcd)
    # 数值越大,下采样倍数越高,也就越稀疏
    voxel_size = 10
    pcd_sample1 = deepcopy(pcd)
    pcd_sample1.translate([60, 0, 0])   # x轴左移60(向左)
    pcd_sample1.paint_uniform_color(color=[0, 0, 1])    # 蓝色
    pcd_sample1 = pcd_sample1.voxel_down_sample(voxel_size=voxel_size)
    bound = (pcd_sample1.get_min_bound(), pcd_sample1.get_max_bound())
    print(bound)
    pcd_sample2 = deepcopy(pcd)
    pcd_sample2.translate([0, 0, 60])   # z轴正向移60(向上)
    pcd_sample2.paint_uniform_color(color=[0, 1, 0])    # 绿色
    pcd_sample2 = pcd_sample2.voxel_down_sample_and_trace(voxel_size=voxel_size,
                                                          min_bound=pcd_sample2.get_min_bound() + 10,
                                                          max_bound=pcd_sample2.get_max_bound() - 10,
                                                          approximate_class=False)[0]
    bound = (pcd_sample2.get_min_bound(), pcd_sample2.get_max_bound())
    print(bound)
    # 可视化点云列表
    open3d.visualization.draw_geometries([pcd, pcd_sample1, pcd_sample2],
                                         window_name="pointcloud downsampler",
                                         width=800,
                                         height=600)


结果展示:

image.png


1.2 均匀下采样

均匀采样是指每隔固定的点数采样一次。样本按点的顺序执行,始终选择从第 1 个点开始,而不是随机选择。显然点存储的顺序不同,得到的结果也会不一样。从这个角度来看,这种方法比较适合有序点云的降采样。


如果点云本身不均匀,那么以固定点数采样很有可能造成某一部分的点云没被采样到。相比于体素的采样方法,点云均匀采样后的点数是固定可控的,而体素采样后的点云数量是不可控的。(ps:随机采样后的点数也是可控的)


参数说明:


def uniform_down_sample(self, every_k_points): # real signature unknown; restored from __doc__
    """
    uniform_down_sample(self, every_k_points)
    Function to downsample input pointcloud into output pointcloud uniformly. The sample is performed in the order of the points with the 0-th point always chosen, not at random.
    Args:
        every_k_points (int): Sample rate, the selected point indices are [0, k, 2k, ...]
    Returns:
        open3d.geometry.PointCloud
    """
    pass


参考代码:

# 均匀下采样
pcd_sample4 = deepcopy(pcd)
pcd_sample4.translate([-60, 0, 0])  # z轴负向移60(向下)
pcd_sample4 = pcd_sample4.uniform_down_sample(every_k_points=10)
print('pcd_sample3 center: ', pcd_sample4.get_center())


1.3 随机下采样

在原始点云中随机采样一定点数的点,open3d中的随机采样函数为random_down_sample,其参数是采样后点云数量相对于原始点云数量的比例。


参数说明:


def random_down_sample(self, sampling_ratio): # real signature unknown; restored from __doc__
    """
    random_down_sample(self, sampling_ratio)
    Function to downsample input pointcloud into output pointcloud randomly. The sample is generated by randomly sampling the indexes from the point cloud.
    Args:
        sampling_ratio (float): Sampling ratio, the ratio of number of selected points to total number of points[0-1]
    Returns:
        open3d.geometry.PointCloud
    """
    pass


参考代码:


# 随机下采样
pcd_sample3 = deepcopy(pcd)
pcd_sample3.translate([0, 0, -60])  # z轴负向移60(向下)
pcd_sample3 = pcd_sample3.random_down_sample(sampling_ratio=0.2)
print('pcd_sample3 center: ', pcd_sample3.get_center())


除open3d的方法外,也可以自己自定义随机采样的方式(利用numpy的随机模块),这样会更加灵活。numpy的随机模块笔记:Numpy | np.random随机模块的使用介绍


points = np.array(pcd.points)
n = np.random.choice(len(points), 500, replace=False) # 从points中以相同的几率随机采样500个点,同时还可以设置权重p,返回的是原始点云中的索引
pcd.points = open3d.utility.Vector3dVector(points[n])


完整代码:


def open3d_downsample():
    # 读取点云文件
    pcd_path = r"E:\Study\Machine Learning\Dataset3d\points_pcd\cat.pcd"
    pcd = open3d.io.read_point_cloud(pcd_path)
    pcd = open3d.geometry.PointCloud(pcd)
    pcd.paint_uniform_color(color=[0.5, 0.5, 0.5])
    # 数值越大,下采样倍数越高
    voxel_size = 10
    pcd_sample1 = deepcopy(pcd)
    pcd_sample1.translate([60, 0, 0])   # x轴左移60(向左)
    pcd_sample1.paint_uniform_color(color=[0, 0, 1])    # 蓝色
    pcd_sample1 = pcd_sample1.voxel_down_sample(voxel_size=voxel_size)
    bound = (pcd_sample1.get_min_bound(), pcd_sample1.get_max_bound())
    print(bound)
    pcd_sample2 = deepcopy(pcd)
    pcd_sample2.translate([0, 0, 60])   # z轴正向移60(向上)
    pcd_sample2.paint_uniform_color(color=[0, 1, 0])    # 绿色
    pcd_sample2 = pcd_sample2.voxel_down_sample_and_trace(voxel_size=voxel_size,
                                                          min_bound=pcd_sample2.get_min_bound() + 10,
                                                          max_bound=pcd_sample2.get_max_bound() - 10,
                                                          approximate_class=False)[0]
    bound = (pcd_sample2.get_min_bound(), pcd_sample2.get_max_bound())
    print(bound)
    # 随机下采样
    pcd_sample3 = deepcopy(pcd)
    pcd_sample3.translate([0, 0, -60])  # z轴负向移60(向下)
    pcd_sample3 = pcd_sample3.random_down_sample(sampling_ratio=0.2)
    print('pcd_sample3 center: ', pcd_sample3.get_center())
    # 均匀下采样
    pcd_sample4 = deepcopy(pcd)
    pcd_sample4.translate([-60, 0, 0])  # z轴负向移60(向下)
    pcd_sample4 = pcd_sample4.uniform_down_sample(every_k_points=10)
    print('pcd_sample3 center: ', pcd_sample4.get_center())
    # 可视化点云列表
    open3d.visualization.draw_geometries([pcd, pcd_sample1, pcd_sample2, pcd_sample3, pcd_sample4],
                                         window_name="pointcloud downsampler",
                                         width=800,
                                         height=600)


结果展示:

image.png


参考资料:


1. 三种点云下采样方法(一) — open3d python

2. 三种点云下采样方法(二)— open3d python


2. Open3d点云聚类


在sklearn工具包中,有大量的聚类算法提供使用,这里的点云数据可以有效的配置sklearn工具包,以实现效果。其中,open3d也自带了dbscan聚类的使用接口。这里不涉及具体的聚类算法解析。

image.png


2.1 Open3d点云聚类

open3d中DBSCAN聚类方法的函数为cluster_dbscan,且有且仅有这么一种聚类算法,所以建议使用sklearn进行聚类。(可以跳过这节直接看下一节)


  • 第一个参数eps表示DBSCAN算法确定点密度时和邻近点的距离大小,即考虑eps距离范围内的点进行密度计算,如果点云数据过于稀疏,那么这里的参数需要设置得大一些,确保部分点可以实现连通。min_points表示组成一类最少需要多少个点。print_progress可以用来显示运行的进度。


  • labels返回聚类成功的类别,-1表示没有分到任何类中的点,原始点云中每个点都会分别得到一个类别标签。


参考代码:


# 点云聚类测试
def open3d_cluster():
    # 读取点云文件
    pcd_path = r"E:\Study\Machine Learning\Dataset3d\points_pcd\cat.pcd"
    pcd = open3d.io.read_point_cloud(pcd_path)
    pcd = open3d.geometry.PointCloud(pcd)
    # 聚类距离设置为4,组成一类至少需要20个点
    labels = pcd.cluster_dbscan(eps=4, min_points=20, print_progress=True)
    max_label = max(labels)
    print(max_label)
    # 随机构建n+1种颜色,这里需要归一化
    colors = np.random.randint(1, 255, size=(max_label + 1, 3)) / 255.
    colors = colors[labels]             # 每个点云根据label确定颜色
    colors[np.array(labels) < 0] = 0    # 噪点配置为黑色
    pcd.colors = open3d.utility.Vector3dVector(colors)  # 格式转换(由于pcd.colors需要设置为Vector3dVector格式)
    # 可视化点云列表
    open3d.visualization.draw_geometries([pcd],
                                         window_name="cluster",
                                         width=800,
                                         height=600)


结果展示:

image.png


2.2 Sklearn点云聚类

我们可以利用sklearn中丰富的聚类算法库,为点云进行聚类。Sklearn中的参数在 机器学习学习专栏 中有介绍到。


  • 1)Kmeans聚类参考代码

这里尝试将猫点云聚类成3类,并用不同的颜色进行显示


import open3d
import numpy as np
from copy import deepcopy
from sklearn import cluster
def open3d_sklearn_cluster():
    # 读取点云文件
    pcd_path = r"E:\Study\Machine Learning\Dataset3d\points_pcd\cat.pcd"
    pcd = open3d.io.read_point_cloud(pcd_path)
    pcd = open3d.geometry.PointCloud(pcd)
    pcd.paint_uniform_color(color=[0, 0, 0])
    # 点云聚类
    n_clusters = 3    # 聚类簇数
    points = np.array(pcd.points)
    kmeans = cluster.KMeans(n_clusters=n_clusters, random_state=42)
    kmeans.fit(points)
    labels = kmeans.labels_
    # 显示颜色设置
    colors = np.random.randint(0, 255, size=(n_clusters, 3)) / 255
    colors = colors[labels]
    pcd_cluster = deepcopy(pcd)
    pcd_cluster.translate([50, 0, 0])
    pcd_cluster.colors = open3d.utility.Vector3dVector(colors)
    # 点云可视化
    open3d.visualization.draw_geometries([pcd, pcd_cluster],
                                         window_name="sklearn cluster",
                                         width=800,
                                         height=600)


结果展示:

image.png


Sklearn聚类的效果还是相当好的,直接将猫规规矩矩的分成了3个部分。


  • 2)DBSCAN聚类参考代码
def open3d_sklearn_cluster():
    # 读取点云文件
    pcd_path = r"E:\Study\Machine Learning\Dataset3d\points_pcd\cat.pcd"
    pcd = open3d.io.read_point_cloud(pcd_path)
    pcd = open3d.geometry.PointCloud(pcd)
    pcd.paint_uniform_color(color=[0, 0, 0])
    # 点云聚类
    points = np.array(pcd.points)
    dbscan = cluster.DBSCAN(eps=4, min_samples=20)      # 使用DBSCAN算法进行聚类
    dbscan.fit(points)
    labels = dbscan.labels_
    # 显示颜色设置
    colors = np.random.randint(0, 255, size=(max(labels) + 1, 3)) / 255    # 需要设置为n+1类,否则会数据越界造成报错
    colors = colors[labels]    # 很巧妙,为每个label直接分配一个颜色
    colors[labels < 0] = 0     # 噪点直接设置为0,用黑色显示
    pcd_cluster = deepcopy(pcd)
    pcd_cluster.translate([50, 0, 0])
    pcd_cluster.colors = open3d.utility.Vector3dVector(colors)
    # 点云可视化
    open3d.visualization.draw_geometries([pcd, pcd_cluster],
                                         window_name="sklearn cluster",
                                         width=800,
                                         height=600)


结果展示:

image.png


与open3d官方实现的效果类似,但是sklearn可以有效兼容,也就是说点云聚类直接使用sklearn工具即可。其他的聚类算法直接根据API进行稍微更改即可使用,这里的代码参数也不过介绍,在我的机器学习专栏中有笔记介绍过,详细见:机器学习学习专栏


参考资料:


1. 八种点云聚类方法(一)— DBSCAN

2. 八种点云聚类方法(二)— KMeans

3. Sklearn官方手册:cluster部分


3. Open3d点云分割


3.1 RANSAC分割平面

RANSAC为Random Sample Consensus的缩写,即随机抽样一致性,它是根据一组包含异常数据的样本数据集,计算出数据的数学模型参数,得到有效样本数据的算法。RANSAC算法的基本理论基础是大数定律,也就是当采样数达到一定数量后采样的数据就会符合它自身原有的概率属性。这是一种通过概率的方式来进行拟合。


以RANSAC平面分割为例,由于三个点可以确定一个平面,因此RANSAC会随机选择三个点来构建一个平面,并用点云中实际上有多少个点落到这个平面上来作为评估这个平面的正确程度。当随机抽样的次数足够多时,我们有较大概率获得所需要的平面:A x + B y + C z + D = 0


  • pcd.segment_plane参数说明:
def segment_plane(self, distance_threshold, ransac_n, num_iterations, seed=None): # real signature unknown; restored from __doc__
    """
    segment_plane(self, distance_threshold, ransac_n, num_iterations, seed=None)
    Segments a plane in the point cloud using the RANSAC algorithm.
    Args:
        distance_threshold (float): Max distance a point can be from the plane model, and still be considered an inlier.
        ransac_n (int): Number of initial points to be considered inliers in each iteration.
        num_iterations (int): Number of iterations.
        seed (Optional[int], optional, default=None): Seed value used in the random generator, set to None to use a random seed value with each function call.
    Returns:
        Tuple[numpy.ndarray[numpy.float64[4, 1]], List[int]]
        返回: (A,B,C,D)作为一个平面,对于平面上每个点(x,y,z)满足上面的平面方程; 这个函数还会返回内点索引的列表
    """


测试代码:


def open3d_segment():
    # 读取点云文件
    pcd_path = r"E:\Study\Machine Learning\Dataset3d\points_pcd\cat.pcd"
    pcd = open3d.io.read_point_cloud(pcd_path)
    pcd = open3d.geometry.PointCloud(pcd)
    pcd.paint_uniform_color(color=[0.5, 0.5, 0.5])
    plane_model, inliers = pcd.segment_plane(distance_threshold=1, ransac_n=10, num_iterations=1000)
    [A, B, C, D] = plane_model
    print(f"Plane equation: {A:.2f}x + {B:.2f}y + {C:.2f}z + {D:.2f} = 0")
    colors = np.array(pcd.colors)
    colors[inliers] = [0, 0, 1]  # 平面内的点设置为蓝色
    pcd.colors = open3d.utility.Vector3dVector(colors)
    # 点云可视化
    open3d.visualization.draw_geometries([pcd],
                                         window_name="segment",
                                         width=800,
                                         height=600)


结果展示:

image.png


参考资料:


两种点云分割(一)— RANSAC分割平面


4. Open3d点云重建


简要归纳各函数的使用方法,最后贴上完整代码与展示效果


4.1 Alpha shapes

open3d中对应的函数为TriangleMesh.create_from_point_cloud_alpha_shape,其关键参数为alpha。alpha是该方法在搜索外轮廓时的半径大小。alpha值越小,网格的细节就越多,分辨率越高。


# 1. Alpha shapes轮廓提取
pcd_rc1 = deepcopy(pcd)
pcd_rc1.translate([-100, 0, 50])
mesh_rc1 = open3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(pcd_rc1, alpha=6)
mesh_rc1 = open3d.geometry.TriangleMesh(mesh_rc1)
mesh_rc1.paint_uniform_color([1, 0, 0])     # 红色


4.2 Ball pivoting

open3d中对应的函数为TriangleMesh.create_from_point_cloud_ball_pivoting,其关键参数为radii。radii是滚球的半径,而且可以设置多个值,也就是可以用多个尺寸的滚球来进行三角面构建。重建需要先计算点云法向量。


# 2. Ball pivoting滚球算法
pcd_rc2 = deepcopy(pcd)
pcd_rc2.translate([-50, 0, 50])
pcd_rc2.estimate_normals(   # 法向量计算
    search_param=open3d.geometry.KDTreeSearchParamHybrid(radius=0.01, max_nn=30)
)
radii = [2, 5, 8]
mesh_rc2 = open3d.geometry.TriangleMesh.create_from_point_cloud_ball_pivoting(
    pcd=pcd_rc2,
    radii=open3d.utility.DoubleVector(radii)
)
mesh_rc2 = open3d.geometry.TriangleMesh(mesh_rc2)
mesh_rc2.paint_uniform_color([0, 1, 0])  # 绿色


4.3 Poisson

open3d中对应的函数为 TriangleMesh.create_from_point_cloud_poisson。该函数的一个重要参数是depth,它定义了用于曲面重建的八叉树的深度,因此表示生成的三角形网格的分辨率。depth值越高,网格的细节就越多,分辨率越高。

create_from_point_cloud_poisson除返回重建的表面之外,还会返回各处重建后的点密度,通过设置一个阈值来去除一些低密度处的重建结果(可以配合分位点来设置)。重建需要先计算点云法向量。


# 3. Poisson泊松曲面重建
pcd_rc3 = deepcopy(pcd)
pcd_rc3.translate([0, 0, 50])
pcd_rc3.estimate_normals(   # 法向量计算
    search_param=open3d.geometry.KDTreeSearchParamHybrid(radius=0.01, max_nn=30)
)
mesh_rc3, densities = open3d.geometry.TriangleMesh.create_from_point_cloud_poisson(pcd_rc3, depth=12)
mesh_rc3 = open3d.geometry.TriangleMesh(mesh_rc3)
# 设置阈值去除低密度重建结果
threshold_value = np.quantile(densities, 0.35)      # 寻找低密度列表中35%的分位数,返回的是数值而不是索引
vertices_to_remove = densities < threshold_value    # 低于分位数的值设置为False, 依次对其进行消除
mesh_rc3.remove_vertices_by_mask(vertices_to_remove)
mesh_rc3.paint_uniform_color([0, 0, 1])


4.4 voxel grid

open3d中对应的函数为 VoxelGrid.create_from_point_cloud,其关键参数体素尺寸voxel_size=0.05。尺寸越小,网格的细节就越多,分辨率越高。严格上来说,这种方法只是一种下采样的效果。


# 4. Voxel体素重建
pcd_rc4 = deepcopy(pcd)
pcd_rc4.translate([50, 0, 50])
pcd_rc4.paint_uniform_color(color=[0, 1, 1])
mesh_rc4 = open3d.geometry.VoxelGrid.create_from_point_cloud(pcd_rc4, voxel_size=2)


完整代码展示:


def open3d_reconstruction():
    # 读取点云文件
    pcd_path = r"E:\Study\Machine Learning\Dataset3d\points_pcd\cat.pcd"
    pcd = open3d.io.read_point_cloud(pcd_path)
    pcd = open3d.geometry.PointCloud(pcd)
    pcd.paint_uniform_color(color=[0, 0, 0])
    # 1. Alpha shapes轮廓提取
    pcd_rc1 = deepcopy(pcd)
    pcd_rc1.translate([-100, 0, 50])
    mesh_rc1 = open3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(pcd_rc1, alpha=6)
    mesh_rc1 = open3d.geometry.TriangleMesh(mesh_rc1)
    mesh_rc1.paint_uniform_color([1, 0, 0])     # 红色
    # 2. Ball pivoting滚球算法
    pcd_rc2 = deepcopy(pcd)
    pcd_rc2.translate([-50, 0, 50])
    pcd_rc2.estimate_normals(   # 法向量计算
        search_param=open3d.geometry.KDTreeSearchParamHybrid(radius=0.01, max_nn=30)
    )
    radii = [2, 5, 8]
    mesh_rc2 = open3d.geometry.TriangleMesh.create_from_point_cloud_ball_pivoting(
        pcd=pcd_rc2,
        radii=open3d.utility.DoubleVector(radii)
    )
    mesh_rc2 = open3d.geometry.TriangleMesh(mesh_rc2)
    mesh_rc2.paint_uniform_color([0, 1, 0])  # 绿色
    # 3. Poisson泊松曲面重建
    pcd_rc3 = deepcopy(pcd)
    pcd_rc3.translate([0, 0, 50])
    pcd_rc3.estimate_normals(   # 法向量计算
        search_param=open3d.geometry.KDTreeSearchParamHybrid(radius=0.01, max_nn=30)
    )
    mesh_rc3, densities = open3d.geometry.TriangleMesh.create_from_point_cloud_poisson(pcd_rc3, depth=12)
    mesh_rc3 = open3d.geometry.TriangleMesh(mesh_rc3)
    # 设置阈值去除低密度重建结果
    threshold_value = np.quantile(densities, 0.35)      # 寻找低密度列表中35%的分位数,返回的是数值而不是索引
    vertices_to_remove = densities < threshold_value    # 低于分位数的值设置为False, 依次对其进行消除
    mesh_rc3.remove_vertices_by_mask(vertices_to_remove)
    mesh_rc3.paint_uniform_color([0, 0, 1])
    # 4. Voxel体素重建
    pcd_rc4 = deepcopy(pcd)
    pcd_rc4.translate([50, 0, 50])
    pcd_rc4.paint_uniform_color(color=[0, 1, 1])
    mesh_rc4 = open3d.geometry.VoxelGrid.create_from_point_cloud(pcd_rc4, voxel_size=2)
    # 点云可视化
    pcd.translate([-25, 0, 0])
    open3d.visualization.draw_geometries([pcd, mesh_rc1, mesh_rc2, mesh_rc3, mesh_rc4],
                                         window_name="rebuild",
                                         width=800,
                                         height=600)


结果展示:

image.png


参考资料:


三维点云重建 — open3d python



相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
目录
相关文章
|
存储 数据采集 数据可视化
Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算
Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算
13660 1
Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算
|
算法 数据安全/隐私保护
TSCAN + TMODEL处理点云数据生成DEM
TSCAN + TMODEL处理点云数据生成DEM
641 0
TSCAN + TMODEL处理点云数据生成DEM
|
12月前
|
存储 传感器 数据可视化
3D目标检测数据集 KITTI(标签格式解析、3D框可视化、点云转图像、BEV鸟瞰图)
本文介绍在3D目标检测中,理解和使用KITTI 数据集,包括KITTI 的基本情况、下载数据集、标签格式解析、3D框可视化、点云转图像、画BEV鸟瞰图等,并配有实现代码。
1424 1
|
6月前
|
机器学习/深度学习 编解码 算法
SwinFIR:用快速傅里叶卷积重建SwinIR和改进的图像超分辨率训练
SwinFIR:用快速傅里叶卷积重建SwinIR和改进的图像超分辨率训练
191 1
|
传感器
ENVI: 如何进行图像的自动配准?
ENVI: 如何进行图像的自动配准?
506 0
|
6月前
|
机器学习/深度学习 算法 数据可视化
基于3DSOM的侧影轮廓方法空间三维模型重建
基于3DSOM的侧影轮廓方法空间三维模型重建
|
6月前
|
算法 机器人
[3D&Halcon] 3D鞋点胶的点云边界提取
[3D&Halcon] 3D鞋点胶的点云边界提取
464 0
|
12月前
|
传感器 机器学习/深度学习 Ubuntu
【论文解读】F-PointNet 使用RGB图像和Depth点云深度 数据的3D目标检测
​F-PointNet 提出了直接处理点云数据的方案,但这种方式面临着挑战,比如:如何有效地在三维空间中定位目标的可能位置,即如何产生 3D 候选框,假如全局搜索将会耗费大量算力与时间。 F-PointNet是在进行点云处理之前,先使用图像信息得到一些先验搜索范围,这样既能提高效率,又能增加准确率。 论文地址:Frustum PointNets for 3D Object Detection from RGB-D Data  开源代码:https://github.com/charlesq34/frustum-pointnets
660 0
|
机器学习/深度学习 传感器 人工智能
3D目标检测中点云的稀疏性问题及解决方案
点云的稀疏性指激光雷达的采样点覆盖相对于场景的尺度来讲,具有很强的稀疏性。例如,将目前主流的户外3D目标检测数据集KITTI[1]的点云投影到对应的RGB图像上,大约只有3%的像素才有对应的点云;VoxelNet[2]将获取的点云等间距的划分到体素空间,超过90%的体素是空的。稀疏性产生的原因包括远距离、遮挡和反光等。
3D目标检测中点云的稀疏性问题及解决方案
|
机器学习/深度学习 传感器 算法
基于点特征直方图(PFH)算法实现点云拼接附matlab代码
基于点特征直方图(PFH)算法实现点云拼接附matlab代码