You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.7 KiB
Python
65 lines
1.7 KiB
Python
8 years ago
|
#!/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()
|