Computer Vision/opencv(python)

[68] 6) 루카스-카나데 옵티컬플로우

jwjwvison 2021. 4. 3. 17:31
  • 옵티컬플로우 (Optical flow)란?
    • 연속하는 두 프레임(영상)에서 카메라 또는 객체의 움직임에 의해 나타나는 객체의 이동 정보 패턴

 

  • 옵티컬플로우 계산

 

  • OpenCV 옵티컬플로우 계산 함수

 

  • 루카스-카나데 옵티컬플로우 예제
import sys
import numpy as np
import cv2


src1 = cv2.imread('frame1.jpg')
src2 = cv2.imread('frame2.jpg')

if src1 is None or src2 is None:
    print('Image load failed!')
    sys.exit()

gray1=cv2.cvtColor(src1,cv2.COLOR_BGR2GRAY)

pt1=cv2.goodFeaturesToTrack(gray1,50,0.01,10)     # 코너 점을 찾는 함수(grayscale 영상만 입력으로 받을수 있다) https://076923.github.io/posts/Python-opencv-23/
pt2,status,err=cv2.calcOpticalFlowPyrLK(src1,src2,pt1,None)    

dst=cv2.addWeighted(src1,0.5,src2,0.5,0)

for i in range(pt2.shape[0]):
    if status[i,0]==0:         # 잘못 찾은것은 무시한다
        continue
    
    cv2.circle(dst,tuple(pt1[i,0]),4,(0,255,255),2,cv2.LINE_AA)
    cv2.circle(dst,tuple(pt2[i,0]),4,(0,0,255),2,cv2.LINE_AA)
    cv2.arrowedLine(dst,tuple(pt1[i,0]),tuple(pt2[i,0]),(0,255,0),2)

cv2.imshow('dst',dst)
cv2.waitKey()