For this example, BigBuckBunny will be used to show off the computed motion vectors. Using scikit-video, we can produce one sequence showing motion vectors, additional statistical information, and the source video itself.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | import matplotlib.pyplot as plt
import numpy as np
import scipy.misc
import skvideo.datasets
try:
xrange
except NameError:
xrange = range
def getPlots(motionData):
motionMagnitude = np.sqrt(np.sum(motionData**2, axis=2))
fig = plt.figure()
plt.quiver(motionData[::-1, :, 0], motionData[::-1, :, 1])
fig.axes[0].get_xaxis().set_visible(False)
fig.axes[0].get_yaxis().set_visible(False)
plt.tight_layout()
fig.canvas.draw()
# Get the RGBA buffer from the figure
w,h = fig.canvas.get_width_height()
buf = np.fromstring(fig.canvas.tostring_argb(), dtype=np.uint8)
buf.shape = (h, w, 4)
quiver = buf[:, :, 1:]
plt.close()
fig = plt.figure()
plt.imshow(motionMagnitude, cmap="Greys_r")
fig.axes[0].get_xaxis().set_visible(False)
fig.axes[0].get_yaxis().set_visible(False)
plt.tight_layout()
fig.canvas.draw()
w,h = fig.canvas.get_width_height()
buf = np.fromstring(fig.canvas.tostring_argb(), dtype=np.uint8)
buf.shape = (h, w, 4)
magnitude = buf[:, :, 1:]
plt.close()
# histogram it
fig = plt.figure()
hist, bins = np.histogram(motionMagnitude, bins=10, range=(-0.5, 9.5))
center = (bins[1:] + bins[:-1])/2.0
plt.scatter(center, hist)
plt.xlabel("Motion magnitude")
plt.ylabel("Count")
plt.ylim([0, 14000])
plt.grid()
plt.tight_layout()
fig.canvas.draw()
w,h = fig.canvas.get_width_height()
buf = np.fromstring(fig.canvas.tostring_argb(), dtype=np.uint8)
buf.shape = (h, w, 4)
histogram = buf[:, :, 1:]
plt.close()
return quiver, magnitude, histogram
filename = skvideo.datasets.bigbuckbunny()
videodata = skvideo.io.vread(filename)
videometadata = skvideo.io.ffprobe(filename)
frame_rate = videometadata['video']['@avg_frame_rate']
T, M, N, C = videodata.shape
motionData = skvideo.motion.blockMotion(videodata)
writer = skvideo.io.FFmpegWriter("motion.mp4", inputdict={
"-r": frame_rate
})
for i in xrange(T-1):
a, b, c = getPlots(motionData[i])
frame = scipy.misc.imresize(videodata[i+1], (a.shape[0], a.shape[1], 3))
outputframe = np.zeros((frame.shape[0]*2, frame.shape[1]*2, 3), dtype=np.uint8)
outputframe[:frame.shape[0], :frame.shape[1]] = frame
outputframe[frame.shape[0]:, :frame.shape[1]] = a
outputframe[:frame.shape[0], frame.shape[1]:] = b
outputframe[frame.shape[0]:, frame.shape[1]:] = c
writer.writeFrame(outputframe)
writer.close()
|
The video output of the above code: