+++ /dev/null
-package org.opencv.samples.tutorial0;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.DialogInterface;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.Window;
-
-public class Sample0Base extends Activity {
-
- private static final String TAG = "OCVSample::Activity";
- private Sample0View mView;
-
- public Sample0Base() {
- Log.i(TAG, "Instantiated new " + this.getClass());
- }
-
- @Override
- protected void onPause() {
- Log.i(TAG, "called onPause");
- super.onPause();
- mView.releaseCamera();
- }
-
- @Override
- protected void onResume() {
- Log.i(TAG, "called onResume");
- super.onResume();
- if( !mView.openCamera() ) {
- AlertDialog ad = new AlertDialog.Builder(this).create();
- ad.setCancelable(false); // This blocks the 'BACK' button
- ad.setMessage("Fatal error: can't open camera!");
- ad.setButton(AlertDialog.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- dialog.dismiss();
- finish();
- }
- });
- ad.show();
- }
- }
-
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- Log.i(TAG, "called onCreate");
- super.onCreate(savedInstanceState);
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- mView = new Sample0View(this);
- setContentView(mView);
- }
-}
+++ /dev/null
-package org.opencv.samples.tutorial0;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.util.Log;
-
-class Sample0View extends SampleViewBase {
-
- private static final String TAG = "OCVSample::View";
-
- public static final int VIEW_MODE_RGBA = 0;
- public static final int VIEW_MODE_GRAY = 1;
-
- int mSize;
- int[] mRGBA;
- private Bitmap mBitmap;
- private int mViewMode;
-
- public Sample0View(Context context) {
- super(context);
- mSize = 0;
- mViewMode = VIEW_MODE_RGBA;
- Log.i(TAG, "Instantiated new " + this.getClass());
- }
-
- @Override
- protected Bitmap processFrame(byte[] data) {
- int frameSize = getFrameWidth() * getFrameHeight();
-
- int[] rgba = mRGBA;
-
- final int view_mode = mViewMode;
- if (view_mode == VIEW_MODE_GRAY) {
- for (int i = 0; i < frameSize; i++) {
- int y = (0xff & ((int) data[i]));
- rgba[i] = 0xff000000 + (y << 16) + (y << 8) + y;
- }
- } else if (view_mode == VIEW_MODE_RGBA) {
- for (int i = 0; i < getFrameHeight(); i++) {
- for (int j = 0; j < getFrameWidth(); j++) {
- int index = i * getFrameWidth() + j;
- int supply_index = frameSize + (i >> 1) * getFrameWidth() + (j & ~1);
- int y = (0xff & ((int) data[index]));
- int u = (0xff & ((int) data[supply_index + 0]));
- int v = (0xff & ((int) data[supply_index + 1]));
- y = y < 16 ? 16 : y;
-
- float y_conv = 1.164f * (y - 16);
- int r = Math.round(y_conv + 1.596f * (v - 128));
- int g = Math.round(y_conv - 0.813f * (v - 128) - 0.391f * (u - 128));
- int b = Math.round(y_conv + 2.018f * (u - 128));
-
- r = r < 0 ? 0 : (r > 255 ? 255 : r);
- g = g < 0 ? 0 : (g > 255 ? 255 : g);
- b = b < 0 ? 0 : (b > 255 ? 255 : b);
-
- rgba[i * getFrameWidth() + j] = 0xff000000 + (b << 16) + (g << 8) + r;
- }
- }
- }
-
- mBitmap.setPixels(rgba, 0/* offset */, getFrameWidth() /* stride */, 0, 0, getFrameWidth(), getFrameHeight());
- return mBitmap;
- }
-
- @Override
- protected void onPreviewStarted(int previewWidth, int previewHeight) {
- Log.i(TAG, "called onPreviewStarted("+previewWidth+", "+previewHeight+")");
- /* Create a bitmap that will be used through to calculate the image to */
- mBitmap = Bitmap.createBitmap(previewWidth, previewHeight, Bitmap.Config.ARGB_8888);
- mRGBA = new int[previewWidth * previewHeight];
- }
-
- @Override
- protected void onPreviewStopped() {
- Log.i(TAG, "called onPreviewStopped");
- if(mBitmap != null) {
- mBitmap.recycle();
- mBitmap = null;
- }
-
- if(mRGBA != null) {
- mRGBA = null;
- }
- }
-
- public void setViewMode(int viewMode) {
- Log.i(TAG, "called setViewMode("+viewMode+")");
- mViewMode = viewMode;
- }
-}
\ No newline at end of file
+++ /dev/null
-package org.opencv.samples.tutorial0;
-
-import java.io.IOException;
-import java.util.List;
-
-import android.annotation.TargetApi;
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.ImageFormat;
-import android.graphics.SurfaceTexture;
-import android.hardware.Camera;
-import android.hardware.Camera.PreviewCallback;
-import android.os.Build;
-import android.util.Log;
-import android.view.SurfaceHolder;
-import android.view.SurfaceView;
-
-public abstract class SampleViewBase extends SurfaceView implements SurfaceHolder.Callback, Runnable {
- private static final String TAG = "OCVSample::BaseView";
-
- private Camera mCamera;
- private SurfaceHolder mHolder;
- private int mFrameWidth;
- private int mFrameHeight;
- private byte[] mFrame;
- private volatile boolean mThreadRun;
- private byte[] mBuffer;
- private SurfaceTexture mSf;
-
-
- public SampleViewBase(Context context) {
- super(context);
- mHolder = getHolder();
- mHolder.addCallback(this);
- Log.i(TAG, "Instantiated new " + this.getClass());
- }
-
- public int getFrameWidth() {
- return mFrameWidth;
- }
-
- public int getFrameHeight() {
- return mFrameHeight;
- }
-
- @TargetApi(11)
- public void setPreview() throws IOException {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
- mSf = new SurfaceTexture(10);
- mCamera.setPreviewTexture( mSf );
- }
- else
- mCamera.setPreviewDisplay(null);
- }
-
- public boolean openCamera() {
- Log.i(TAG, "Opening Camera");
- mCamera = null;
-
- try {
- mCamera = Camera.open();
- }
- catch (Exception e){
- Log.e(TAG, "Camera is not available (in use or does not exist): " + e.getLocalizedMessage());
- }
-
- if(mCamera == null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
- for (int camIdx = 0; camIdx < Camera.getNumberOfCameras(); ++camIdx) {
- try {
- mCamera = Camera.open(camIdx);
- }
- catch (RuntimeException e) {
- Log.e(TAG, "Camera #" + camIdx + "failed to open: " + e.getLocalizedMessage());
- }
- }
- }
-
- if(mCamera == null) {
- Log.e(TAG, "Can't open any camera");
- return false;
- }
-
- mCamera.setPreviewCallbackWithBuffer(new PreviewCallback() {
- public void onPreviewFrame(byte[] data, Camera camera) {
- synchronized (SampleViewBase.this) {
- System.arraycopy(data, 0, mFrame, 0, data.length);
- SampleViewBase.this.notify();
- }
- camera.addCallbackBuffer(mBuffer);
- }
- });
-
- return true;
- }
-
- public void releaseCamera() {
- Log.i(TAG, "Releasing Camera");
- mThreadRun = false;
- synchronized (this) {
- if (mCamera != null) {
- mCamera.stopPreview();
- mCamera.release();
- mCamera = null;
- }
- }
- onPreviewStopped();
- }
-
- public synchronized void setupCamera(int width, int height) {
- if (mCamera != null) {
- Log.i(TAG, "Setup Camera - " + width + "x" + height);
- Camera.Parameters params = mCamera.getParameters();
- List<Camera.Size> sizes = params.getSupportedPreviewSizes();
- mFrameWidth = width;
- mFrameHeight = height;
-
- // selecting optimal camera preview size
- {
- int minDiff = Integer.MAX_VALUE;
- for (Camera.Size size : sizes) {
- if (Math.abs(size.height - height) < minDiff) {
- mFrameWidth = size.width;
- mFrameHeight = size.height;
- minDiff = Math.abs(size.height - height);
- }
- }
- }
-
- params.setPreviewSize(getFrameWidth(), getFrameHeight());
-
- List<String> FocusModes = params.getSupportedFocusModes();
- if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO))
- {
- params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
- }
-
- mCamera.setParameters(params);
-
- /* Now allocate the buffer */
- params = mCamera.getParameters();
- int size = params.getPreviewSize().width * params.getPreviewSize().height;
- size = size * ImageFormat.getBitsPerPixel(params.getPreviewFormat()) / 8;
- mBuffer = new byte[size];
- /* The buffer where the current frame will be copied */
- mFrame = new byte [size];
- mCamera.addCallbackBuffer(mBuffer);
-
- /* Notify that the preview is about to be started and deliver preview size */
- onPreviewStarted(params.getPreviewSize().width, params.getPreviewSize().height);
-
- try {
- setPreview();
- } catch (IOException e) {
- Log.e(TAG, "mCamera.setPreviewDisplay/setPreviewTexture fails: " + e);
- }
-
- /* Now we can start a preview */
- mCamera.startPreview();
- }
- }
-
- public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
- Log.i(TAG, "called surfaceChanged");
- // stop preview before making changes
- try {
- mCamera.stopPreview();
- } catch (Exception e){
- // ignore: tried to stop a non-existent preview
- }
-
- // start preview with new settings
- setupCamera(width, height);
- }
-
- public void surfaceCreated(SurfaceHolder holder) {
- Log.i(TAG, "called surfaceCreated");
- (new Thread(this)).start();
- }
-
- public void surfaceDestroyed(SurfaceHolder holder) {
- Log.i(TAG, "called surfaceDestroyed");
- }
-
- /* The bitmap returned by this method shall be owned by the child and released in onPreviewStopped() */
- protected abstract Bitmap processFrame(byte[] data);
-
- /**
- * This method is called when the preview process is being started. It is called before the first frame delivered and processFrame is called
- * It is called with the width and height parameters of the preview process. It can be used to prepare the data needed during the frame processing.
- * @param previewWidth - the width of the preview frames that will be delivered via processFrame
- * @param previewHeight - the height of the preview frames that will be delivered via processFrame
- */
- protected abstract void onPreviewStarted(int previewWidtd, int previewHeight);
-
- /**
- * This method is called when preview is stopped. When this method is called the preview stopped and all the processing of frames already completed.
- * If the Bitmap object returned via processFrame is cached - it is a good time to recycle it.
- * Any other resources used during the preview can be released.
- */
- protected abstract void onPreviewStopped();
-
- public void run() {
- mThreadRun = true;
- Log.i(TAG, "Started processing thread");
- while (mThreadRun) {
- Bitmap bmp = null;
-
- synchronized (this) {
- try {
- this.wait();
- if (!mThreadRun)
- break;
- bmp = processFrame(mFrame);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- if (bmp != null) {
- Canvas canvas = mHolder.lockCanvas();
- if (canvas != null) {
- canvas.drawColor(0, android.graphics.PorterDuff.Mode.CLEAR);
- canvas.drawBitmap(bmp, (canvas.getWidth() - getFrameWidth()) / 2, (canvas.getHeight() - getFrameHeight()) / 2, null);
- mHolder.unlockCanvasAndPost(canvas);
- }
- }
- }
- Log.i(TAG, "Finished processing thread");
- }
-}
\ No newline at end of file