Optical Flow

λ°•μ˜μš±Β·2025λ…„ 4μ›” 21일
post-thumbnail

πŸ“ŒOptical Flow?

  • 광학흐름을 Optical Flow라고 ν•˜λ©° νšλ“ν•œ 이미지 λ°μ΄ν„°μ—μ„œμ˜ μ—°μ†λœ ν”„λ ˆμž„μœΌλ‘œ ν‘œν˜„λ˜λŠ” 물체의 μ›€μ§μŒ ν˜Ήμ€ 카메라 μ›€μ§μž„μ„ λ‚˜νƒ€λ‚΄λŠ” νŒ¨ν„΄μ΄λΌ 말할 수 μžˆλ‹€.

μ‘μš© λΆ„μ•Ό

πŸŽ₯ Structure From Motion

  • μ›€μ§μ΄λŠ” μΉ΄λ©”λΌλ‘œ 3D ꡬ쑰λ₯Ό λ³΅μ›ν•˜λŠ” 기술이며 2Dμ˜μƒμ„ κ°€μ§€κ³  3D 곡간 정보λ₯Ό μΆ”μ •ν•˜λŠ” κΈ°μˆ μž„.

πŸŽ₯ Video Compression

  • μ€‘λ³΅λœ μ •λ³΄λŠ” 버리고 ν•„μš”ν•œ μ •λ³΄λ§Œ 남겨 μ˜μƒ μš©λŸ‰μ„ μ€„μ΄λŠ” 기술이며 ν”„λ ˆμž„ μ‚¬μ΄μ˜ λ³€ν™”λ§Œ κΈ°λ‘ν•΄μ„œ μ˜μƒ νŒŒμΌμ„ μž‘κ²Œ λ§Œλ“œλŠ” κΈ°μˆ μž„.

πŸŽ₯ Video Stabilization

  • 흔듀린 μ˜μƒμ„ λΆ€λ“œλŸ½κ²Œ λ³΄μ •ν•˜λŠ” 기술이며 카메라가 흔듀렸을 λ•Œ μ˜μƒμ„ μžλ™μœΌλ‘œ μ•ˆμ •μ μœΌλ‘œ λ³΄μ •ν•˜λŠ” κΈ°μˆ μž„.

πŸ“Œ Lucas-Kanade Optical Flow 방법

πŸ“– κ°œλ… μš”μ•½
Lucas-Kanade 방법은 Optical Flowλ₯Ό μΆ”μ •ν•˜λŠ” λŒ€ν‘œμ μΈ 기법 쀑 ν•˜λ‚˜λ‘œ,
μ΄μ›ƒν•œ 픽셀듀은 λΉ„μŠ·ν•œ μ›€μ§μž„μ„ κ°€μ§„λ‹€"λŠ” 가정을 기반으둜 ν•œλ‹€.

μΆ”μ ν•˜λ €λŠ” ν•œ 점 μ£Όλ³€μ˜ 3Γ—3 패치(총 9개 ν”½μ…€)λ₯Ό μ‚¬μš©ν•˜μ—¬,
이 9개 픽셀이 λͺ¨λ‘ λ™μΌν•œ μ›€μ§μž„μ„ κ°€μ§„λ‹€κ³  κ°€μ •ν•œλ‹€.

각 픽셀에 λŒ€ν•΄ μ˜μƒμ˜ 기울기 (Ix, Iy)와 μ‹œκ°„μ— λ”°λ₯Έ 밝기 λ³€ν™”λŸ‰ (It)을 κ³„μ‚°ν•˜λ©΄,
2개의 λ―Έμ§€μˆ˜(vx, vy)에 λŒ€ν•΄ 9개의 방정식이 생긴닀.

μ΄λŠ” κ³Όμž‰ κ²°μ •(over-determined) μ‹œμŠ€ν…œμ΄λ―€λ‘œ,
μ΅œμ†Œμ œκ³±λ²•(Least Squares Method)을 μ‚¬μš©ν•˜μ—¬ κ°€μž₯ μ ν•©ν•œ ν•΄λ₯Ό κ΅¬ν•œλ‹€.

Lucas-Kanade 방법은 μž‘μ€ μ›€μ§μž„μ—λŠ” κ°•ν•˜μ§€λ§Œ, 큰 μ›€μ§μž„μ΄ μžˆλŠ” κ²½μš°μ—λŠ” 잘 μž‘λ™ν•˜μ§€ μ•ŠλŠ”λ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” ν”ΌλΌλ―Έλ“œ(Pyramid)λ₯Ό μ‚¬μš©ν•œλ‹€. μ΄λŠ” μƒμœ„ ν”ΌλΌλ―Έλ“œμ—μ„œλŠ” 큰 움직이도 μž‘μ•„λ³΄μ΄κΈ° λ•Œλ¬Έμ—, Lucas-Kanadeλ₯Ό μ μš©ν•˜κΈ° 더 μ‰¬μ›Œμ§„λ‹€.
ν•˜μœ„ λ‹¨κ³„λ‘œ λ‚΄λ €κ°€λ©΄ 점점 더 μ •λ°€ν•œ Optical Flowλ₯Ό μΆ”μ •ν•œλ‹€.

πŸ’»python κ΅¬ν˜„

nextPts, status, err = cv2.calcOpticalFlowPyrLK(prev_img, next_img, prev_pts, None, **params)
  • prev_img, next_img: 이전/λ‹€μŒ ν”„λ ˆμž„
  • prev_pts: μΆ”μ ν•˜κ³  싢은 포인트 (예: Shi-Tomasi μ½”λ„ˆ)
  • nextPts: μΆ”μ λœ 포인트 μœ„μΉ˜
  • status: 좔적 성곡 μ—¬λΆ€ (1: 성곡, 0: μ‹€νŒ¨)

optical Flow_νŠΉμ§•μ  좔적.py

  • ν•¨μˆ˜ 정리

cap은 cv.videoCapture()둜 μ—΄μ–΄λ‘” μ˜μƒ 객체둜 ν•œ ν”„λ ˆμž„μ„ cap.read()λŠ” ν•œ ν”„λ ˆμž„μ„ μ½μ–΄μ˜΄
goodFeaturesToTrack()λŠ” μ˜μƒμ—μ„œ 좔적할 만 ν•œ 쒋은 μ½”λ„ˆμ λ“€μ„ μžλ™μœΌλ‘œ μ°Ύμ•„μ€Œ

optical Flow_μ‹œκ°ν™”.py

0개의 λŒ“κΈ€