#!/usr/bin/env python import numpy as np import cv2 import video def draw_flow(img, flow, step=16): h, w = img.shape[:2] y, x = np.mgrid[step/2:h:step, step/2:w:step].reshape(2,-1) fx, fy = flow[y,x].T lines = np.vstack([x, y, x+fx, y+fy]).T.reshape(-1, 2, 2) lines = np.int32(lines + 0.5) vis = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) cv2.polylines(vis, lines, 0, (0, 0, 0)) # for (x1, y1), (x2, y2) in lines: # cv2.circle(vis, (x1, y1), 1, (0, 255, 0), -1) return vis def draw_hsv(flow): h, w = flow.shape[:2] fx, fy = flow[:,:,0], flow[:,:,1] ang = np.arctan2(fy, fx) + np.pi v = np.sqrt(fx*fx+fy*fy) # hsv = np.zeros((h, w, 3), np.uint8) # hsv[...,0] = ang*(180/np.pi/2) # hsv[...,1] = 255 # hsv[...,2] = np.minimum(v*4, 255) # bgr = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR) f = np.zeros((h, w, 3), np.uint8) f[...,0] = 0 #np.minimum(v*10, 255) f[...,1] = 0 f[...,2] = 255- np.minimum(v**2, 255) #ang*(180/np.pi/2) bgr = cv2.cvtColor(f, cv2.COLOR_HSV2BGR) return bgr width, height = 640, 480 cam = video.create_capture("0:size="+str(width)+"x"+str(height)) while True: ret, prev = cam.read() prevgray = cv2.cvtColor(prev, cv2.COLOR_BGR2GRAY) if prevgray.shape == (height, width): break while True: ret, img = cam.read() gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) print prevgray.shape, gray.shape flow = cv2.calcOpticalFlowFarneback(prevgray, gray, 0.5, 3, 15, 3, 5, 1.2, 0) prevgray = gray # cv2.imshow('flow', draw_flow(gray, flow)) cv2.imshow('flow', draw_hsv(flow)) ch = 0xFF & cv2.waitKey(5) if ch == 27: break cv2.destroyAllWindows()