[ Visualize Optical Flow with color model ]
I've implemented a dense optical flow algorithm and I want to visualize it with following color model
(color denotes direction of flow at some point, intensity denotes length of displacement vector)
I've implemented a dirty version of the visualization
def visualizeFlow(u, v):
colorModel = cv2.imread('../colormodel.png')
colorModelCenter = (colorModel.shape[0]/2, colorModel.shape[1]/2)
res = np.zeros((u.shape[0], u.shape[1], 3), dtype=np.uint8)
mag = np.max(np.sqrt(u**2 + v**2))
if mag == 0:
return res, colorModel
for i in xrange(res.shape[0]):
for j in xrange(res.shape[1]):
res[i, j] = colorModel[
colorModelCenter[0] + (v[i, j]/mag*colorModelCenter[0]),
colorModelCenter[1] + (u[i, j]/mag*colorModelCenter[1])
]
return res, colorModel
It produce nice in general case pictures but it really slow
So my question is can anyone help me make this visualization faster? If somebody knows a better way to visualize dense flow it may be cool
Answer 1
If you use function provided by opencv your code will run faster. The optical flow visualization works as follow:
- Transform u and v motion components matrices into polar coordinate. Applying
cartToPolar
function (x array = u array, y array = v array) will get you angle and magnitude matrices of your motion vectors.
The final colour visualization can than be found by an inverse HSV to RGB transformation, where the angle matrice corresponde to the Hue (H) channel and the magnitude to the saturation (S) the value (V) is set to maxima. ( In your example the value and saturation channels are swapped).
Merge the magnitude, angle and a matrice filled with 1 to a
CV_32FC3
channel matric usingmerge
ormixChannels
.Apply
cvtColor
with the flagCV_HSV2BGR
. Note angle matric is in degrees and magnitude has to be rescaled to fit i [0,1] which can be done by dividing it by the maximun of the magnitude using e.g.MinMaxLoc