3D reconstruction 관련 진행하는게 있어서 depth 카메라를 알아보는 도중 연구실 구석에서 xtion pro live를 발견했다. 찾아보니 ASUS에서 제조한 3D 깊이 센서로 kinect 방식을 활용해 깊이를 추출한다고 한다. 근데 분명 SDK가 제공된다 했는데 아무리 찾아봐도 없다. 그래서 또 열심히 찾아보다가 openNI라는 잡기술을 발견했다.
산업 주도의 비영리 조직이자 Natural Interaction(NI) 장치, 이러한 장치를 사용하는 애플리케이션 및 이러한 장치의 액세스 및 사용을 용이하게 하는 미들웨어 를 위한 자연 사용자 인터페이스 및 유기적 사용자 인터페이스 의 상호 운용성을 인증하고 개선하는 데 중점을 둔 오픈 소스 소프트웨어 프로젝트입니다. - wikipedia
이렇다고 하는데 쉽게 말하면 그냥 kinect 카메라나 하드웨어들에 접근, 제어하게 해주는 API 입니다. 카메라로 받은 이미지나 깊이 데이터를 파이썬으로 보려고 알아보다가 찾았습니다.
생각보다 간단했다.
pip install openni
pip install opencv-python
pip install numpy
필요한 라이브러리 대충 설치하고 바로 챝지피티가 만들어준 코드 입력.
from openni import openni2
import numpy as np
import cv2
# OpenNI2 초기화
openni2.initialize() # OpenNI2 경로를 명시할 수 있습니다.
# 장치 열기
dev = openni2.Device.open_any()
print(dev.get_device_info())
# 깊이 스트림 시작
depth_stream = dev.create_depth_stream()
depth_stream.start()
# RGB 스트림 시작
rgb_stream = dev.create_color_stream()
rgb_stream.start()
# OpenCV 윈도우 이름 설정
cv2.namedWindow("Depth Stream", cv2.WINDOW_NORMAL)
cv2.namedWindow("RGB Stream", cv2.WINDOW_NORMAL)
# 실시간 영상 스트리밍 시작
try:
while True:
# 깊이 프레임 읽기
depth_frame = depth_stream.read_frame()
depth_data = depth_frame.get_buffer_as_uint16()
depth_image = np.frombuffer(depth_data, dtype=np.uint16).reshape(depth_frame.height, depth_frame.width)
# RGB 프레임 읽기
rgb_frame = rgb_stream.read_frame()
rgb_data = rgb_frame.get_buffer_as_uint8()
rgb_image = np.frombuffer(rgb_data, dtype=np.uint8).reshape(rgb_frame.height, rgb_frame.width, 3)
# 깊이 이미지를 8비트로 변환 (시각적으로 보기 좋게 만들기 위해)
depth_image_normalized = np.uint8(depth_image / 256) # 256으로 나누어 8비트로 변환
# 색상 맵 적용하여 더 선명하게 만들기
depth_colormap = cv2.applyColorMap(depth_image_normalized, cv2.COLORMAP_JET)
# RGB 이미지 표시
cv2.imshow("RGB Stream", rgb_image)
# 깊이 이미지 표시
cv2.imshow("Depth Stream", depth_colormap)
# 'q' 키를 눌러서 종료
if cv2.waitKey(1) & 0xFF == ord('q'):
break
finally:
# 스트림 종료 및 OpenNI2 해제
depth_stream.stop()
rgb_stream.stop()
openni2.unload()
cv2.destroyAllWindows()
이렇게 하면 rgb 값이랑 depth 값을 numpy 배열로 받을 수 있다.
근데 생각보다 depth 값이 분해능이... 좀... 맘에안드네
이후로 알고리즘 좀 만들어봐서 3d reconstruction 한번 진행해 보겠습니다.
진짜 오래 찾아본거에 비해 너무 간단해서 좀 어이없었던... 다들 삽질 하지 마시고 간단하게 파이썬으로 하세요. 이번에도 짧게 마치겠습니다.