<p>这篇文章帮助我在长方体范围内裁剪出一个点云。我还经常使用<code>vol.crop_point_cloud(pcd)</code>遇到<code>geometry::PointCloud with 0 points</code>,无法使它工作,但我找到了一个不同的解决方案</p>
<p>最后,我引用了这个PR<a href="https://github.com/intel-isl/Open3D/pull/1218" rel="nofollow noreferrer">#1218</a>来使用open3d.geometry.OrientedBoundingBox长方体来裁剪点云。下面的代码围绕开始位置创建一个200m x 200m的“平铺”长方体,该长方体对应于点云内的ego车辆开始姿势,并过滤仅位于平铺内的点</p>
<pre><code>import json
import numpy as np
import open3d as o3d
CUBOID_EXTENT_METERS = 200
METERS_BELOW_START = 5
METERS_ABOVE_START = 30
def main():
## Point Cloud
points = np.array([
## These points lie inside the cuboid
[-2770.94365061042, 722.0595600050154, -20.004812609192445],
[-2755.94365061042, 710.0595600050154, -20.004812609192445],
[-2755.94365061042, 710.0595600050154, -15.004812609192445],
## These points lie outside the cuboid
[-2755.94365061042 + CUBOID_EXTENT_METERS, 710.0595600050154, -15.004812609192445],
[-2755.94365061042, 710.0595600050154 + CUBOID_EXTENT_METERS, -15.004812609192445],
]).reshape([-1, 3])
point_cloud = o3d.geometry.PointCloud()
point_cloud.points = o3d.utility.Vector3dVector(points)
## Start point here corresponds to an ego vehicle position start in a point cloud
start_position = {'x': -2755.94365061042, 'y': 722.0595600050154, 'z': -20.004812609192445}
cuboid_points = getCuboidPoints(start_position)
points = o3d.utility.Vector3dVector(cuboid_points)
oriented_bounding_box = o3d.geometry.OrientedBoundingBox.create_from_points(points)
point_cloud_crop = point_cloud.crop(oriented_bounding_box)
# View original point cloud with the cuboid, all 5 points present
o3d.visualization.draw_geometries([point_cloud, oriented_bounding_box])
# View cropped point cloud with the cuboid, only 3 points present
o3d.visualization.draw_geometries([point_cloud_crop, oriented_bounding_box])
def getCuboidPoints(start_position):
return np.array([
# Vertices Polygon1
[start_position['x'] + (CUBOID_EXTENT_METERS / 2), start_position['y'] + (CUBOID_EXTENT_METERS / 2), start_position['z'] + METERS_ABOVE_START], # face-topright
[start_position['x'] - (CUBOID_EXTENT_METERS / 2), start_position['y'] + (CUBOID_EXTENT_METERS / 2), start_position['z'] + METERS_ABOVE_START], # face-topleft
[start_position['x'] - (CUBOID_EXTENT_METERS / 2), start_position['y'] - (CUBOID_EXTENT_METERS / 2), start_position['z'] + METERS_ABOVE_START], # rear-topleft
[start_position['x'] + (CUBOID_EXTENT_METERS / 2), start_position['y'] - (CUBOID_EXTENT_METERS / 2), start_position['z'] + METERS_ABOVE_START], # rear-topright
# Vertices Polygon 2
[start_position['x'] + (CUBOID_EXTENT_METERS / 2), start_position['y'] + (CUBOID_EXTENT_METERS / 2), start_position['z'] - METERS_BELOW_START],
[start_position['x'] - (CUBOID_EXTENT_METERS / 2), start_position['y'] + (CUBOID_EXTENT_METERS / 2), start_position['z'] - METERS_BELOW_START],
[start_position['x'] - (CUBOID_EXTENT_METERS / 2), start_position['y'] - (CUBOID_EXTENT_METERS / 2), start_position['z'] - METERS_BELOW_START],
[start_position['x'] + (CUBOID_EXTENT_METERS / 2), start_position['y'] - (CUBOID_EXTENT_METERS / 2), start_position['z'] - METERS_BELOW_START],
]).astype("float64")
if __name__ == '__main__':
main()
</code></pre>