소프트웨어 아키텍처
기본 파이프라인
[카메라 입력] [전처리] [물체 감지] [위치 추적] [출력]
│ │ │ │ │
Basler RGB 왜곡 보정 MediaPipe / 칼만 필터 좌표 데이터
+ D455 Depth 노이즈 제거 YOLOv8 헝가리안 매칭 시각화
색상 보정 커스텀 모델 3D 좌표 변환 제어 신호핵심 라이브러리
| 역할 | 라이브러리 | 비고 |
|---|---|---|
| RGB 카메라 제어 | pypylon | Basler 전용 |
| 깊이 카메라 제어 | pyrealsense2 / pyk4a | RealSense / Orbbec |
| 영상 처리 | OpenCV (cv2) | 범용 |
| 물체 감지 | MediaPipe / YOLOv8 (ultralytics) | 용도에 따라 선택 |
| 추적 알고리즘 | filterpy (칼만), scipy (헝가리안) | 다중 물체 추적 |
통합 코드 구조 예시
import cv2
import pyrealsense2 as rs
import numpy as np
class TableObjectTracker:
def __init__(self):
# 깊이 카메라 초기화
self.pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, 1280, 720, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 1920, 1080, rs.format.bgr8, 30)
self.pipeline.start(config)
def get_frames(self):
frames = self.pipeline.wait_for_frames()
depth = np.asanyarray(frames.get_depth_frame().get_data())
color = np.asanyarray(frames.get_color_frame().get_data())
return color, depth
def detect_objects(self, color_frame):
"""RGB 기반 물체 감지 (MediaPipe 또는 YOLOv8)"""
# 물체 바운딩박스 + 클래스 반환
pass
def get_3d_position(self, pixel_x, pixel_y, depth_frame):
"""픽셀 좌표 + 깊이 → 3D 월드 좌표 변환"""
depth_val = depth_frame[pixel_y, pixel_x]
# 카메라 내부 파라미터 기반 변환
# x_3d = (pixel_x - cx) * depth_val / fx
# y_3d = (pixel_y - cy) * depth_val / fy
# z_3d = depth_val
pass
def track(self):
"""메인 추적 루프"""
color, depth = self.get_frames()
objects = self.detect_objects(color)
for obj in objects:
pos_3d = self.get_3d_position(obj.cx, obj.cy, depth)
# 칼만 필터로 위치 스무딩
# 출력: 물체 ID, 3D 위치, 신뢰도환경 설정
# Python 가상 환경
python -m venv vision_env
source vision_env/bin/activate
# 필수 패키지
pip install pypylon opencv-python mediapipe numpy pyrealsense2
# 선택 패키지
pip install ultralytics # YOLOv8
pip install filterpy # 칼만 필터
pip install pyk4a # Orbbec Femto Bolt (K4A 호환)