Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Visualize Optical Flow with color model

I've implemented a dense optical flow algorithm and I want to visualize it with following color model

enter image description here

(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

enter image description here

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

like image 629
Daiver Avatar asked Mar 06 '15 12:03

Daiver


People also ask

What is optical flow image?

Optical flow is a technique used to describe image motion. It is usually applied to a series of images that have a small time step between them, for example, video frames. Optical flow calculates a velocity for points within the images, and provides an estimation of where points could be in the next image sequence.

What is optical flow analysis?

Optical flow, or motion estimation, is a fundamental method of calculating the motion of image intensities, which may be ascribed to the motion of objects in the scene. Optical flow is an extremely fundamental concept that is utilized in one form or another in most video-processing algorithms.

What is Farneback optical flow?

Description. opticFlow = opticalFlowFarneback returns an optical flow object that you can use to estimate the direction and speed of the moving objects in a video. The optical flow is estimated using the Farneback method.


2 Answers

Code from OpenCV's tutorial:

import cv2
import numpy as np

# Use Hue, Saturation, Value colour model 
hsv = np.zeros(im1.shape, dtype=np.uint8)
hsv[..., 1] = 255

mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1])
hsv[..., 0] = ang * 180 / np.pi / 2
hsv[..., 2] = cv2.normalize(mag, None, 0, 255, cv2.NORM_MINMAX)
bgr = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
cv2.imshow("colored flow", bgr)
cv2.waitKey(0)
cv2.destroyAllWindows()

enter image description here

like image 140
Mastergalen Avatar answered Sep 20 '22 19:09

Mastergalen


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 using merge or mixChannels.

  • Apply cvtColor with the flag CV_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

like image 42
Tobias Senst Avatar answered Sep 20 '22 19:09

Tobias Senst