광학 흐름(Optical Flow)이란? AI가 영상 속 픽셀의 움직임을 추정하는 방법
TL;DR
광학 흐름(Optical Flow)은 두 프레임 사이에서 영상의 점이나 픽셀이 어디로 이동해 보이는지 나타내는 2차원 변위입니다. 영상 AI는 이 정보를 움직임 분석, 프레임 정렬과 추적의 단서로 씁니다. 선택한 점만 계산하는 희소 방식과 화면 전체를 계산하는 밀집 방식이 있으며, 물체의 실제 속도나 신원을 곧바로 알려 주지는 않습니다.
핵심 3줄 요약
- 핵심 1
두 장면 사이의 이동을 읽습니다. 각 벡터는 화면에서 가로·세로로 얼마나 이동했는지를 나타냅니다. - 핵심 2
점 추적과 픽셀 전체 추정을 구분합니다. Lucas-Kanade, Farneback, RAFT는 서로 다른 방식으로 흐름을 구합니다. - 핵심 3
보이는 움직임과 실제 운동은 다릅니다. 카메라 이동, 가림, 조명 변화와 좌표 단위를 함께 확인해야 합니다.
이 글에서 다룰 내용
- 광학 흐름의 한 문장 정의
- 공이 움직이는 두 프레임으로 보는 예시
- 희소·밀집 흐름과 대표 알고리즘의 원리
- 객체 추적·프레임 차분·깊이 추정과의 차이
- 영상 AI의 활용처와 결과 확인 순서
- 가림·카메라 이동·입력 크기의 주의점
- 자주 묻는 질문과 공식 출처
광학 흐름을 한 문장으로 정의하면 무엇인가요?
광학 흐름은 연속된 영상에서 물체나 카메라의 움직임 때문에 나타나는 영상 밝기 패턴의 겉보기 이동을 점별 2차원 벡터로 표현한 것입니다.
OpenCV는 첫 프레임의 점이 다음 프레임에서 어디로 움직였는지를 나타내는 벡터장으로 설명합니다. 벡터장은 화면의 여러 위치에 이동 방향과 크기를 담은 화살표가 놓여 있는 모습으로 이해하면 쉽습니다.
한국어로는 광류, 옵티컬 플로우라고도 부릅니다. 한 장의 사진에서 사물 이름을 찾는 작업과 달리 두 장면의 대응 관계를 다룹니다. 모델이 내놓은 이동량은 관측과 가정으로 구한 추정치이므로 가려진 위치까지 모두 정확하게 측정했다는 뜻은 아닙니다.
한 줄 정리: 광학 흐름은 영상의 점이 다음 장면에서 어디에 있을지 연결하는 움직임 지도입니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 탁자 위 공을 촬영한 영상을 살펴본다고 가정해 보겠습니다. 첫 프레임에서 공 표면의 무늬 한 점이 화면 좌표 (100, 80)에 있고, 다음 프레임에서는 (105, 78)에 있습니다. 화면의 오른쪽이 가로 양의 방향이고 아래쪽이 세로 양의 방향인 좌표계를 사용합니다.
이 점의 이동량은 가로 +5픽셀, 세로 -2픽셀입니다. 화살표는 오른쪽으로 5픽셀, 위쪽으로 2픽셀 향합니다. 이 숫자는 설명을 위한 가정 예시이며 실제 모델을 실행해 얻은 측정값은 아닙니다.
공 표면의 다른 점도 비슷하게 움직였다면 여러 화살표가 같은 방향을 가리킵니다. 탁자는 그대로 있고 카메라도 고정되어 있다면 배경의 이동량은 대체로 작을 것입니다. 반대로 카메라를 옆으로 움직이면 가만히 있는 탁자에서도 흐름이 나타납니다.
공이 다른 물체 뒤로 가려지면 첫 장면의 무늬를 다음 장면에서 직접 찾을 수 없습니다. 그 위치에 화살표가 그려졌더라도 주변 정보나 모델의 학습 결과로 보완한 추정일 수 있으므로, 보이는 구간과 가려진 구간을 따로 봐야 합니다.
쉬운 예시: 사진 두 장을 겹쳐 놓고 같은 무늬끼리 화살표로 잇는다고 생각하세요. 광학 흐름은 이 연결을 많은 점에 대해 계산합니다.
왜 AI에서 광학 흐름이 중요한가요?
정지 이미지에 없는 시간 정보를 더합니다
사진 한 장에서는 공이 놓여 있는지 날아가는지 구분하기 어려울 수 있습니다. 두 프레임의 흐름을 보면 화면 안에서 어느 부분이 어느 방향으로 이동하는지 읽을 단서가 생깁니다. 사물의 모양을 다루는 특징과 움직임 특징을 함께 사용하는 영상 분석에 도움이 됩니다.
다음 프레임의 대응 위치를 찾습니다
앞 장면에서 얻은 점이나 영역을 다음 장면에 연결할 때 흐름을 이용합니다. 프레임 정렬, 흔들림 보정, 추적 보조처럼 같은 내용을 시간축으로 대응시키는 문제에서 쓰입니다. 흐름만으로 대상의 이름이나 장기간의 ID가 완성되지는 않습니다.
전통 알고리즘과 딥러닝을 같은 출력으로 이해합니다
광학 흐름은 특정 AI 제품이나 신경망 하나의 이름이 아닙니다. 영상의 밝기 변화로 계산하는 방법과 학습된 특징으로 대응을 찾는 방법이 모두 있습니다. 출력이 점의 이동량이라는 공통점을 알면 도구마다 다른 입력 조건과 연산 비용을 비교하기 쉽습니다.
핵심 인사이트: 광학 흐름을 읽을 때는 무엇이 보이는지와 어디로 움직이는지를 나눠 생각하는 것이 좋습니다. 움직임 벡터에 사물의 의미가 자동으로 들어가지는 않습니다.
광학 흐름은 어떻게 작동하나요?
밝기와 주변 영역을 비교합니다
고전적인 설명은 같은 점의 밝기가 짧은 시간 동안 크게 바뀌지 않는다고 가정합니다. 첫 장면의 무늬가 다음 장면의 어느 위치와 비슷한지 찾습니다. 한 점만 보면 정보가 부족하므로 주변 점의 변화나 움직임이 매끄럽게 이어진다는 조건을 함께 이용합니다.
아무 무늬가 없는 벽은 어느 위치로 옮겨도 비슷해 보입니다. 길게 뻗은 선의 일부만 보아도 선을 따라 움직인 정도를 알아내기 어렵습니다. 모서리처럼 여러 방향으로 밝기가 바뀌는 점이 추적에 유리한 이유입니다.
희소 방식은 선택한 특징점을 따라갑니다
OpenCV의 calcOpticalFlowPyrLK는 피라미드를 사용하는 반복 Lucas-Kanade 방식으로 선택한 점들의 다음 위치를 구합니다. 주변의 작은 영역이 비슷하게 움직인다는 가정을 사용하며, 영상을 여러 크기로 보면서 원본에서 큰 이동도 다룰 수 있게 합니다.
반환값에는 다음 점의 좌표, 추정 성공 여부인 status, 오차 정보인 err가 있습니다. status가 0인 점을 성공한 점과 섞어 경로를 그리면 안 됩니다. status가 1이어도 실제로 같은 점을 찾았는지는 추가로 확인해야 합니다.
밀집 방식은 화면 전체의 흐름을 구합니다
Farneback 방식은 국소 영상 패턴을 다항식으로 근사해 프레임의 모든 위치에서 흐름을 계산합니다. OpenCV 함수는 가로·세로 이동량을 담은 2채널 배열을 반환합니다. 점 몇 개의 궤적보다 화면 전체의 움직임 분포가 필요할 때 살펴볼 수 있습니다.
RAFT 원 논문은 픽셀별 특징을 추출하고 두 영상의 픽셀 쌍 사이 상관 정보를 만든 뒤, 순환 구조로 흐름을 반복 갱신한다고 설명합니다. 학습 기반 밀집 추정의 한 예이며 광학 흐름 전체를 RAFT와 같은 뜻으로 부르지는 않습니다.
실전 팁: 희소·밀집은 계산할 위치의 범위이고, 전통 방식·딥러닝은 추정 방법의 구분입니다. 서로 다른 기준을 한 줄의 성능 순위로 섞지 마세요.
광학 흐름과 헷갈리는 용어는 무엇이 다른가요?
객체 추적과 광학 흐름의 차이
객체 추적은 사람이나 차량처럼 의미 있는 대상의 위치와 ID를 여러 프레임에 걸쳐 유지합니다. 광학 흐름은 점이나 픽셀의 짧은 구간 이동을 추정합니다. 추적기가 흐름을 단서로 사용할 수 있지만, 흐름 벡터만으로 같은 사람이라는 장기 연결이 보장되지는 않습니다.
프레임 차분과 광학 흐름의 차이
프레임 차분은 같은 화면 좌표의 밝기 차이를 계산해 어디가 변했는지 살펴봅니다. 광학 흐름은 이전 위치가 다음 장면의 어느 위치에 대응하는지 추정합니다. 변화가 큰 영역을 찾는 것과 이동 방향·크기를 구하는 것은 다른 질문입니다.
이미지 분할과 광학 흐름의 차이
이미지 분할은 각 픽셀에 배경, 사람, 도로 같은 라벨이나 대상별 마스크를 붙입니다. 밀집 흐름도 픽셀 단위 결과를 내지만 값은 클래스가 아닌 이동량입니다. 비슷한 흐름끼리 묶었다고 해서 반드시 하나의 물체가 되는 것은 아닙니다.
깊이 추정과 광학 흐름의 차이
깊이 추정은 카메라에서 장면까지의 거리 정보를 다룹니다. 광학 흐름은 화면 안에서의 2차원 이동을 다룹니다. 가까운 물체와 먼 물체가 같은 픽셀 수만큼 움직여 보일 수 있으므로, 흐름만으로 실제 이동 거리나 속도를 단정할 수 없습니다.
모션 벡터와 광학 흐름의 관계
모션 벡터는 움직임을 나타내는 벡터라는 넓은 표현입니다. 영상 압축에서는 블록 단위 예측에 쓰는 이동 벡터를 가리키기도 합니다. 압축 효율에 맞춰 고른 블록 대응이 모든 픽셀의 물리적 이동과 같다고 해석하면 안 됩니다.
비교 정리: 차분은 변화량, 분할은 영역 라벨, 깊이는 거리, 객체 추적은 대상의 연결을 다룹니다. 광학 흐름의 중심은 두 영상 사이 점별 대응과 변위입니다.
실전에서는 어디에 쓰이나요?
영상 흔들림을 보정할 때
배경의 점들이 어떻게 이동했는지 보고 카메라 움직임을 추정하는 단서로 사용합니다. 화면 전체를 같은 방향으로 옮기는 보정과 움직이는 물체의 국소 변형은 구분해야 합니다. OpenCV도 영상 안정화를 대표 활용처로 소개합니다.
점 추적과 영상 분석을 보조할 때
선택한 모서리나 관심 지점의 위치를 다음 장면으로 전달합니다. 매번 처음부터 찾는 과정에 움직임 예측을 더하는 방식입니다. 오래 이어 가면 오차가 쌓일 수 있어 특징점을 다시 찾거나 앞뒤 방향으로 대응을 확인하는 절차를 함께 둡니다.
프레임을 정렬하고 중간 장면을 만들 때
대응 위치를 이용하면 서로 다른 시점의 영상을 맞추거나 중간 시점의 픽셀 배치를 추정할 단서를 얻습니다. 다만 흐름 계산과 완성된 프레임 합성은 별도 단계입니다. 새로 드러난 배경과 가려진 영역은 단순 이동만으로 채워지지 않습니다.
영상 AI 결과를 해석할 때
모델이 물체의 모양에 반응하는지, 실제 움직임의 방향을 구분하는지 살펴볼 때 흐름 시각화를 참고합니다. Torchvision 예시는 예측한 가로·세로 변위를 색상 영상으로 바꿉니다. 색깔이 보기 좋게 이어진다는 사실만으로 정확도가 검증되지는 않습니다.
광학 흐름을 적용할 때 어떤 순서로 확인하나요?
1. 두 프레임의 순서와 시간 간격을 고정합니다
앞 프레임에서 뒤 프레임으로 가는 흐름인지 먼저 적습니다. 프레임 순서를 뒤집으면 기준 위치도 달라지므로 기존 벡터의 부호만 바꾼 결과와 항상 같지는 않습니다. 건너뛴 프레임 수와 실제 시간 간격을 기록해야 서로 다른 영상의 이동량을 비교할 수 있습니다.
2. 도구별 입력 조건을 맞춥니다
OpenCV Farneback 함수는 같은 크기와 자료형의 8비트 단일 채널 영상 두 장을 받습니다. Torchvision의 RAFT 예시는 RGB 입력에 사전 학습 가중치의 변환을 적용하고, 가로·세로 크기를 8의 배수로 맞춥니다. 두 도구에 같은 전처리를 무조건 적용하지 마세요.
3. 출력 축과 좌표 단위를 확인합니다
Torchvision 문서의 흐름은 한 사례 기준 (2, H, W) 형태이며 두 채널은 가로·세로 변위입니다. 값은 영상 크기로 정규화한 비율이 아니라 픽셀 단위입니다. OpenCV 배열의 채널 배치와 다를 수 있으므로 차원 순서를 바꾸는 코드도 확인합니다.
4. 원본 프레임 위에서 대응을 확인합니다
몇 개 지점을 골라 시작 위치와 예측 도착 위치를 함께 표시합니다. 입력을 축소했다면 원본으로 돌릴 때 흐름 지도의 크기뿐 아니라 가로·세로 변위의 배율도 맞춥니다. 시각화 색상만 비교하면 이 단위 오류를 놓치기 쉽습니다.
5. 정상 장면과 실패 장면을 함께 모읍니다
고정 카메라, 이동 카메라, 빠른 움직임, 가림, 어두운 장면을 나눠 살펴봅니다. 희소 방식은 성공한 점 수와 잘못 연결된 점을, 밀집 방식은 물체 경계와 가림 영역을 확인합니다. 성능 비교에는 같은 해상도와 실행 장비 조건을 사용합니다.
실전 체크: 프레임 순서·시간 간격, 입력 색상·크기, 출력 축·단위, 좌표 복원, 실패 구간을 함께 기록하세요. 그림과 원시 변위 배열을 따로 저장하면 재검토가 쉽습니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 카메라의 이동을 물체의 이동으로 오해하지 않습니다. 화면 전체가 움직여 보이는 원인이 카메라에 있을 수 있습니다. 관심 물체의 상대적인 움직임을 해석하려면 배경이나 카메라 운동을 함께 검토합니다.
둘째, 가림과 화면 밖 이동을 별도로 다룹니다. 대응점이 보이지 않는 위치에도 모델은 숫자를 반환할 수 있습니다. 추정값이 있다는 사실과 대응이 관측됐다는 사실을 구분하고, 의심 영역을 제외하거나 추가 검토 대상으로 표시합니다.
셋째, 조명 변화와 반복 무늬를 확인합니다. 그림자, 반사, 깜빡임은 밝기 유지 가정을 흔듭니다. 줄무늬처럼 비슷한 패턴이 반복되면 다른 위치를 같은 점으로 연결하기 쉽습니다. 고전 방식뿐 아니라 학습 기반 모델도 촬영 조건이 바뀌면 오류가 날 수 있습니다.
넷째, 픽셀 이동량을 실제 속도로 바로 바꾸지 않습니다. 실제 속도를 추정하려면 시간 간격뿐 아니라 거리 척도와 카메라 기하 정보가 필요합니다. 벡터가 길다는 이유만으로 실제 공간에서 더 빠른 물체라고 판단하지 마세요.
다섯째, 세밀함과 안정성의 절충을 봅니다. OpenCV 문서는 Farneback의 창 크기를 키우면 잡음에 강해지고 빠른 움직임을 찾는 데 도움이 될 수 있지만 흐름이 더 흐려진다고 설명합니다. 설정값을 크게 만드는 것이 항상 더 정확한 결과를 뜻하지는 않습니다.
주의: 사람의 행동이나 안전을 판단하는 시스템이라면 흐름 결과만으로 결론을 확정하지 않습니다. 원본 장면과 다른 센서·검토 절차를 함께 사용하고 영상의 접근·보관 범위도 제한하세요.
자주 묻는 질문
Q1. 광학 흐름은 반드시 딥러닝으로 계산하나요?
아닙니다. Lucas-Kanade와 Farneback 같은 전통 알고리즘도 있습니다. RAFT는 학습 기반 방법의 한 예입니다. 정확도와 실행 속도뿐 아니라 필요한 출력 범위와 입력 조건을 보고 선택합니다.
Q2. 희소 흐름보다 밀집 흐름이 항상 좋은가요?
아닙니다. 몇 개 특징점의 다음 위치만 필요하면 희소 방식이 목적에 맞을 수 있습니다. 밀집 방식은 화면 전체의 변위를 내지만, 모든 위치를 계산한다는 말이 모든 위치를 정확하게 안다는 뜻은 아닙니다.
Q3. 색상으로 그린 흐름 지도는 어떻게 읽나요?
색과 움직임 방향의 대응은 시각화 함수의 규칙을 따릅니다. 크기를 명도나 다른 방식으로 표현하기도 합니다. 서로 다른 도구의 색상을 바로 비교하지 말고 범례, 정규화 방식과 원래 벡터 값을 확인하세요.
Q4. 정지한 카메라 영상에서는 배경 흐름이 항상 0인가요?
이상적인 정지 장면이라면 작게 나오는 것이 자연스럽지만, 조명 변화·센서 잡음·압축 흔적 때문에 추정값이 생길 수 있습니다. 작은 값이 보일 때 곧바로 실제 물체가 움직였다고 해석하지 않습니다.
Q5. 광학 흐름으로 물체의 이름이나 신원을 알 수 있나요?
흐름 자체는 점의 이동량입니다. 사물 이름을 붙이는 탐지·분류나 같은 대상을 이어 붙이는 추적은 별도의 작업입니다. 영상 시스템에서 함께 사용할 수 있지만 역할과 오류 기준은 나눠 확인해야 합니다.
출처
마무리
광학 흐름은 두 프레임 사이에서 점이나 픽셀이 어느 방향으로 얼마나 이동해 보이는지 추정하는 기술입니다. 희소 흐름은 선택한 점을, 밀집 흐름은 화면 전체를 다루며 객체 추적·이미지 분할·깊이 추정과는 답하려는 질문이 다릅니다.
감자나라ai님이 영상 AI 문서에서 흐름을 만난다면 입력 두 장의 순서, 벡터의 좌표와 단위, 카메라 이동과 가림부터 확인해 보세요. 화려한 색상 지도보다 중요한 것은 그 화살표가 원본 영상의 같은 위치를 제대로 연결하는지입니다.
