Opencv 3.1 Tutorial Optical flow (calcOpticalFlowFarneback)


My favourite

  • Opencv tutorial people detection
  • Head people cascade download
  • Opencv tutorial optical flow
  • Opencv Video stabilization
  • Opencv car dataset download
  • Opencv tutorial Transparent mask
  • Opencv videowriter
  • Opencv FFMPEG
  • Opencv Canny edge and hough lines
  • Farneback Optical flow

    Opencv simple C++ tutorial and code to achieve optical flow and farneback optical flow of moving object in opencv video. Lets checkt the  video example and the achieved result on my blog. Working and well describe code is included. 

    optical flow Farneback

    Optical Flow Farneback parameters remarks

    You need 2 images at least to calculate optical flow, the previous image (prevgray) and current image (img). 
    !! The previous image must be initialized first !! 
    Both images have to be gray scale. 

    Result is computer in flowUmat which has same size as inputs but format is CV_32FC2

    0.4- image pyramid or simple image scale
    1 is number of pyramid layers. 1 mean that flow is calculated only from previous image. 
    12 is win size.. Flow is computed over the window larger value is more robust to the noise. 
    2 mean number of iteration of algorithm
    8 is polynomial degree expansion recommended value are 5 - 7
    1.2 standard deviation used to smooth used derivatives recommended values from 1.1 - 1,5

    calcOpticalFlowFarneback(prevgray, img, flowUmat, 0.4, 1, 12, 2, 8, 1.2, 0);

    calcOpticalFlowFarneback Example

    Mine gopro video is captured at Old Town Square in Prague.. 

    Opencv Tutorial C++ code

    #include "opencv2\highgui.hpp"
    #include "opencv2\imgproc.hpp"
    #include "opencv2\objdetect\objdetect.hpp"
    #include "opencv2/video/tracking.hpp"
    #include <vector>
    #include <stdio.h>
    #include <Windows.h>
    #include <iostream>

    using namespace cv;
    using namespace std;

    int main(int argc, const char** argv)

    // add your file name
    VideoCapture cap("yourFile.mp4");

    Mat flow, frame;
             // some faster than mat image container
    UMat  flowUmat, prevgray;

    for (;;)

    bool Is = cap.grab();
    if (Is == false) {
                             // if video capture failed
    cout << "Video Capture Fail" << endl;
    else {

    Mat img;
    Mat original;

    // capture frame from video file
    cap.retrieve(img, CV_CAP_OPENNI_BGR_IMAGE);
    resize(img, img, Size(640, 480));

    // save original for later

    // just make current frame gray
    cvtColor(img, img, COLOR_BGR2GRAY);

    // For all optical flow you need a sequence of images.. Or at least 2 of them. Previous                           //and current frame
    //if there is no current frame
    // go to this part and fill previous frame
    //else {
    // img.copyTo(prevgray);
    //   }
    // if previous frame is not empty.. There is a picture of previous frame. Do some                                  //optical flow alg. 

    if (prevgray.empty() == false ) {

    // calculate optical flow
    calcOpticalFlowFarneback(prevgray, img, flowUmat, 0.4, 1, 12, 2, 8, 1.2, 0);
    // copy Umat container to standard Mat

    // By y += 5, x += 5 you can specify the grid 
    for (int y = 0; y < original.rows; y += 5) {
    for (int x = 0; x < original.cols; x += 5)
    // get the flow from y, x position * 10 for better visibility
            const Point2f flowatxy =<Point2f>(y, x) * 10;
    // draw line at flow direction
    line(original, Point(x, y), Point(cvRound(x + flowatxy.x), cvRound(y + flowatxy.y)), Scalar(255,0,0));
                                                             // draw initial point
    circle(original, Point(x, y), 1, Scalar(0, 0, 0), -1);


                                     // draw the results
    namedWindow("prew", WINDOW_AUTOSIZE);
    imshow("prew", original);
                                     // fill previous image again

    else {

                                     // fill previous image in case prevgray.empty() == true

    int key1 = waitKey(20);



    1. Hi Vladimir, I try to run your code, however it reported undeclared identifier: UMat. Is it only for GPU? Could you please inform how to run your code if I only have CPU? Thanks.

      1. Hello. :)

        I am just a guest.

        GMat is defined in the OpenCV 3.1.

      2. Thank you Juhong! Is UMat only for GPU?

      3. Umat is basically for OpenCL/ CPU whereas GpuMat is meant for allocating device memory in Nvidia-based GPUs.

    2. can you please tell how to calculate velocity using optical flow

      1. yes find out the centroid and fps. do perspective projection and calculate speed

      2. hello, can you share code for velocity calculation using optical flow....thanks

    3. I do agree with all the ideas you have presented in your post. They’re really convincing and will certainly work. Still, the posts are very short for newbies. Could you please extend them a little from next time?..Keep this great work..
      GMAT Training in Chennai
      GMAT Coaching Chennai
      Best GMAT Coaching Classes in Chennai


    4. Thanks for sharing the very useful info about clanguage and please keep updating........

    5. Nice tutorial. Thanks for sharing the valuable info about c Training. it’s really helpful. Who want to learn c language this blog most helpful. Keep sharing on updated tutorials…..



    Follow by Email

    Powered by Blogger.