Ask Your Question

Revision history [back]

How to apply optical flow to initial image?

I found old posts online as well as a code sample in the master branch of opencv here https://github.com/opencv/opencv/blob/master/samples/python/opt_flow.py#L50-L56

I will copy/paste the code for future reference:

 def warp_flow(img, flow):
    h, w = flow.shape[:2]
    flow = -flow
    flow[:,:,0] += np.arange(w)
    flow[:,:,1] += np.arange(h)[:,np.newaxis]
    res = cv.remap(img, flow, None, cv.INTER_LINEAR)
    return res

Say I have two grayscale images im1 and im2 with values between 0 and 1. I computed the flow with:

flow = cv2.calcOpticalFlowFarneback(im1g, im2g, None, 0.5, 3, 15, 3, 5, 1.2, 0)

I understood that the function warp_flow expects the original images with values in [0,255] and the computed flow computed on grayscale as input, so I called it with:

prediction = warp_flow(origim1, flow)

However, when I write the truth origim2 and the prediction to disk with cv2.imwrite, it turns out that the prediction is pretty much like origim1. So the flow is not modifying the input image.

I appreciate if you can explain what is happening or if you can provide a working example that I could try with my images. Is the warp_flow function up-to-date?

Thank you in advance,