[파이썬] opencv-python 물체의 동작 및 자세 인식

물체의 동작 및 자세 인식은 컴퓨터 비전 분야에서 매우 중요한 주제입니다. 이를 위해 OpenCV-Python 라이브러리를 사용할 수 있습니다. OpenCV-Python은 오픈 소스 컴퓨터 비전 라이브러리로, 이미지 및 비디오 처리, 객체 인식, 물체 추적 등 다양한 작업을 수행할 수 있습니다.

물체 인식하기

먼저, 물체 인식을 위해 OpenCV-Python의 cv2 모듈을 import 해야 합니다. 다음은 이미지에서 얼굴을 인식하는 간단한 예제 코드입니다.

import cv2

# 이미지 파일 로드
image = cv2.imread("face.jpg")

# 이미지를 흑백으로 변환
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 얼굴 인식 모델 로드
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

# 얼굴 인식
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

# 얼굴 주변에 사각형 그리기
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)

# 결과 출력
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

위의 코드는 얼굴을 인식하고, 인식된 얼굴 주변에 사각형을 그려주는 예제입니다. 실제 얼굴 인식을 위해서는 얼굴 인식 모델 파일(haarcascade_frontalface_default.xml)을 미리 다운로드해야 합니다.

자세 추적하기

물체의 자세를 추적하는 것은 물체 인식보다 더 복잡한 작업입니다. OpenCV-Python에서는 이를 위해 cv2.solvePnP() 함수를 제공합니다. 다음은 3D 객체의 자세를 추적하는 예제 코드입니다.

import cv2
import numpy as np

# 카메라 매트릭스 및 왜곡 계수 설정
camera_matrix = np.array([[1000, 0, 320],
                          [0, 1000, 240],
                          [0, 0, 1]], dtype=np.float64)
dist_coeffs = np.array([0.1, 0.01, 0.001, 0], dtype=np.float64)

# 3D 포인트 설정
object_points = np.array([[0, 0, 0],
                          [0, -30, 0],
                          [30, 0, 0],
                          [-30, 0, 0],
                          [0, 30, 0]], dtype=np.float64)

# 이미지 포인트 설정
image_points = np.array([[346, 334],
                         [360, 442],
                         [487, 336],
                         [219, 345],
                         [345, 169]], dtype=np.float64)

# 자세 추적
success, rotation_vector, translation_vector = cv2.solvePnP(object_points, image_points, camera_matrix, dist_coeffs)

if success:
    # 자세 추출
    rvec_matrix = cv2.Rodrigues(rotation_vector)[0]
    proj_matrix = np.hstack((rvec_matrix, translation_vector))
    euler_angles = cv2.decomposeProjectionMatrix(proj_matrix)[6]

    # 결과 출력
    print("Rotation Vector:\n", rotation_vector)
    print("Translation Vector:\n", translation_vector)
    print("Euler Angles:\n", euler_angles)
else:
    print("Pose estimation failed.")

위의 코드는 solvePnP() 함수를 사용하여 3D 객체의 자세를 추적하는 예제입니다. 입력으로는 3D 객체의 3D 포인트와 이미지에서의 2D 포인트를 사용합니다. 자세는 회전 벡터와 변환 벡터로 제공되며, 이를 이용하여 Euler 각도를 계산할 수 있습니다.

OpenCV-Python을 사용하여 물체의 동작 및 자세를 인식하는 방법에 대해 알아보았습니다. 이러한 기술은 영상처리 및 로봇공학 등 다양한 분야에서 응용될 수 있습니다. OpenCV-Python의 다양한 함수와 기능을 활용하여 더 정교한 동작 및 자세 인식 시스템을 개발해보세요.