【RealSense】AR 마커의 위치 취득

RealSense의 RGB 이미지에서 AR 마커를 인식하고 해당 깊이 정보에서 해당 위치의 3D 정보를 가져옵니다.

rsAruco.py

# coding: utf-8
import pyrealsense2 as rs
import numpy as np
import cv2

aruco = cv2.aruco
dictionary = aruco.getPredefinedDictionary(aruco.DICT_4X4_50)

pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)

print("Start streaming")
pipeline.start(config)

cv2.namedWindow('RealsenseImage', cv2.WINDOW_AUTOSIZE)

while True:

    frames = pipeline.wait_for_frames()
    depth_frame = frames.get_depth_frame()
    color_frame = frames.get_color_frame()

    color_intrinsics = color_frame.profile.as_video_stream_profile().intrinsics

    depth_image = np.asanyarray(depth_frame.get_data())
    color_image = np.asanyarray(color_frame.get_data())

    gray_image = cv2.cvtColor(color_image, cv2.COLOR_RGB2BGR)
    corners, ids, rejectedImgPoints = aruco.detectMarkers(gray_image, dictionary)

    if len(corners)!=0:
        point = np.average(corners[0][0], axis=0)
        depth = depth_frame.get_distance(point[0], point[1])
        point = np.append(point,depth)
        if depth!=0:
            x=point[0]
            y=point[1]
            z=point[2]
            x,y,z=rs.rs2_deproject_pixel_to_point(color_intrinsics, [x, y], z)
            print("point:",x,y,z)

    aruco.drawDetectedMarkers(color_image, corners, ids, (0,255,0))

    depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET)
    images = np.hstack((color_image, depth_colormap))

    cv2.imshow("RealsenseImage",images)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break


아래 사진과 같이 AR 마커의 3차원 정보가 출력됩니다.


프로그램 해설



ArCuo 라이브러리를 사용하여 Ar 마커를 인식하는 방법은 다음과 같습니다.
먼저 다음과 같이 aruco의 인스턴스를 생성합니다.
aruco = cv2.aruco

그런 다음 getPredefinedDictionary 함수를 사용하여 dictionnary 변수에 저장합니다. aruco.DICT_4x4_50 에서 50개의 마커가 생성됩니다.
dictionary = aruco.getPredefinedDictionary(aruco.DICT_4X4_50)

그리고는 dictionnary 와 그레이 이미지를 넣으면 검출해 줍니다.
corners, ids, rejectedImgPoints = aruco.detectMarkers(gray_image, dictionary)

좋은 웹페이지 즐겨찾기