import java.io.IOException; import org.opencv.android.Utils; import org.opencv.core.Core; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.imgproc.Imgproc; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.hardware.Camera; import android.hardware.Camera.PreviewCallback; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; public class CameraViewAndroid extends SurfaceView implements SurfaceHolder.Callback, Runnable { private static final String TAG = "Sample::SurfaceView"; private Camera mCamera; private SurfaceHolder mHolder; private byte[] mFrame; private Mat mYuv; private Mat mRgba; public CameraViewAndroid(Context context) { super(context); mHolder = getHolder(); mHolder.addCallback(this); Log.i(TAG, "Instantiated new " + this.getClass()); } public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) { Log.i(TAG, "surfaceCreated"); if (mCamera != null) { Camera.Parameters params = mCamera.getParameters(); params.setPreviewSize(640,480); mCamera.setParameters(params); try { mCamera.setPreviewDisplay(null); } catch (IOException e) { Log.e(TAG, "mCamera.setPreviewDisplay fails: " + e); } mCamera.startPreview(); } } public void surfaceCreated(SurfaceHolder holder) { Log.i(TAG, "surfaceCreated"); mYuv = new Mat(480 + 480 / 2, 640, CvType.CV_8UC1); mRgba = new Mat(); mCamera = Camera.open(); mCamera.setPreviewCallback(new PreviewCallback() { public void onPreviewFrame(byte[] data, Camera camera) { synchronized (CameraViewAndroid.this) { mFrame = data; CameraViewAndroid.this.notify(); } } }); (new Thread(this)).start(); } public void surfaceDestroyed(SurfaceHolder holder) { Log.i(TAG, "surfaceDestroyed"); if (mCamera != null) { synchronized (this) { mCamera.stopPreview(); mCamera.setPreviewCallback(null); mCamera.release(); mCamera = null; } } } public double timet(double l){ return ((Core.getTickCount() - l)/Core.getTickFrequency()) * 1000; } public void run() { int i = 0 ; double d, total = 0; while (true) { d = Core.getTickCount(); Bitmap bmp = null; synchronized (this) { try { this.wait(); mYuv.put(0, 0, mFrame); Imgproc.cvtColor(mYuv, mRgba, Imgproc.COLOR_YUV420sp2RGB, 4); bmp = Bitmap.createBitmap(640,480, Bitmap.Config.ARGB_8888); Utils.matToBitmap(mRgba, bmp); } catch (InterruptedException e) { e.printStackTrace(); } } if (bmp != null) { Canvas canvas = mHolder.lockCanvas(); if (canvas != null) { canvas.drawBitmap(bmp, (canvas.getWidth() - bmp.getWidth()) / 2, (canvas.getHeight() - bmp.getHeight()) / 2, null); mHolder.unlockCanvasAndPost(canvas); } bmp.recycle(); } total += timet(d); if((i++ % 100) == 0){ Log.w("Android Camera", "Average frame time: " + total/100 + "ms" + " ##Frame Rate:" + (100000/(total)) + "fps"); total = 0; } } } }