Computer Vision/opencv(python)

[69] 7) 밀집 오티컬플로우

jwjwvison 2021. 4. 3. 17:38

 

  • 파네백 옵티컬 플로우 계산 코드
import sys
import numpy as np
import cv2

cap = cv2.VideoCapture("vtest.avi")

if not cap.isOpened():
    print('Camera open failed!')
    sys.exit()

ret, frame1 = cap.read()

if not ret:
    print('frame read failed!')
    sys.exit()

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

#hsv의 속성을 이용해서 모션 벡터의 방향성 정보를 색상으로 표현 0도 방향이면 빨간색, 180도 방향이면 파란색 형태로 보여줌
hsv=np.zeros_like(frame1)    #frame1과 같은 사이즈인 0으로 구성된 행렬을 반환
hsv[...,1]=255               #hsv값중 s값을 모두 255로 변환
 
while True:
    ret,frame2=cap.read()

    if not ret:
        print('frame read failed!')
        sys.exit()

    gray2=cv2.cvtColor(frame2,cv2.COLOR_BGR2GRAY)
    flow=cv2.calcOpticalFlowFarneback(gray1,gray2,None,0.5,3,13,3,5,1.1,0)   #많이 사용되는 값들임

    #flow(모션벡터)의 (h,w그리고 맨 마지막 성분인 x좌표, h,w 그리고 맨 마지막 성분인 y좌표)
    mag,ang=cv2.cartToPolar(flow[...,0],flow[...,1])    #cartToPolar 직각 좌표계를 극좌표계로 변환 x,y좌표를 주면 그 벡터의 크기와 방향정보를 return함
    hsv[...,0]=ang*180/np.pi/2                                 #hsv중 h값을 지정
    hsv[...,2]=cv2.normalize(mag,None,0,255,cv2.NORM_MINMAX)   #hsv중 v값을 지정 0,255 사이의 값으로 normalize

    bgr=cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)

    cv2.imshow('frame',frame2)
    cv2.imshow('flow',bgr)
    if cv2.waitKey(20)==27:
        break