๋ฐ์ํ
๐ก ๋ณธ ๋ฌธ์๋ '[Perception] PointCloud Open3D ์ฌ์ฉ๋ฒ'์ ๋ํด ์ ๋ฆฌํด๋์ ๊ธ์ ๋๋ค.
1. Intro
- ํฌ์ธํธ ํด๋ผ์ฐ๋ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ํ์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ PCL๊ณผ Open3D๊ฐ ์์ต๋๋ค.
- ์ด ๊ฐ์์์๋ Open3D๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค์ต์ ์งํํฉ๋๋ค.
Open3D: A Modern Library for 3D Data Processing — Open3D 0.17.0 documentation
2. Open3D ์ค์น
- Open3D๋ฅผ ์ง์ํ๋ ํ๊ฒฝ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Python 3.7 ์ด์
- Ubuntu 18.04 ์ด์
- macOS 10.15 ์ด์
- Windows 10 64 bit ์ด์
- ์ค์น๋ ๊ฐ๋จํฉ๋๋ค. pip์ ํตํด ์ค์นํ์๋ฉด ๋ฉ๋๋ค. (๋จ, ๋ฒ์ ์ ์ ํ์ธํด์ฃผ์ธ์. ํด๋น ๊ฐ์์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก 0.17 ๋ฒ์ ์ ์ค์นํฉ๋๋ค.)
pip install open3d
- ๋ค์ ๋ช ๋ น์ด๋ฅผ ํตํด ์ค์น๋ฅผ ํ์ธํฉ๋๋ค.
python -c "import open3d as o3d; print(o3d.__version__)"
- ์ถ๊ฐ์ ์ผ๋ก ์์ ์ฝ๋ ๋ค์ด๋ก๋๋ฅผ ์ํด ์๋ ๊นํ๋ธ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ๋ณต์ฌํฉ๋๋ค.
git clone <https://github.com/isl-org/Open3D>
3. ๊ฐ๋จํ ์ค์ต ์์
1) ํฌ์ธํธ ํด๋ผ์ฐ๋ ๋ถ๋ฌ์ค๊ธฐ
- ํฌ์ธํธ ํด๋ผ์ฐ๋๋ Open3D์์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ ์์ ์ ๋ด๊ฐ ๊ฐ์ง๊ณ ์๋ ply ํ์ผ ๋ฑ์ ํตํด ๋ถ๋ฌ์ฌ ์ ์์ต๋๋ค.
- ๊ฐ๋จํ ์์ ๋ก, ๋ค์์ ํ์ด์ฌ ์ฝ๋๋ฅผ ํตํด ์ํ ply๋ฅผ ๋ถ๋ฌ์์ ์๊ฐํ ํด๋ณด๊ฒ ์ต๋๋ค.
print("Load a ply point cloud, print it, and render it")
ply_point_cloud = o3d.data.PLYPointCloud()
pcd = o3d.io.read_point_cloud(ply_point_cloud.path)
print(pcd)
print(np.asarray(pcd.points))
o3d.visualization.draw_geometries([pcd],
zoom=0.3412,
front=[0.4257, -0.2125, -0.8795],
lookat=[2.6172, 2.0475, 1.532],
up=[-0.0694, -0.9768, 0.2024])
2) ๋ค์ด์ํ๋ง ๋ฐ ๋ ธ๋ง ์ถ์
- ๋ถ๋ฌ์จ ํฌ์ธํธ ํด๋ผ์ฐ๋์ ์๋ ์ฝ๋๋ฅผ ํตํด ๋ค์ด์ํ๋ง์ ์ํํ๊ฒ ์ต๋๋ค.
print("Downsample the point cloud with a voxel of 0.05")
downpcd = pcd.voxel_down_sample(voxel_size=0.05)
o3d.visualization.draw_geometries([downpcd],
zoom=0.3412,
front=[0.4257, -0.2125, -0.8795],
lookat=[2.6172, 2.0475, 1.532],
up=[-0.0694, -0.9768, 0.2024])
- ๋ถ๋ฌ์จ ํฌ์ธํธ ํด๋ผ์ฐ๋์ ๋ํด ์๋ ์ฝ๋๋ฅผ ํตํด ๋ ธ๋ง ๋ฒกํฐ๋ฅผ ์ถ์ ํ๊ฒ ์ต๋๋ค.
print("Recompute the normal of the downsampled point cloud")
downpcd.estimate_normals(
search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30))
o3d.visualization.draw_geometries([downpcd],
zoom=0.3412,
front=[0.4257, -0.2125, -0.8795],
lookat=[2.6172, 2.0475, 1.532],
up=[-0.0694, -0.9768, 0.2024],
point_show_normal=True)
- ๊ทธ ์ธ ๋ค์ํ ์์ ๋ฅผ documentation์ ํตํด ํ์ธํ์ค ์ ์์ต๋๋ค.
4. ํฌ์ธํธ ํด๋ผ์ฐ๋ ์๊ฐํ ํ๋ก๊ทธ๋จ
- ์ฒ๋ฆฌ๋ ํฌ์ธํธ ํด๋ผ์ฐ๋์ ์๊ฐํ ๋ชฉ์ ์ผ๋ก cloud compare๋ฅผ ์ค์นํ๊ฒ ์ต๋๋ค.
- ํด๋น ํ๋ก๊ทธ๋จ์ ์ฌ๋ฌ ํฌ๋งท์ ํฌ์ธํธ ํด๋ผ์ฐ๋ ๋ฐ ๋ฉ์ฌ ํ์ผ์ ์๊ฐํํ ์ ์์ต๋๋ค.
- ๋ฟ๋ง ์๋๋ผ ํฌ์ธํธ ํด๋ผ์ฐ๋์ crop, transformation ๋ฑ์ ์กฐ์์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๋ ํฌ์ธํธ ํด๋ผ์ฐ๋ ๊ฐ fine registration ๊ธฐ๋ฅ ์ ๊ณต
- Annotation ๋ชฉ์ ์ segment labeling ํ์ฉ ๊ฐ๋ฅ
- ๋ค์ด๋ก๋ ๋งํฌ: https://www.danielgm.net/cc/
๋ฐ์ํ