title: How to calculate difference between 2 incoming frames from camera(open CV)
body: <p>I wanted to detect movement by calculating difference between two frames incoming from the camera and display this difference on the phones screen. I have to override <code>OnCameraFrame()</code> method so i did:</p>
  
  <pre><code>  @Override
      public Mat onCameraFrame(Mat inputFrame) {
          inputFrame.copyTo(current);
          Core.absdiff(current, previous, difference);
          current.copyTo(previous);
          return difference;
      }
  </code></pre>
  
  <p>but unfortunately app is crashing and I get:</p>
  
  <pre><code>06-13 18:17:30.000: E/cv::error()(13097): OpenCV Error: Sizes of input arguments do not match (The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array') in void cv::arithm_op(cv::InputArray, cv::InputArray, cv::OutputArray, cv::InputArray, int, void (**)(const uchar*, size_t, const uchar*, size_t, uchar*, size_t, cv::Size, void*), bool, void*), file /home/reports/ci/slave/50-SDK/opencv/modules/core/src/arithm.cpp, line 1277
  06-13 18:17:30.005: W/dalvikvm(13097): threadid=11: thread exiting with uncaught exception (group=0x411df2a0)
  06-13 18:17:30.005: E/AndroidRuntime(13097): FATAL EXCEPTION: Thread-983
  06-13 18:17:30.005: E/AndroidRuntime(13097): CvException [org.opencv.core.CvException: /home/reports/ci/slave/50-SDK/opencv/modules/core/src/arithm.cpp:1277: error: (-209) The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array' in function void cv::arithm_op(cv::InputArray, cv::InputArray, cv::OutputArray, cv::InputArray, int, void (**)(const uchar*, size_t, const uchar*, size_t, uchar*, size_t, cv::Size, void*), bool, void*)
  </code></pre>
  
  <p>The full class code is:</p>
  
  <pre><code>   package com.example.szpieg2;
  
  import org.opencv.android.BaseLoaderCallback;
  import org.opencv.android.CameraBridgeViewBase;
  import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener;
  import org.opencv.android.LoaderCallbackInterface;
  import org.opencv.android.OpenCVLoader;
  import org.opencv.core.Core;
  import org.opencv.core.CvType;
  import org.opencv.core.Mat;
  import org.opencv.core.Range;
  import org.opencv.core.Size;
  
  import android.app.Activity;
  import android.content.pm.ActivityInfo;
  import android.os.Bundle;
  import android.util.Log;
  import android.view.Menu;
  import android.view.Window;
  import android.view.WindowManager;
  
  public class TrackActivity extends Activity implements CvCameraViewListener {
      private Mat current;
      private CameraBridgeViewBase cameraView;
      private Mat previous;
      private Mat difference;//difference between previous and current
      private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
          @Override
          public void onManagerConnected(int status) {
              switch (status) {
              case LoaderCallbackInterface.SUCCESS: {
                  Log.i("Co sie dzieje?", "OpenCV loaded successfully");
                  cameraView.enableView();
                  // cameraView.setOnTouchListener(ColorBlobDetectionActivity.this);
              }
                  break;
              default: {
                  super.onManagerConnected(status);
              }
                  break;
              }
          }
      };
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          requestWindowFeature(Window.FEATURE_NO_TITLE);
          getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                  WindowManager.LayoutParams.FLAG_FULLSCREEN);
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
          setContentView(R.layout.activity_track);
          getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
          cameraView = (CameraBridgeViewBase) findViewById(R.id.surface_view);
          cameraView.setCvCameraViewListener(this);
      }
  
      // --------Activity Actions---------
      @Override
      public void onPause() {
          if (cameraView != null)
              cameraView.disableView();
          super.onPause();
      }
  
      @Override
      public void onResume() {
          super.onResume();
          OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this,
                  mLoaderCallback);
      }
  
      public void onDestroy() {
          super.onDestroy();
          if (cameraView != null)
              cameraView.disableView();
      }
  
      // --------/Activity Actions/---------
  
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
          // Inflate the menu; this adds items to the action bar if it is present.
          getMenuInflater().inflate(R.menu.activity_track, menu);
          return true;
      }
  
      // --------listener method implementation-------------
      @Override
      public void onCameraViewStarted(int width, int height) {
          previous = new Mat(width, height, CvType.CV_64FC4);
          current = new Mat(width, height, CvType.CV_64FC4);
          difference = new Mat(width, height, CvType.CV_64FC4);
      }
  
      @Override
      public void onCameraViewStopped() {
          current.release();
  
      }
  
      @Override
      public Mat onCameraFrame(Mat inputFrame) {
          inputFrame.copyTo(current);
          Core.absdiff(current, previous, difference);
          current.copyTo(previous);
          return difference;
      }
  
  }
  </code></pre>
  
  <p><strong>EDIT</strong>
  I have installed the openCV on the device usign openCV manager. All the tutorials added to OpenCV are working on that  device. The device is Samsung Galaxy Note 2. The library project is using is <code>OpenCV 2.4.3</code> and this one has to stay.</p>
  
  <p><strong>[/EDIT]</strong></p>