
RGB·Depth 카메라 좌표가 왜 안 맞을까?|BRIO·Orbbec 사람 거리 매칭 실전
RGB 카메라에서 검출한 사람의 중심 픽셀을 Depth 카메라의 같은 좌표에서 읽으면 정확한 거리가 나올까요? Logitech BRIO와 Orbbec Depth Camera처럼 서로 다른 장치를 사용하는 로봇에서는 그렇지 않습니다. 두 카메라는 위치·화각·렌즈·해상도·시간축이 모두 다르기 때문에 RGB와 Depth의 매칭은 단순한 이미지 크기 변환이 아니라 3차원 좌표변환 문제입니다.
- RGB: Logitech BRIO 4K UVC
- Depth: Orbbec Depth Camera
- RGB 용도: YOLO 사람 검출·얼굴인식
- Depth 용도: 사람과 로봇 사이 실제 거리 확인
- 기능 검증 단계에서 사용한 Height Ratio Anchor: 1m 0.897 / 2m 0.738 / 3m 0.608 / 4m 0.459
- 아래 Anchor 값은 현재 장착조건에서 직접 관측한 값이며, 정식 Extrinsic Calibration 결과와 동일한 의미가 아닙니다.
- RGB의 (x, y)와 Depth의 (x, y)를 그대로 대응시키면 안 됩니다.
- 해상도 비율 변환만으로는 Parallax와 FOV 차이를 보정할 수 없습니다.
- 정확한 매칭에는 각 카메라의 Intrinsic과 두 카메라 사이 Extrinsic R, t가 필요합니다.
- 사람 거리는 단일 픽셀보다 ROI 안의 유효 Depth Median이 안정적입니다.
- 최종 평가는 Pixel Error보다 1m·2m·3m·4m에서의 실제 거리 오차로 해야 합니다.
1. 같은 픽셀이 같은 공간을 뜻하지 않는 이유
두 카메라가 서로 다른 위치에 장착되면 동일한 물체를 바라보더라도 영상 속 위치가 달라집니다. 사람의 두 눈이 서로 다른 위치에서 장면을 보는 것과 같은 원리이며, 이 차이를 시차(Parallax)라고 합니다. 특히 물체가 카메라에 가까울수록 오차가 커집니다.
BRIO RGB
↓ YOLO person detection
Bounding Box Center (x, y)
↓
Orbbec Depth의 같은 (x, y)를 그대로 읽기 ← 정확하지 않음
2. 해상도 비율만 맞추는 방식의 한계
예를 들어 RGB 1280×960, Depth 640×480이라면 좌표를 절반으로 줄이는 방식이 떠오를 수 있습니다. 하지만 이것은 이미지 리사이즈일 뿐 카메라 기하를 해결하지 못합니다.
depth_x = rgb_x * 640 / 1280
depth_y = rgb_y * 480 / 960
두 카메라의 중심 위치, 광축, FOV, 렌즈 왜곡이 모두 같지 않기 때문에 이 방식은 가까운 거리나 화면 가장자리에서 오차가 커질 수 있습니다.
3. Intrinsic과 Extrinsic이 필요한 이유
각 카메라에는 초점거리와 주점(principal point)을 나타내는 내부파라미터가 있습니다. Depth 카메라의 한 픽셀을 3D 점으로 복원한 뒤, 두 카메라 사이 Rotation과 Translation으로 RGB 좌표계로 옮기고 다시 RGB 화면에 투영해야 합니다.
# Depth pixel → 3D
X = (u - cx) * Z / fx
Y = (v - cy) * Z / fy
Z = depth
# Depth frame → RGB frame
P_rgb = R @ P_depth + t
4. OpenCV로 정식 Calibration을 한다면
- Checkerboard 또는 ChArUco Board를 두 카메라에서 동시에 촬영
- 각 카메라 Intrinsic과 Lens Distortion 계산
- 두 카메라의 대응점을 이용해 stereoCalibrate()로 R, t 계산
- Depth Point를 RGB Frame으로 투영해 Aligned Depth Map 생성
- 1m·2m·3m·4m에서 실제 거리와 비교해 오차를 정량화
cv2.calibrateCamera(...)
cv2.stereoCalibrate(...)
cv2.stereoRectify(...)
cv2.projectPoints(...)
cv2.undistort(...)
5. 사람 거리 측정은 단일 픽셀보다 ROI Median
YOLO Bounding Box 중앙의 Depth 한 점만 읽으면 Invalid Pixel, 옷 반사, 배경 픽셀 선택 같은 문제가 생길 수 있습니다. 작은 ROI에서 유효 깊이값만 모아 Median을 사용하는 편이 안정적입니다.
roi = depth[center_y-h:center_y+h,
center_x-w:center_x+w]
valid = roi[(roi > MIN_DEPTH) & (roi < MAX_DEPTH)]
if valid.size:
distance = np.median(valid)
6. 실제 기능 검증에 사용한 Height Ratio Anchor
| 실제 거리 | 관측 Height Ratio | 의미 |
|---|---|---|
| 1m | 0.897 | 매우 가까운 상태 |
| 2m | 0.738 | 접근 중간 구간 |
| 3m | 0.608 | 중거리 |
| 4m | 0.459 | 원거리 |
이 값은 현재 로봇의 카메라 높이·장착각·사람 자세에서 얻은 기능검증용 Anchor입니다. 사람의 키나 자세, 카메라 설치조건이 바뀌면 값도 달라질 수 있으므로 일반화된 거리 공식으로 사용하면 안 됩니다.
7. 최종적으로 볼 값은 거리 오차
정식 Calibration을 적용할 때는 단순히 RGB와 Depth의 픽셀이 겹쳐 보이는지만 확인하지 말고, 실제 사람 거리 측정 오차를 기록해야 합니다. 중앙뿐 아니라 좌·우 가장자리에서도 오차를 따로 확인하는 것이 좋습니다.
- 확인됨: BRIO + Orbbec 별도 카메라 구조, 실제 Height Ratio Anchor, 동일 픽셀 가정의 한계
- 아직 정량 검증 전: BRIO↔Orbbec 정식 Extrinsic Calibration 후 1~4m 거리오차와 매칭 성공률
- 후속 실험 결과가 확보되면 이 글에 실제 오차표를 추가하는 것이 가장 가치가 큽니다.
자료 확인
- OpenCV Camera Calibration and 3D Reconstruction
- NEXTScience LAB 실제 BRIO + Orbbec 테스트 데이터
'AI·컴퓨터 비전' 카테고리의 다른 글
| OpenCV 웹캠 추천 전 확인할 7가지|Jetson 컴퓨터 비전용 USB 카메라 선택법 (0) | 2026.09.27 |
|---|---|
| OpenCV 5.0 마이그레이션|4.x에서 무엇이 깨질까? Jetson·Python 실무 체크포인트 (0) | 2026.09.22 |
| OpenCV 5 DNN, GPU 썼는데 왜 느릴까?…ENGINE_NEW는 아직 CPU 전용이다 (0) | 2026.09.21 |
| 합성데이터(Synthetic Data), 불량 사진 8장으로 AP 95%…AI 검사는 ‘가짜 불량’을 어떻게 배우나 (0) | 2026.09.18 |
댓글