pythonでgray16画像ファイルを読み込む方法
open3dでカラー画像と奥行き画像からポイントクラウドデータを作成する時に、RGB画像ファイルと16bitUINTグレー画像の読み込みが必要となる。
open3dには標準でこの読込み関数が定義されている。
import open3d as o3d source_color = o3d.io.read_image("../../TestData/RGBD/color/00000.jpg") source_depth = o3d.io.read_image("../../TestData/RGBD/depth/00000.png")
しかしながら
RGB画像ファイルはjpg
奥行き画像は16bitグレーのpng
と限定されている。また、日本語のファイル名でエラーとなる。
pillowを使用し、次の様にすることで日本語ファイル名に対応して、更に16bitグレーのtiffファイルの読み込みも可能となる。
import open3d as o3d from PIL import Image fn1 = "../../TestData/RGBD/color/00000.jpg" im = Image.open(fn1) source_color = o3d.geometry.Image(np.asarray(im)) #open3d形式に変換 fn2 = "../../TestData/RGBD/depth/00000.png" ima = Image.open(fn2) #int32で読み込まれる im = ima.convert("I;16") #uint16に変換 source_depth = o3d.geometry.Image(np.asarray(im)) #open3d形式に変換
また、日本語ファイル名ではエラーとなるがopencvで読み込む時には次の様になる。
import open3d as o3d import cv2 fn1 = "../../TestData/RGBD/color/00000.jpg" source_color = o3d.geometry.Image( cv2.cvtColor(cv2.imread(fn1, -1), cv2.COLOR_BGR2RGB)) fn2 = "../../TestData/RGBD/depth/00000.png" source_depth = o3d.geometry.Image(cv2.imread(fn2, -1))
opencvでは色の順番がBGRなので、ファイル読込後RGBへ変換している。 その後 以下のようにしてポイントクラウドを作り、表示する事が出来る。
rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth( source_color , source_depth , convert_rgb_to_intensity = False) cameraIntrinsic = o3d.camera.PinholeCameraIntrinsic( o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault) pcd = o3d.geometry.PointCloud.create_from_rgbd_image( rgbd_image , cameraIntrinsic) # Flip it, otherwise the pointcloud will be upside down pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]]) o3d.visualization.draw_geometries([pcd]) #表示
参考 redwood-data.org