본문 바로가기

Computer Vision & AI

Python 단일 카메라 Depth Estimation (2편): OpenCV를 활용한 뎁스 노이즈 및 떨림 보정 실무

1. 끝없이 요동치는 뎁스 맵, 어떻게 제어할 것인가

지난 1편에서는 라이다(LiDAR) 센서를 대체하기 위해 단일 카메라 기반의 딥러닝 Depth Estimation 모델을 산업 현장에 도입했다가 겪었던 치명적인 한계들을 다루었습니다. 조명의 변화나 그림자를 실제 웅덩이로 오인하는 문제도 심각했지만, 현장에서 실시간으로 시스템을 띄웠을 때 마주한 가장 큰 골칫거리는 바로 '플리커링(Flickering)' 현상이었습니다.

동일한 위치에서 카메라와 피사체가 1mm도 움직이지 않았음에도 불구하고, 화면에 출력되는 뎁스 맵(Depth Map)의 픽셀 값은 프레임이 바뀔 때마다 미친 듯이 깜빡이고 널뛰기를 반복했습니다. 이런 불안정한 날것의 데이터(Raw Data)를 로봇 팔의 거리 제어 알고리즘이나 물체 인식 트리거(Trigger)에 그대로 연결했다가는 대형 사고로 이어질 것이 뻔했습니다. 결국 무거운 AI 모델을 다시 뜯어고치는 대신, 파이썬(Python)과 영상 처리의 근본인 OpenCV를 활용하여 뎁스 데이터를 부드럽게 깎고 다듬는 소프트웨어 후처리(Post-processing) 파이프라인을 구축하기로 결심했습니다.

그림1 노이즈가 심한 원본과 필터링된 결과 비교

2. 공간적 노이즈 해결: 엣지를 살리는 바이래터럴 필터(Bilateral Filter)

가장 먼저 손을 댄 부분은 한 프레임(정지 이미지) 내에서 자글자글하게 끓어오르는 공간적 노이즈(Spatial Noise)를 제거하는 것이었습니다. 일반적으로 노이즈를 없앨 때 가장 쉽게 떠올리는 가우시안 블러(Gaussian Blur)를 적용해 보았으나, 치명적인 부작용이 있었습니다. 노이즈는 사라졌지만 물체의 경계선(Edge)까지 함께 뭉개져 버려서, 어디서부터가 설비이고 어디서부터가 허공인지 구분할 수 없게 된 것입니다.

이 딜레마를 해결하기 위해 OpenCV의 cv2.bilateralFilter를 도입했습니다. 바이래터럴 필터는 픽셀 간의 '거리'뿐만 아니라 '색상(여기서는 뎁스 픽셀 값) 차이'까지 함께 고려하는 고급 필터입니다. 즉, 평평한 바닥이나 벽면 같은 비슷한 뎁스 값을 가진 영역은 강하게 문질러서 노이즈를 없애주고, 물체와 배경이 분리되는 급격한 뎁스 차이(경계선)가 있는 곳은 블러를 적용하지 않고 칼같이 살려두는 마법 같은 역할을 해주었습니다. 이 필터 하나만으로도 뎁스 맵의 가독성이 비약적으로 상승했습니다.

3. 시간적 떨림(Flickering) 해결: 지수 이동 평균(EMA)의 도입

공간적 노이즈를 잡았음에도, 시간이 흐름에 따라 영상이 깜빡거리는 프레임 간의 떨림(Temporal Noise)은 여전히 남아있었습니다. 카메라 센서의 미세한 화이트 밸런스 변화나 조명의 미세한 깜빡임(플리커)이 AI 연산 결과에 매번 다른 영향을 주고 있었기 때문입니다.

이를 해결하기 위해 주식 차트 분석이나 센서 데이터 안정화에 주로 쓰이는 '지수 이동 평균(EMA, Exponential Moving Average)' 알고리즘을 파이썬 코드로 구현하여 영상 프레임 단위에 적용했습니다. 직전 프레임의 뎁스 데이터 결과물에 높은 가중치를 두고, 새 프레임의 데이터를 부드럽게 합성하는 방식입니다. 이렇게 시계열 스무딩(Smoothing) 처리를 거치자, 뎁스 맵은 마치 카메라 렌즈에 짐벌을 단 것처럼 묵직하고 부드럽게 변했습니다. 프레임 간의 급격한 튀는 값이 사라지니, 상위 제어 로직에서도 안정적으로 거리를 판별할 수 있게 되었습니다.

시간적 스무딩(EMA) 효과를 보여주는 시각 자료
그림2 시간적 스무딩(EMA) 효과를 보여주는 시각 자료

4. 결론: 진정한 엔지니어링은 '후처리'에서 완성된다

오픈소스 AI 모델을 다운로드하여 실행하는 것은 이제 누구나 할 수 있는 일입니다. 하지만 랩실의 깔끔한 결과물을 살아 숨 쉬는 거친 산업 현장에 적용할 때 발생하는 수많은 노이즈를 어떻게든 쓸모 있는 데이터로 가공해 내는 것, 그것이 현업 비전 엔지니어의 진짜 역할임을 다시 한번 실감했습니다.

단일 카메라 기반 Depth Estimation은 한계가 명확하지만, 이처럼 바이래터럴 필터와 EMA 같은 고전적인 영상 처리 기법을 적절히 융합하면 충분히 현장에서 써먹을 수 있는 강력한 무기가 됩니다. 다만, 이 복잡한 후처리 연산까지 덧붙이다 보니 시스템의 처리 속도(FPS)가 떨어지는 새로운 병목 현상이 발생했습니다. 다음 마지막 3편에서는 이 파이프라인을 실시간으로 쾌적하게 돌리기 위해 파이썬 코드를 최적화했던 과정에 대해 다루어 보겠습니다.