title: Calculating optical flow in opencv android
body: <p>I am a beginner in OpenCV and trying to calculate opticalflow using OpenCV's <code>calcOpticalFlowFarneback</code> method.</p>
  
  <p>Please have a look at my implementation:</p>
  
  <pre><code>package org.opencv.samples.tutorial1;
  
  import org.opencv.android.BaseLoaderCallback;
  import org.opencv.android.CameraBridgeViewBase;
  import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
  import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;
  import org.opencv.android.LoaderCallbackInterface;
  import org.opencv.android.OpenCVLoader;
  import org.opencv.core.CvType;
  import org.opencv.core.Mat;
  import org.opencv.core.MatOfPoint2f;
  import org.opencv.video.Video;
  
  import android.app.Activity;
  import android.os.Bundle;
  import android.util.Log;
  import android.view.Menu;
  import android.view.MenuItem;
  import android.view.SurfaceView;
  import android.view.WindowManager;
  import android.widget.Toast;
  
  public class Tutorial1Activity extends Activity implements CvCameraViewListener2 {
      private static final String TAG = "OCVSample::Activity";
  
      private CameraBridgeViewBase mOpenCvCameraView;
      private boolean              mIsJavaCamera = true;
      private MenuItem             mItemSwitchCamera = null;
  
      private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
          @Override
          public void onManagerConnected(int status) {
              switch (status) {
                  case LoaderCallbackInterface.SUCCESS:
                  {
                      Log.i(TAG, "OpenCV loaded successfully");
                      mOpenCvCameraView.enableView();
                  } break;
                  default:
                  {
                      super.onManagerConnected(status);
                  } break;
              }
          }
      };
  
      public Tutorial1Activity() {
          Log.i(TAG, "Instantiated new " + this.getClass());
      }
  
      /** Called when the activity is first created. */
      @Override
      public void onCreate(Bundle savedInstanceState) {
          Log.i(TAG, "called onCreate");
          super.onCreate(savedInstanceState);
          getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  
          setContentView(R.layout.tutorial1_surface_view);
  
          if (mIsJavaCamera)
              mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial1_activity_java_surface_view);
          else
              mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial1_activity_native_surface_view);
  
          mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
  
          mOpenCvCameraView.setCvCameraViewListener(this);
      }
  
      @Override
      public void onPause()
      {
          super.onPause();
          if (mOpenCvCameraView != null)
              mOpenCvCameraView.disableView();
      }
  
      @Override
      public void onResume()
      {
          super.onResume();
          OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);
      }
  
      public void onDestroy() {
          super.onDestroy();
          if (mOpenCvCameraView != null)
              mOpenCvCameraView.disableView();
      }
  
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
          Log.i(TAG, "called onCreateOptionsMenu");
          mItemSwitchCamera = menu.add("Toggle Native/Java camera");
          return true;
      }
  
      @Override
      public boolean onOptionsItemSelected(MenuItem item) {
          String toastMesage = new String();
          Log.i(TAG, "called onOptionsItemSelected; selected item: " + item);
  
          if (item == mItemSwitchCamera) {
              mOpenCvCameraView.setVisibility(SurfaceView.GONE);
              mIsJavaCamera = !mIsJavaCamera;
  
              if (mIsJavaCamera) {
                  mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial1_activity_java_surface_view);
                  toastMesage = "Java Camera";
              } else {
                  mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial1_activity_native_surface_view);
                  toastMesage = "Native Camera";
              }
  
              mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
              mOpenCvCameraView.setCvCameraViewListener(this);
              mOpenCvCameraView.enableView();
              Toast toast = Toast.makeText(this, toastMesage, Toast.LENGTH_LONG);
              toast.show();
          }
  
          return true;
      }
  
  
  
      public void onCameraViewStarted(int width, int height) {
      }
  
      public void onCameraViewStopped() {
  
      }
  
      Mat first_frame = null;
      Mat second_frame = null;
      boolean dumped = false;
      //this function is called on each frame.
      public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
  
  
  
          // I wanted to calculate the optical flow like this.
          first_frame = second_frame;
          if(first_frame == null || second_frame == null){
              second_frame = inputFrame.rgba();
              return inputFrame.rgba();
          }
  
          //now we have two consecutive frame.
          Mat flow = new Mat(inputFrame.rgba().size(), CvType.CV_8UC1);
  
          Video.calcOpticalFlowFarneback(first_frame, second_frame, flow,0.5,1, 1, 1, 7,
                  1.5,1);
          System.out.println("flow = "+flow.dump());
  
          return inputFrame.rgba();
      }
  }
  </code></pre>
  
  <p>It's giving error because may be I am pssing wrong value in the parameters. Can anybody please help?</p>