반응형

OpenCV Python을 사용하여 깊이 이미지 depthmap을 화면에 보여주는 예제코드입니다. 

2023. 8. 6 최초작성



코드에서는 다음 링크에 있는 depthmap 파일을 다운로드하여 사용했습니다.
https://github.com/unclearness/pyrgbd/blob/master/data/cmu_panoptic/171026_cello3/depth_00000.png



실행해보면 다음처럼 보입니다. 



깊이 이미지에 대응하는 컬러 이미지는 다음과 같습니다.
출처 – https://github.com/unclearness/pyrgbd/blob/master/data/cmu_panoptic/171026_cello3/color_00000.png



테스트에 사용한 코드입니다. 

 

import cv2
import matplotlib.pyplot as plt
import matplotlib
import numpy as np


def get_color_depthmap(depthmap, max_range):

    # 256 단계의 color map을 생성합니다. 하나의 RBGR 색을 의미하는 3개의 값이 256개 만들어 집니다.
    # 256 개의 색을 결정하는 것은 get_camp의 인자인 "jet"이 결정합니다.
    # cmap의 shape는 (256,3)입니다.
    # cmap = plt.cm.get_cmap("jet", 256)
    cmap = matplotlib.colormaps["jet"]
    cmap = np.array([cmap(i) for i in range(256)])[:, :3] * 255

    # sparse depthmap인 경우 depth가 있는 곳만 추출합니다. 0이상의 값이 존재하는 곳만 찾습니다.
    depth_pixel_v_s, depth_pixel_u_s = np.where(depthmap > 0)

    #depthmap의 높이와 너비입니다.
    H, W = depthmap.shape

    # 컬러로 바꾼 depthmap이 저장될 넘파이 배열입니다.
    color_depthmap = np.zeros((H, W, 3)).astype(np.uint8)

    # depthmap의 값을 0~255사이의 값으로 바꾼 후, cmap에 정의된 RGB색으로 바꾸어줍니다.
    for depth_pixel_v, depth_pixel_u in zip(depth_pixel_v_s, depth_pixel_u_s):
        depth = depthmap[depth_pixel_v, depth_pixel_u]

        # 0 ~ 255 사이의 값으로 변환합니다.
        color_index = int(255 * min(depth, max_range) / max_range)

        # RGB 값으로 변환합니다.
        color = cmap[color_index, :]

        # 앞에서 얻은 color색으로 depthmap의 좌표에 해당 위치에 점을 찍어줍니다. 
        cv2.circle(color_depthmap, (depth_pixel_u, depth_pixel_v), 1, color=tuple(color), thickness=-1)
   
    return color_depthmap


# 실제 depthmap이 저장된 방식에 맞게 depth 복원하여 사용하면 됩니다.
# depthmap = depthmap.astype(np.float32) / 255.0
# depthmap = depthmap.astype(np.float32) * max_range / 65535
depthmap_path = 'depth_00000.png'
depthmap = cv2.imread(depthmap_path, cv2.IMREAD_UNCHANGED) # depthmap의 데이터타입은 uint16입니다.
max_range = depthmap.max() # 샘플로 사용한 depthmap 파일의 경우 최대값은 7989입니다

# 픽셀의 최대값이 max_range인 depthmap으로부터 컬러 이미지 color_depthmap을 얻습니다.
color_depthmap = get_color_depthmap(depthmap, max_range)

# OpenCV를 사용하여 화면에 출력시에는 색공간을 BGR로 변경해줘야 합니다.
color_depthmap = cv2.cvtColor(color_depthmap, cv2.COLOR_RGB2BGR)
cv2.imshow('result', color_depthmap)
cv2.waitKey(0)

# matplotlib를 사용하여 화면에 출력시에는 색공간 변환없이 그냥 하면 됩니다.
# plt.imshow(color_depthmap)
# plt.show()



원본 코드

https://gaussian37.github.io/vision-depth-depthmap_visualization/



반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts