Open3D는 이미지 처리를 위한 데이터 구조를 가지고 있으며, 이를 활용해 이미지 읽기, 쓰기, 필터링 및 시각화를 수행할 수 있습니다.
Open3D 이미지(Image
)는 바로 numpy 배열로 변환할 수 있습니다.
RGBDImage
는 두 개의 이미지로 구성됩니다: RGBDImage.depth
와 RGBDImage.color
.
이 두 이미지는 동일한 카메라 프레임에 정합되어 있고 같은 해상도를 가져야 합니다.
아래 튜토리얼에서는 유명한 RGB-D 데이터셋에서 이미지를 읽고 사용하는 방법을 보여줍니다.
이 섹션에서는 Redwood 데이터셋에서 RGBDImage
를 읽고 시각화하는 방법을 설명합니다 [Choi2015].
Redwood 포맷은 16비트 단일 채널 이미지로 깊이 정보를 저장
이 정수 값은 깊이 측정값을 밀리미터 단위
로 나타냅니다. 2의 16승이 65536 이니까 -> 63.536 m 를 커버 가능
이것이 Open3D에서 깊이 이미지를 파싱하는 기본 포맷
입니다.
print("Read Redwood dataset")
redwood_rgbd = o3d.data.SampleRedwoodRGBDImages()
color_raw = o3d.io.read_image(redwood_rgbd.color_paths[0])
depth_raw = o3d.io.read_image(redwood_rgbd.depth_paths[0])
rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth(
color_raw, depth_raw)
print(rgbd_image)
출력 결과:
Read Redwood dataset
RGBDImage of size
Color image : 640x480, with 1 channels.
Depth image : 640x480, with 1 channels.
Use numpy.asarray to access buffer data.
기본 변환 함수 create_rgbd_image_from_color_and_depth
는 컬러 이미지와 깊이 이미지 쌍으로부터 RGBDImage
를 생성합니다.
컬러 이미지는 그레이스케일 이미지로 변환되어 [0, 1] 범위의 실수값으로 저장됩니다.
깊이 이미지는 실수값으로 저장되며, 미터 단위로 깊이 값을 나타냅니다.
변환된 이미지는 numpy 배열로 렌더링할 수 있습니다.
plt.subplot(1, 2, 1)
plt.title('Redwood grayscale image')
plt.imshow(rgbd_image.color)
plt.subplot(1, 2, 2)
plt.title('Redwood depth image')
plt.imshow(rgbd_image.depth)
plt.show()
RGBDImage
는 특정 카메라 파라미터를 사용하여 포인트 클라우드로 변환할 수 있습니다.pcd = o3d.geometry.PointCloud.create_from_rgbd_image(
rgbd_image,
o3d.camera.PinholeCameraIntrinsic(
o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault))
# 포인트 클라우드가 거꾸로 보이지 않도록 뒤집기
pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
o3d.visualization.draw_geometries([pcd])
PinholeCameraIntrinsicParameters.PrimeSenseDefault
를 사용했습니다. pcd.transform
은 포인트 클라우드의 시각화를 위해 상하 반전 변환을 적용합니다.