Optical Flow
2025. 3. 4. 23:34ㆍSLAM/image processing
📌 Optical Flow (옵티컬 플로우)란?
**Optical Flow(옵티컬 플로우)**는 비디오 프레임(연속된 이미지) 간의 픽셀 이동을 추정하는 기법입니다. 쉽게 말해, 물체나 카메라가 움직일 때 픽셀이 어떻게 변하는지 계산하는 알고리즘입니다.
예를 들어,
- 자율주행 차량: 도로에서 다른 차량과 보행자의 움직임을 감지.
- 로봇 비전: 로봇이 주변 환경을 인식하고 이동할 수 있도록 함.
- 비디오 안정화: 흔들리는 영상을 보정하기 위해 픽셀 움직임을 분석.
📌 Optical Flow의 핵심 개념
Optical Flow는 기본적으로 두 개의 연속된 이미지(프레임)를 비교하여 각 픽셀이 어디로 이동했는지 벡터를 계산하는 방법입니다.
1️⃣ Optical Flow의 가정
- 일관된 밝기(Consistency of Brightness)
→ 같은 물체는 이동해도 밝기 값이 변하지 않음. - 작은 이동(Small Motion Assumption)
→ 연속된 프레임 간 픽셀의 움직임은 작다고 가정. - 시간적 연속성(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 |