Optical Flow

2025. 3. 4. 23:34SLAM/image processing

📌 Optical Flow (옵티컬 플로우)란?

**Optical Flow(옵티컬 플로우)**는 비디오 프레임(연속된 이미지) 간의 픽셀 이동을 추정하는 기법입니다. 쉽게 말해, 물체나 카메라가 움직일 때 픽셀이 어떻게 변하는지 계산하는 알고리즘입니다.

예를 들어,

  • 자율주행 차량: 도로에서 다른 차량과 보행자의 움직임을 감지.
  • 로봇 비전: 로봇이 주변 환경을 인식하고 이동할 수 있도록 함.
  • 비디오 안정화: 흔들리는 영상을 보정하기 위해 픽셀 움직임을 분석.

📌 Optical Flow의 핵심 개념

Optical Flow는 기본적으로 두 개의 연속된 이미지(프레임)를 비교하여 각 픽셀이 어디로 이동했는지 벡터를 계산하는 방법입니다.

1️⃣ Optical Flow의 가정

  1. 일관된 밝기(Consistency of Brightness)
    → 같은 물체는 이동해도 밝기 값이 변하지 않음.
  2. 작은 이동(Small Motion Assumption)
    → 연속된 프레임 간 픽셀의 움직임은 작다고 가정.
  3. 시간적 연속성(Temporal Coherence)
    → 인접한 픽셀은 비슷한 방향으로 움직인다.

📌 Optical Flow의 한계

  • 빠르게 움직이는 물체를 추적하기 어려움
  • 조명이 변하면 Optical Flow 계산이 어려울 수 있음
  • 배경과 물체를 구별하기 어려울 수 있음 (Occlusion 문제)

Optical Flow 추적 흐름 정리 🏎️

1. 프로그램 시작 및 입력 확인

  • 실행 시 이미지 폴더 경로프레임 개수를 인자로 받음.
  • 인자가 없으면 종료.

2. 이미지 파일 로드 및 정렬

  • 주어진 폴더에서 이미지 파일 목록을 수집.
  • 파일 이름을 정렬하고, 사용할 프레임 개수만큼 유지.

3. Optical Flow 계산을 위한 변수 초기화

  • cv::Mat img, img_next → 현재 프레임과 다음 프레임 저장.
  • std::vector<cv::Point2f> kpts, kpts_next → 특징점 저장.
  • cv::TermCriteria criteria → Optical Flow 알고리즘 종료 조건 설정.
  • std::vector<uchar> status, std::vector<float> err → Optical Flow 결과 저장.

4. 프레임 반복 처리 (num_frames - 1 회 반복)

(1) 현재 및 다음 프레임 읽기

  • cv::imread()를 사용하여 두 개의 연속된 프레임을 읽음.
  • img_next를 컬러 이미지(cv::cvtColor())로 변환하여 Optical Flow를 시각적으로 표시할 준비.

(2) 특징점 검출

  • 현재 프레임에서 특징점 개수가 50개 미만이면,
    cv::goodFeaturesToTrack()를 사용하여 새로운 특징점을 찾음.

(3) Optical Flow 계산

  • cv::calcOpticalFlowPyrLK()를 사용하여 다음 프레임에서 특징점 추적.

(4) Optical Flow 결과 시각화

  • cv::circle()을 사용하여 특징점 이동을 표시.
  • cv::imshow()로 Optical Flow를 화면에 출력.
  • cv::waitKey(33)를 사용하여 33ms 동안 대기하며 다음 프레임으로 전환.

(5) 유효하지 않은 특징점 필터링

  • Optical Flow가 실패했거나(status == 0),
    화면을 벗어난 특징점(x < 0 또는 y < 0)을 삭제.

(6) 다음 프레임을 위한 데이터 갱신

  • kpts = kpts_next → 현재 프레임 특징점을 업데이트.
  • kpts_next, status, err 초기화.

5. 모든 프레임 처리 완료 후 종료

  • Optical Flow를 프레임마다 적용한 후 프로그램 종료.

📌 핵심 정리

입력된 이미지 시퀀스에서 Optical Flow를 계산
Lucas-Kanade 방법(calcOpticalFlowPyrLK)을 사용하여 특징점 이동을 추적
Optical Flow를 시각적으로 표시
이전 프레임과 비교하여 특징점 관리 및 갱신

 

지금은 점으로 나와있지만 코드를 개선해서 선으로 연결되게 만들어 봐야겠다.

'SLAM > image processing' 카테고리의 다른 글

bow_matching  (0) 2025.03.04
ORB_feature_matching  (0) 2025.03.04