Android Open Source - Operation-Valkyrie Camera Preview View C V






From Project

Back to project page Operation-Valkyrie.

License

The source code is released under:

Terms and conditions Preamble: This Agreement, signed on Jun 10, 2012 [hereinafter: Effective Date] governs the relationship between the Enduser, a private person, (hereinafter: Licensee) and Paul N...

If you think the Android project Operation-Valkyrie listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package valkyrie.ui.preview;
//from   w  w  w .j a v  a2  s.  c  o  m
import java.util.List;

import org.opencv.android.Utils;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.highgui.Highgui;
import org.opencv.highgui.VideoCapture;

import valkyrie.filter.IFilter;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class CameraPreviewViewCV extends SurfaceView implements SurfaceHolder.Callback, Runnable {
  private static final String TAG = "CameraPreviewViewCV";

  private SurfaceHolder holder;
  private VideoCapture camera;

  private IFilter filter;
  private boolean isFilterDisplayed = false;
  private boolean isLocked = false;

  public CameraPreviewViewCV(Context context) {
    super(context);
    this.holder = getHolder();
    this.holder.addCallback(this);

    Log.i(TAG, "Instantiated new " + this.getClass());
  }

  public CameraPreviewViewCV(Context context, AttributeSet attr) {
    super(context, attr);
    this.holder = getHolder();
    this.holder.addCallback(this);

    Log.i(TAG, "Instantiated new " + this.getClass());
  }

  public void setFilter(IFilter filter) {
    this.filter = filter;
  }

  public boolean isFilterDisplayed() {
    if (this.isFilterDisplayed == true) {
      return true;
    }

    return false;
  }

  public void toggleFilter(boolean display) {
    if (this.isFilterDisplayed) {
      this.isFilterDisplayed = false;
    } else {
      this.isFilterDisplayed = true;
    }
  }

  public Bitmap takePicture() {
    if(this.camera == null) {
      return null;
    }
    
    Bitmap bitmap = null;
    Mat pictureMat = new Mat();
    
    synchronized (this) {
      if (this.filter != null) {
        this.camera.retrieve(pictureMat, this.filter.getFilterCaptureFormat());
        bitmap = this.filter.manipulatePreviewImage(pictureMat);
      } else {
        this.camera.retrieve(pictureMat, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);
        bitmap = Bitmap.createBitmap(pictureMat.cols(), pictureMat.rows(), Bitmap.Config.ARGB_8888);
        Utils.matToBitmap(pictureMat, bitmap);
      }
  
      Log.d(TAG, "Called take picture, width: " + bitmap.getWidth() + " height: " + bitmap.getHeight());
      
      this.isLocked = true;
    }

    return bitmap;
  }
  
  public void resume() {
    this.isLocked = false;
  }
  
  public void lock() {
    this.isLocked = true;
  }
  
  public boolean isLocked() {
    return this.isLocked;
  }

  public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
    Log.i(TAG, "surfaceCreated");
    synchronized (this) {
      if (this.camera != null && this.camera.isOpened()) {
        List<Size> sizes = this.camera.getSupportedPreviewSizes();

        Size optimalPreviewSize = this.getOptimalPreviewSize(sizes, width, height);

        this.camera.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, optimalPreviewSize.width);
        this.camera.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, optimalPreviewSize.height);
      }
    }
  }

  public void surfaceCreated(SurfaceHolder holder) {
    Log.i(TAG, "surfaceCreated");
    this.camera = new VideoCapture(Highgui.CV_CAP_ANDROID);
    if (this.camera.isOpened()) {
      (new Thread(this)).start();
    } else {
      this.camera.release();
      this.camera = null;
      Log.e(TAG, "Failed to open native camera");
    }
  }

  public void surfaceDestroyed(SurfaceHolder holder) {
    Log.i(TAG, "surfaceDestroyed");
    if (this.camera != null) {
      synchronized (this) {
        this.camera.release();
        this.camera = null;
      }
    }
  }

  protected Bitmap processFrame(VideoCapture capture) {
    Mat bitmapMat = new Mat();

    Bitmap bitmap = null;

    if (this.filter != null && this.isFilterDisplayed) {
      capture.retrieve(bitmapMat, this.filter.getFilterCaptureFormat());
      bitmap = this.filter.manipulatePreviewImage(bitmapMat);
    } else {
      capture.retrieve(bitmapMat, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);
      bitmap = Bitmap.createBitmap(bitmapMat.cols(), bitmapMat.rows(), Bitmap.Config.ARGB_8888);
      Utils.matToBitmap(bitmapMat, bitmap);
    }

    return bitmap;
  }

  public void run() {
    Log.i(TAG, "Starting processing thread");
    while (true) {
      Bitmap bitmap = null;

      synchronized (this) {
        if (this.camera == null) {
          Log.e(TAG, "camera == null");
          break;
        }

        if (!this.camera.grab()) {
          Log.e(TAG, "camera.grab() failed");
          break;
        }

        bitmap = processFrame(this.camera);
      }

      if (bitmap != null) {
        Canvas canvas = this.holder.lockCanvas();
        if (canvas != null) {
          canvas.drawBitmap(bitmap, (canvas.getWidth() - bitmap.getWidth()) / 2,
              (canvas.getHeight() - bitmap.getHeight()) / 2, null);
          this.holder.unlockCanvasAndPost(canvas);
        }

        bitmap.recycle();
      }
    }

    Log.i(TAG, "Finishing processing thread");
  }

  private Size getOptimalPreviewSize(List<Size> sizes, int surfaceWidth, int surfaceHeight) {
    int frameWidth = surfaceWidth;
    int frameHeight = surfaceHeight;

    double minDiff = Double.MAX_VALUE;
    for (Size size : sizes) {
      if (Math.abs(size.height - surfaceHeight) < minDiff) {
        frameWidth = (int) size.width;
        frameHeight = (int) size.height;
        minDiff = Math.abs(size.height - surfaceHeight);
      }
    }

    Log.i(TAG, "Set optimal preview size, width: " + frameWidth + " height: " + frameHeight);

    return new Size(frameWidth, frameHeight);
  }

  private Size getHighestPreviewSize(List<Size> sizes) {
    Size maxSize = new Size(Double.MIN_VALUE, Double.MIN_VALUE);

    for (Size size : sizes) {
      if (maxSize.width < size.width) {
        maxSize = size;
      }
    }

    return maxSize;
  }
}




Java Source Code List

org.opencv.android.Utils.java
org.opencv.calib3d.Calib3d.java
org.opencv.calib3d.StereoBM.java
org.opencv.calib3d.StereoSGBM.java
org.opencv.core.Algorithm.java
org.opencv.core.Core.java
org.opencv.core.CvException.java
org.opencv.core.CvType.java
org.opencv.core.MatOfByte.java
org.opencv.core.MatOfDMatch.java
org.opencv.core.MatOfDouble.java
org.opencv.core.MatOfFloat4.java
org.opencv.core.MatOfFloat6.java
org.opencv.core.MatOfFloat.java
org.opencv.core.MatOfInt4.java
org.opencv.core.MatOfInt.java
org.opencv.core.MatOfKeyPoint.java
org.opencv.core.MatOfPoint2f.java
org.opencv.core.MatOfPoint3.java
org.opencv.core.MatOfPoint3f.java
org.opencv.core.MatOfPoint.java
org.opencv.core.MatOfRect.java
org.opencv.core.Mat.java
org.opencv.core.Point3.java
org.opencv.core.Point.java
org.opencv.core.Range.java
org.opencv.core.Rect.java
org.opencv.core.RotatedRect.java
org.opencv.core.Scalar.java
org.opencv.core.Size.java
org.opencv.core.TermCriteria.java
org.opencv.features2d.DMatch.java
org.opencv.features2d.DescriptorExtractor.java
org.opencv.features2d.DescriptorMatcher.java
org.opencv.features2d.FeatureDetector.java
org.opencv.features2d.Features2d.java
org.opencv.features2d.GenericDescriptorMatcher.java
org.opencv.features2d.KeyPoint.java
org.opencv.highgui.Highgui.java
org.opencv.highgui.VideoCapture.java
org.opencv.imgproc.Imgproc.java
org.opencv.imgproc.Moments.java
org.opencv.imgproc.Subdiv2D.java
org.opencv.ml.CvANN_MLP_TrainParams.java
org.opencv.ml.CvANN_MLP.java
org.opencv.ml.CvBoostParams.java
org.opencv.ml.CvBoost.java
org.opencv.ml.CvDTreeParams.java
org.opencv.ml.CvDTree.java
org.opencv.ml.CvERTrees.java
org.opencv.ml.CvGBTreesParams.java
org.opencv.ml.CvGBTrees.java
org.opencv.ml.CvKNearest.java
org.opencv.ml.CvNormalBayesClassifier.java
org.opencv.ml.CvParamGrid.java
org.opencv.ml.CvRTParams.java
org.opencv.ml.CvRTrees.java
org.opencv.ml.CvSVMParams.java
org.opencv.ml.CvSVM.java
org.opencv.ml.CvStatModel.java
org.opencv.ml.EM.java
org.opencv.ml.Ml.java
org.opencv.objdetect.CascadeClassifier.java
org.opencv.objdetect.HOGDescriptor.java
org.opencv.objdetect.Objdetect.java
org.opencv.photo.Photo.java
org.opencv.utils.Converters.java
org.opencv.video.BackgroundSubtractorMOG.java
org.opencv.video.BackgroundSubtractor.java
org.opencv.video.KalmanFilter.java
org.opencv.video.Video.java
valkyrie.colorpicker.ColorPickerDialog.java
valkyrie.colorpicker.ColorPicker.java
valkyrie.file.DecodeBitmaps.java
valkyrie.file.FileManager.java
valkyrie.filter.FilterAssets.java
valkyrie.filter.FilterInternalStorage.java
valkyrie.filter.FilterManager.java
valkyrie.filter.FilterUIPosition.java
valkyrie.filter.IFilter.java
valkyrie.filter.ascii.Ascii.java
valkyrie.filter.ascii.Converter.java
valkyrie.filter.ascii.Font.java
valkyrie.filter.ascii.Options.java
valkyrie.filter.canny.Canny.java
valkyrie.filter.grayscale.Grayscale.java
valkyrie.filter.nofilter.NoFilter.java
valkyrie.ui.IUpdateableUI.java
valkyrie.ui.LayoutManager.java
valkyrie.ui.MainActivity.java
valkyrie.ui.UpdateableRelativeLayout.java
valkyrie.ui.gallery.AboutActivity.java
valkyrie.ui.gallery.GalleryActivity.java
valkyrie.ui.gallery.ImageAdapter.java
valkyrie.ui.gallery.ShowPicActivity.java
valkyrie.ui.preview.CameraPreviewViewCV.java
valkyrie.widget.MultiDirectionSlidingDrawer.java
valkyrie.widget.TouchImageView.java