2017-04-11 20 views
0

두 프레임 사이의 모든 픽셀의 광학 유속 벡터를 추출하고 싶습니다. 나는 다음과 같은 OpenCV의 기능을 사용하고 있습니다 :OpenCV에서 픽셀의 속도 벡터를 추출하는 방법 calcOpticalFlowFarneback - Python 버전)

flow = calcOpticalFlowFarneback(Previous_Gray, Current_Gray, Optical_Flow, 0.5, 3, 15, 3, 5, 1.2, 0); 

Previous_Gray = previous frame 
Current_Gray = current frame 

나는 flow의 형식과 방법을 추출하는 방법이 무엇인지 알고 싶습니다.

도움을 주셔서 감사합니다. :-)

P. 내 질문은이 질문과 거의 동일하다는 것을 압니다. How to extract velocity vectors of a pixels from calcOpticalFlowFarneback. 그러나 파이썬으로 코딩 중이며 파이썬으로 솔루션을 원합니다.

답변

1

다음은 Farneback 메서드로 모든 프레임의 옵티컬 플로우를 계산하기위한 파이썬 코드 조각입니다. 아래에 주어진 것은 완전한 작업 코드는 아니지만 (웹 주위에 이것에 대한 예제가 충분히 있습니다), 흐름 계산 방법을 보여줍니다.

#use this params 
farneback_params={ 
     'pyr_scale':0.5, 
     'levels':3, 
     'winsize':15, 
     'iterations': 3, 
     'poly_n': 5, 
     'poly_sigma':1.2, 
     'flags':cv2.OPTFLOW_USE_INITIAL_FLOW 
    } 

#do initializations 
while True: 
    #for every frame, 
    #get current_frame_gray 
    flow = cv2.calcOpticalFlowFarneback(prev_frame_gray, current_frame_gray, flow, **farneback_params) 
    prev_frame_gray = current_frame_gray 

각 프레임이 H x W 크기라고 가정하면 다음 어설 션이 적용됩니다. 아래 Farneback 방법에 대한 문서를 살펴보면

assert(flow.shape == (H, W, 2)) 
assert(flow.dtype == numpy.float32) 

,
http://docs.opencv.org/3.0-beta/modules/video/doc/motion_analysis_and_object_tracking.html 다음 문은

for r in range(H): 
    for c in range(W): 
     prev_frame_gray[r,c] corresponds to current_frame_gray[r + flow[r,c, 1], c+ flow[r,c,0]] 

그래서 이전 프레임 (prev_frame_gray)의 각 픽셀의 속도 성분이

입니다 보유
flow[r,c,0] in x- direction (columns) 
flow[r,c,1] in y- direction (rows) 

이 코드에서는 다양한 코드 예제를 사용하여 흐름을 극형으로 쉽게 표현할 수 있습니다 (크기 다음 간단한 명령

mag, ang = cv2.cartToPolar(flow[...,0], flow[...,1]) 

탄창과 중앙 형상의 것 (H, W) 및 DTYPE numpy.float32 의해, 각도). ang 결과는 0-2pi 범위의 각도를 제공합니다.