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