RealSense D435i로 3D 스캐너 설치

12668 단어 RealSenseOpen3D

Depth 카메라로 3D 스캐너와 유사한 설치(Open 3D 검색 겸)


지난 리얼센스 D435i로 계속 놀아요.

개요

  • D435i로 RGBD 데이터 제작
  • RGBD 데이터에서 포인트 그룹 데이터 생성
  • 점조 데이터로부터 자동으로 법선을 계산하고 메시를 붙여넣기
  • 컨디션

  • MacBook Air
  • Intel RealSense D435i
  • Jupyter-notebook
  • Python
  • Open3D
  • 참고 자료

  • Open 3D 문서
    http://www.open3d.org/docs/release/
  • 지난번 보도
    https://qiita.com/tishihara/items/90ce0f0f722deddea34a
  • 격자 생성 알고리즘
    https://stackoverflow.com/questions/56965268/how-do-i-convert-a-3d-point-cloud-ply-into-a-mesh-with-faces-and-vertices
  • 절차.

  • 라이브러리 가져오기
  • realsense의 SDK 및 open3d를 가져옵니다.
    import pyrealsense2 as rs
    import numpy as np
    import open3d as o3d
    
  • 시야각을 맞추는 동시에 흐르는 전송 정보를 얻는다
  • RGBD를 만들기 위해서는 Depth와 RGB의 시각을 조정해야 한다.
    align 대상을 사용하여 시각을 정렬합니다.SDK는 이런 방법이 있어서 매우 편리하다.
    # ストリーム(Depth/Color)の設定
    config = rs.config()
    config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)
    config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
    
    # ストリーミング開始
    pipeline = rs.pipeline()
    profile = pipeline.start(config)
    
    # Alignオブジェクト生成
    align_to = rs.stream.color
    align = rs.align(align_to)
    
  • 동일한 RGB 이미지와 Depth 이미지 두 이미지에서 RGBD 이미지 생성
  • RGBD 이미지를 만드는 방법create_from_color_and_depth입니다.
    try:
        while True:
            # フレーム待ち(Color & Depth)
            frames = pipeline.wait_for_frames()
            aligned_frames = align.process(frames)
            color_frame = aligned_frames.get_color_frame()
            depth_frame = aligned_frames.get_depth_frame()
            if not depth_frame or not color_frame:
                continue
    
            color_image = o3d.geometry.Image(np.asanyarray(color_frame.get_data()))
            depth_image = o3d.geometry.Image(np.asanyarray(depth_frame.get_data()))
    
            rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth(color_image, depth_image);
    
  • RGBD 이미지에서 Point Cloud
  • 생성
    RGBD 이미지PointCloud.create_from_rgbd_image가 있으면 Point Cloud를 한 번에 만들 수 있습니다.
            pcd = o3d.geometry.PointCloud.create_from_rgbd_image(rgbd_image,
                                                                 o3d.camera.PinholeCameraIntrinsic(o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault))
    
    ※ 지정PrimeSenseDefault했지만 원래 이곳은 리얼센스 D435i로 카메라 교정을 하고 내부 파라미터를 계산한 토대에서 내부 파라미터(instric)의 행렬을 제공해야 한다고 생각합니다.이번에는 교정이 불가능해 이 같은 내용을 잠정 설정했다.
  • 회전, 법선 계산, 샘플링 등 처리
  • 격자를 붙여넣기 전에 점 그룹이 너무 가늘면 표시가 좋지 않기 때문에 샘플링을 진행해야 합니다.
            # 回転する
            pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
    
            # 法線計算
            pcd.estimate_normals()
    
            # 指定したvoxelサイズでダウンサンプリング
            voxel_down_pcd = pcd.voxel_down_sample(voxel_size=0.01)
    
  • 스티커 그리드
  • 미안합니다. 이 부근은 밝지 않습니다.
    문서를 볼 때create_from_point_cloud_ball_pivoting 방법이 있기 때문에 이 방법을 사용하면 PCD에서 격자 데이터를 생성할 수 있다.
    일부는 그물 모양을 붙이지 않는 것이 반경 설정의 문제입니까?
    알고리즘은 여기에 기록되어 있다.
    https://ieeexplore.ieee.org/document/817351
            distances = voxel_down_pcd.compute_nearest_neighbor_distance()
            avg_dist = np.mean(distances)
            radius = 1.5 * avg_dist
    
            # メッシュ化
            radii = [radius, radius * 2]
            mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_ball_pivoting(voxel_down_pcd, o3d.utility.DoubleVector(radii))
    
    
  • 격자 데이터의 표시, 저장 등
  •         # 再度法線計算
            mesh.compute_vertex_normals()
    
            # 一応データ保存
            o3d.io.write_triangle_mesh("output.ply", mesh)
    
            # メッシュデータの表示
            o3d.visualization.draw_geometries([mesh])
    
    finally:
        # ストリーミング停止
        pipeline.stop()
    
    잘한 건 이거야.

    끝맺다


    오픈 3D와 리얼센스SDK 탐색을 결합해 3D 스캐너 같은 것을 만들어 봤다.
    각 방향에서 점 그룹 데이터를 생성하고 Merge 이후에 이 처리를 실행하면 제대로 된 3D 데이터를 생성할 수 있습니다.
    그럼

    좋은 웹페이지 즐겨찾기