Log.i(TAG, "Instantiated new " + this.getClass());
}
- public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
- Log.i(TAG, "surfaceCreated");
+ public boolean openCamera() {
+ Log.i(TAG, "openCamera");
+ synchronized (this) {
+ releaseCamera();
+ mCamera = new VideoCapture(Highgui.CV_CAP_ANDROID);
+ if (!mCamera.isOpened()) {
+ mCamera.release();
+ mCamera = null;
+ Log.e(TAG, "Failed to open native camera");
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public void releaseCamera() {
+ Log.i(TAG, "releaseCamera");
+ synchronized (this) {
+ if (mCamera != null) {
+ mCamera.release();
+ mCamera = null;
+ }
+ }
+ }
+
+ public void setupCamera(int width, int height) {
+ Log.i(TAG, "setupCamera("+width+", "+height+")");
synchronized (this) {
if (mCamera != null && mCamera.isOpened()) {
- Log.i(TAG, "before mCamera.getSupportedPreviewSizes()");
List<Size> sizes = mCamera.getSupportedPreviewSizes();
- Log.i(TAG, "after mCamera.getSupportedPreviewSizes()");
int mFrameWidth = width;
int mFrameHeight = height;
mCamera.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, mFrameHeight);
}
}
+
+ }
+
+ public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
+ Log.i(TAG, "surfaceChanged");
+ setupCamera(width, height);
}
public void surfaceCreated(SurfaceHolder holder) {
Log.i(TAG, "surfaceCreated");
- mCamera = new VideoCapture(Highgui.CV_CAP_ANDROID);
- if (mCamera.isOpened()) {
- (new Thread(this)).start();
- } else {
- mCamera.release();
- mCamera = null;
- Log.e(TAG, "Failed to open native camera");
- }
+ (new Thread(this)).start();
}
public void surfaceDestroyed(SurfaceHolder holder) {
Log.i(TAG, "surfaceDestroyed");
- if (mCamera != null) {
- synchronized (this) {
- mCamera.release();
- mCamera = null;
- }
- }
+ releaseCamera();
}
protected abstract Bitmap processFrame(VideoCapture capture);
package org.opencv.samples.puzzle15;
import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
Log.i(TAG, "Instantiated new " + this.getClass());
}
+ @Override
+ protected void onPause() {
+ Log.i(TAG, "onPause");
+ super.onPause();
+ mView.releaseCamera();
+ }
+
+ @Override
+ protected void onResume() {
+ Log.i(TAG, "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("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) {
import android.view.View.OnTouchListener;\r
\r
public class puzzle15View extends SampleCvViewBase implements OnTouchListener {\r
- private Mat mRgba;\r
+ private Mat mRgba;\r
private Mat mRgba15;\r
private Mat[] mCells;\r
private Mat[] mCells15;\r
}\r
\r
@Override\r
- public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {\r
- super.surfaceChanged(_holder, format, width, height);\r
+ public void surfaceCreated(SurfaceHolder holder) {\r
synchronized (this) {\r
// initialize Mat before usage\r
mRgba = new Mat();\r
}\r
- }\r
+ super.surfaceCreated(holder);\r
+ }\r
\r
public static void shuffle(int[] array) {\r
for (int i = array.length; i > 1; i--) {\r
}\r
\r
public boolean onTouch(View v, MotionEvent event) {\r
- int cols = mRgba.cols();\r
+ if(mRgba==null) return false;\r
+ \r
+ int cols = mRgba.cols();\r
int rows = mRgba.rows();\r
float xoffset = (getWidth() - cols) / 2;\r
float yoffset = (getHeight() - rows) / 2;\r
package org.opencv.samples.colorblobdetect;
import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.Window;
Log.i(TAG, "Instantiated new " + this.getClass());
}
+ @Override
+ protected void onPause() {
+ Log.i(TAG, "onPause");
+ super.onPause();
+ mView.releaseCamera();
+ }
+
+ @Override
+ protected void onResume() {
+ Log.i(TAG, "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("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) {
}
@Override
- public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
- super.surfaceChanged(_holder, format, width, height);
+ public void surfaceCreated(SurfaceHolder holder) {
synchronized (this) {
// initialize Mat before usage
mRgba = new Mat();
}
+
+ super.surfaceCreated(holder);
}
public boolean onTouch(View v, MotionEvent event)
Log.i(TAG, "Instantiated new " + this.getClass());
}
- public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
- Log.i(TAG, "surfaceCreated");
+ public boolean openCamera() {
+ Log.i(TAG, "openCamera");
+ synchronized (this) {
+ releaseCamera();
+ mCamera = new VideoCapture(Highgui.CV_CAP_ANDROID);
+ if (!mCamera.isOpened()) {
+ mCamera.release();
+ mCamera = null;
+ Log.e(TAG, "Failed to open native camera");
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public void releaseCamera() {
+ Log.i(TAG, "releaseCamera");
+ synchronized (this) {
+ if (mCamera != null) {
+ mCamera.release();
+ mCamera = null;
+ }
+ }
+ }
+
+ public void setupCamera(int width, int height) {
+ Log.i(TAG, "setupCamera");
synchronized (this) {
if (mCamera != null && mCamera.isOpened()) {
- Log.i(TAG, "before mCamera.getSupportedPreviewSizes()");
List<Size> sizes = mCamera.getSupportedPreviewSizes();
- Log.i(TAG, "after mCamera.getSupportedPreviewSizes()");
int mFrameWidth = width;
int mFrameHeight = height;
mCamera.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, mFrameHeight);
}
}
+
+ }
+
+ public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
+ Log.i(TAG, "surfaceChanged");
+ setupCamera(width, height);
}
public void surfaceCreated(SurfaceHolder holder) {
Log.i(TAG, "surfaceCreated");
- mCamera = new VideoCapture(Highgui.CV_CAP_ANDROID);
- if (mCamera.isOpened()) {
- (new Thread(this)).start();
- } else {
- mCamera.release();
- mCamera = null;
- Log.e(TAG, "Failed to open native camera");
- }
+ (new Thread(this)).start();
}
public void surfaceDestroyed(SurfaceHolder holder) {
Log.i(TAG, "surfaceDestroyed");
- if (mCamera != null) {
- synchronized (this) {
- mCamera.release();
- mCamera = null;
- }
- }
+ releaseCamera();
}
protected abstract Bitmap processFrame(VideoCapture capture);
package org.opencv.samples.fd;
import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
private MenuItem mItemFace40;
private MenuItem mItemFace30;
private MenuItem mItemFace20;
+
+ private FdView mView;
public static float minFaceSize = 0.5f;
Log.i(TAG, "Instantiated new " + this.getClass());
}
+ @Override
+ protected void onPause() {
+ Log.i(TAG, "onPause");
+ super.onPause();
+ mView.releaseCamera();
+ }
+
+ @Override
+ protected void onResume() {
+ Log.i(TAG, "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("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, "onCreate");
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(new FdView(this));
+ mView = new FdView(this);
+ setContentView(mView);
}
@Override
}
@Override
- public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
- super.surfaceChanged(_holder, format, width, height);
-
+ public void surfaceCreated(SurfaceHolder holder) {
synchronized (this) {
// initialize Mats before usage
mGray = new Mat();
mRgba = new Mat();
}
- }
- @Override
+ super.surfaceCreated(holder);
+ }
+
+ @Override
protected Bitmap processFrame(VideoCapture capture) {
capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);
capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME);
Log.i(TAG, "Instantiated new " + this.getClass());
}
- public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
- Log.i(TAG, "surfaceCreated");
+ public boolean openCamera() {
+ Log.i(TAG, "openCamera");
+ synchronized (this) {
+ releaseCamera();
+ mCamera = new VideoCapture(Highgui.CV_CAP_ANDROID);
+ if (!mCamera.isOpened()) {
+ mCamera.release();
+ mCamera = null;
+ Log.e(TAG, "Failed to open native camera");
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public void releaseCamera() {
+ Log.i(TAG, "releaseCamera");
+ synchronized (this) {
+ if (mCamera != null) {
+ mCamera.release();
+ mCamera = null;
+ }
+ }
+ }
+
+ public void setupCamera(int width, int height) {
+ Log.i(TAG, "setupCamera("+width+", "+height+")");
synchronized (this) {
if (mCamera != null && mCamera.isOpened()) {
- Log.i(TAG, "before mCamera.getSupportedPreviewSizes()");
List<Size> sizes = mCamera.getSupportedPreviewSizes();
- Log.i(TAG, "after mCamera.getSupportedPreviewSizes()");
int mFrameWidth = width;
int mFrameHeight = height;
mCamera.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, mFrameHeight);
}
}
+
+ }
+
+ public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
+ Log.i(TAG, "surfaceChanged");
+ setupCamera(width, height);
}
public void surfaceCreated(SurfaceHolder holder) {
Log.i(TAG, "surfaceCreated");
- mCamera = new VideoCapture(Highgui.CV_CAP_ANDROID);
- if (mCamera.isOpened()) {
- (new Thread(this)).start();
- } else {
- mCamera.release();
- mCamera = null;
- Log.e(TAG, "Failed to open native camera");
- }
+ (new Thread(this)).start();
}
public void surfaceDestroyed(SurfaceHolder holder) {
Log.i(TAG, "surfaceDestroyed");
- if (mCamera != null) {
- synchronized (this) {
- mCamera.release();
- mCamera = null;
- }
- }
+ releaseCamera();
}
protected abstract Bitmap processFrame(VideoCapture capture);
package org.opencv.samples.imagemanipulations;
import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.Window;
public class ImageManipulationsActivity extends Activity {
- private static final String TAG = "Sample::Activity";
+
+ private static final String TAG = "Sample-ImageManipulations::Activity";
public static final int VIEW_MODE_RGBA = 0;
public static final int VIEW_MODE_HIST = 1;
private MenuItem mItemPreviewPosterize;
public static int viewMode = VIEW_MODE_RGBA;
+
+ private ImageManipulationsView mView;
public ImageManipulationsActivity() {
Log.i(TAG, "Instantiated new " + this.getClass());
}
+ @Override
+ protected void onPause() {
+ Log.i(TAG, "onPause");
+ super.onPause();
+ mView.releaseCamera();
+ }
+
+ @Override
+ protected void onResume() {
+ Log.i(TAG, "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("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, "onCreate");
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(new ImageManipulationsView(this));
+ mView = new ImageManipulationsView(this);
+ setContentView(mView);
}
@Override
}
@Override
- public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
- super.surfaceChanged(_holder, format, width, height);
-
+ public void surfaceCreated(SurfaceHolder holder) {
synchronized (this) {
// initialize Mats before usage
mGray = new Mat();
mP1 = new Point();
mP2 = new Point();
}
- }
- private void CreateAuxiliaryMats() {
+ super.surfaceCreated(holder);
+ }
+
+ private void CreateAuxiliaryMats() {
if (mRgba.empty())
return;
import android.view.SurfaceView;
public abstract class SampleCvViewBase extends SurfaceView implements SurfaceHolder.Callback, Runnable {
- private static final String TAG = "Sample::SurfaceView";
+ private static final String TAG = "Sample-ImageManipulations::SurfaceView";
private SurfaceHolder mHolder;
private VideoCapture mCamera;
Log.i(TAG, "Instantiated new " + this.getClass());
}
- public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
- Log.i(TAG, "surfaceCreated");
+ public boolean openCamera() {
+ Log.i(TAG, "openCamera");
+ synchronized (this) {
+ releaseCamera();
+ mCamera = new VideoCapture(Highgui.CV_CAP_ANDROID);
+ if (!mCamera.isOpened()) {
+ mCamera.release();
+ mCamera = null;
+ Log.e(TAG, "Failed to open native camera");
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public void releaseCamera() {
+ Log.i(TAG, "releaseCamera");
+ synchronized (this) {
+ if (mCamera != null) {
+ mCamera.release();
+ mCamera = null;
+ }
+ }
+ }
+
+ public void setupCamera(int width, int height) {
+ Log.i(TAG, "setupCamera");
synchronized (this) {
if (mCamera != null && mCamera.isOpened()) {
- Log.i(TAG, "before mCamera.getSupportedPreviewSizes()");
List<Size> sizes = mCamera.getSupportedPreviewSizes();
- Log.i(TAG, "after mCamera.getSupportedPreviewSizes()");
int mFrameWidth = width;
int mFrameHeight = height;
mCamera.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, mFrameHeight);
}
}
+
+ }
+
+ public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
+ Log.i(TAG, "surfaceChanged");
+ setupCamera(width, height);
}
public void surfaceCreated(SurfaceHolder holder) {
Log.i(TAG, "surfaceCreated");
- mCamera = new VideoCapture(Highgui.CV_CAP_ANDROID);
- if (mCamera.isOpened()) {
- (new Thread(this)).start();
- } else {
- mCamera.release();
- mCamera = null;
- Log.e(TAG, "Failed to open native camera");
- }
+ (new Thread(this)).start();
}
public void surfaceDestroyed(SurfaceHolder holder) {
Log.i(TAG, "surfaceDestroyed");
- if (mCamera != null) {
- synchronized (this) {
- mCamera.release();
- mCamera = null;
- }
- }
+ releaseCamera();
}
protected abstract Bitmap processFrame(VideoCapture capture);
Bitmap bmp = null;
synchronized (this) {
- if (mCamera == null)
+ if (mCamera == null) {
+ Log.i(TAG, "mCamera == null");
break;
+ }
if (!mCamera.grab()) {
Log.e(TAG, "mCamera.grab() failed");
<?xml version="1.0" encoding="utf-8"?>\r
<resources>\r
- <string name="app_name">Tutorial 1 Basic - 0. Android Camera</string>\r
+ <string name="app_name">Tutorial 0 (Basic) - Android Camera</string>\r
</resources>\r
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.Menu;
Log.i(TAG, "Instantiated new " + this.getClass());
}
- /** Called when the activity is first created. */
+ @Override
+ protected void onPause() {
+ Log.i(TAG, "onPause");
+ super.onPause();
+ mView.releaseCamera();
+ }
+
+ @Override
+ protected void onResume() {
+ Log.i(TAG, "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("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, "onCreate");
@Override
protected void onPreviewStared(int previewWidth, int previewHeight) {
+ Log.i(TAG, "onPreviewStared("+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() {
- mBitmap.recycle();
- mBitmap = null;
- mRGBA = null;
+ Log.i(TAG, "onPreviewStopped");
+ if(mBitmap != null) {
+ mBitmap.recycle();
+ mBitmap = null;
+ }
+
+ if(mRGBA != null) {
+ mRGBA = null;
+ }
}
public void setViewMode(int viewMode) {
+ Log.i(TAG, "setViewMode("+viewMode+")");
mViewMode = viewMode;
}
}
\ No newline at end of file
}
- public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
- Log.i(TAG, "surfaceCreated");
- if (mCamera != null) {
- 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 coppied */
- mFrame = new byte [size];
- mCamera.addCallbackBuffer(mBuffer);
-
- try {
- setPreview();
- } catch (IOException e) {
- Log.e(TAG, "mCamera.setPreviewDisplay/setPreviewTexture fails: " + e);
- }
-
- /* Notify that the preview is about to be started and deliver preview size */
- onPreviewStared(params.getPreviewSize().width, params.getPreviewSize().height);
-
- /* Now we can start a preview */
- mCamera.startPreview();
- }
- }
-
- public void surfaceCreated(SurfaceHolder holder) {
- Log.i(TAG, "surfaceCreated");
+ public boolean openCamera() {
+ Log.i(TAG, "openCamera");
+ releaseCamera();
mCamera = Camera.open();
+ if(mCamera == null) {
+ Log.e(TAG, "Can't open camera!");
+ return false;
+ }
mCamera.setPreviewCallbackWithBuffer(new PreviewCallback() {
public void onPreviewFrame(byte[] data, Camera camera) {
camera.addCallbackBuffer(mBuffer);
}
});
-
- (new Thread(this)).start();
+ return true;
}
-
- public void surfaceDestroyed(SurfaceHolder holder) {
- Log.i(TAG, "surfaceDestroyed");
+
+ public void releaseCamera() {
+ Log.i(TAG, "releaseCamera");
mThreadRun = false;
- if (mCamera != null) {
- synchronized (this) {
+ synchronized (this) {
+ if (mCamera != null) {
mCamera.stopPreview();
mCamera.setPreviewCallback(null);
mCamera.release();
}
onPreviewStopped();
}
+
+ public void setupCamera(int width, int height) {
+ Log.i(TAG, "setupCamera");
+ synchronized (this) {
+ if (mCamera != null) {
+ 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);
+
+ try {
+ setPreview();
+ } catch (IOException e) {
+ Log.e(TAG, "mCamera.setPreviewDisplay/setPreviewTexture fails: " + e);
+ }
+
+ /* Notify that the preview is about to be started and deliver preview size */
+ onPreviewStared(params.getPreviewSize().width, params.getPreviewSize().height);
+
+ /* Now we can start a preview */
+ mCamera.startPreview();
+ }
+ }
+ }
+
+ public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
+ Log.i(TAG, "surfaceChanged");
+ setupCamera(width, height);
+ }
+
+ public void surfaceCreated(SurfaceHolder holder) {
+ Log.i(TAG, "surfaceCreated");
+ (new Thread(this)).start();
+ }
+
+ public void surfaceDestroyed(SurfaceHolder holder) {
+ Log.i(TAG, "surfaceDestroyed");
+ releaseCamera();
+ }
/* The bitmap returned by this method shall be owned by the child and released in onPreviewStopped() */
protected abstract Bitmap processFrame(byte[] data);
}
}
}
+ Log.i(TAG, "Finishing processing thread");
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>\r
<resources>\r
- <string name="app_name">Tutorial 1 Basic - 1. Add OpenCV</string>\r
+ <string name="app_name">Tutorial 1 (Basic) - Add OpenCV</string>\r
</resources>\r
package org.opencv.samples.tutorial1;
import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
Log.i(TAG, "Instantiated new " + this.getClass());
}
+ @Override
+ protected void onPause() {
+ Log.i(TAG, "onPause");
+ super.onPause();
+ mView.releaseCamera();
+ }
+
+ @Override
+ protected void onResume() {
+ Log.i(TAG, "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("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) {
import org.opencv.android.Utils;
import org.opencv.core.Core;
+import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
-import org.opencv.core.CvType;
import org.opencv.imgproc.Imgproc;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.Log;
-import android.view.SurfaceHolder;
class Sample1View extends SampleViewBase {
try {
Utils.matToBitmap(mRgba, bmp);
} catch(Exception e) {
- Log.e("org.opencv.samples.puzzle15", "Utils.matToBitmap() throws an exception: " + e.getMessage());
+ Log.e("org.opencv.samples.tutorial1", "Utils.matToBitmap() throws an exception: " + e.getMessage());
bmp.recycle();
bmp = null;
}
mCamera.setPreviewDisplay(null);
}
- public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
- Log.i(TAG, "surfaceCreated");
- if (mCamera != null) {
-
- 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 coppied */
- mFrame = new byte [size];
- mCamera.addCallbackBuffer(mBuffer);
-
- try {
- setPreview();
- } catch (IOException e) {
- Log.e(TAG, "mCamera.setPreviewDisplay/setPreviewTexture fails: " + e);
- }
-
- /* Notify that the preview is about to be started and deliver preview size */
- onPreviewStared(params.getPreviewSize().width, params.getPreviewSize().height);
-
- /* Now we can start a preview */
- mCamera.startPreview();
- }
- }
-
- public void surfaceCreated(SurfaceHolder holder) {
- Log.i(TAG, "surfaceCreated");
+ public boolean openCamera() {
+ Log.i(TAG, "openCamera");
+ releaseCamera();
mCamera = Camera.open();
+ if(mCamera == null) {
+ Log.e(TAG, "Can't open camera!");
+ return false;
+ }
mCamera.setPreviewCallbackWithBuffer(new PreviewCallback() {
public void onPreviewFrame(byte[] data, Camera camera) {
camera.addCallbackBuffer(mBuffer);
}
});
-
- (new Thread(this)).start();
+ return true;
}
-
- public void surfaceDestroyed(SurfaceHolder holder) {
- Log.i(TAG, "surfaceDestroyed");
+
+ public void releaseCamera() {
+ Log.i(TAG, "releaseCamera");
mThreadRun = false;
- if (mCamera != null) {
- synchronized (this) {
+ synchronized (this) {
+ if (mCamera != null) {
mCamera.stopPreview();
mCamera.setPreviewCallback(null);
mCamera.release();
}
onPreviewStopped();
}
+
+ public void setupCamera(int width, int height) {
+ Log.i(TAG, "setupCamera");
+ synchronized (this) {
+ if (mCamera != null) {
+ 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);
+
+ try {
+ setPreview();
+ } catch (IOException e) {
+ Log.e(TAG, "mCamera.setPreviewDisplay/setPreviewTexture fails: " + e);
+ }
+
+ /* Notify that the preview is about to be started and deliver preview size */
+ onPreviewStared(params.getPreviewSize().width, params.getPreviewSize().height);
+
+ /* Now we can start a preview */
+ mCamera.startPreview();
+ }
+ }
+ }
+
+ public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
+ Log.i(TAG, "surfaceChanged");
+ setupCamera(width, height);
+ }
+
+ public void surfaceCreated(SurfaceHolder holder) {
+ Log.i(TAG, "surfaceCreated");
+ (new Thread(this)).start();
+ }
+
+ public void surfaceDestroyed(SurfaceHolder holder) {
+ Log.i(TAG, "surfaceDestroyed");
+ releaseCamera();
+ }
/* The bitmap returned by this method shall be owned by the child and released in onPreviewStopped() */
protected abstract Bitmap processFrame(byte[] data);
<?xml version="1.0" encoding="utf-8"?>\r
<resources>\r
- <string name="app_name">Tutorial 1 Basic - 2. Use OpenCV Camera</string>\r
+ <string name="app_name">Tutorial 2 (Basic) - Use OpenCV Camera</string>\r
</resources>\r
package org.opencv.samples.tutorial2;
import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
private MenuItem mItemPreviewCanny;
public static int viewMode = VIEW_MODE_RGBA;
+
+ private Sample2View mView;
public Sample2NativeCamera() {
Log.i(TAG, "Instantiated new " + this.getClass());
}
+ @Override
+ protected void onPause() {
+ Log.i(TAG, "onPause");
+ super.onPause();
+ mView.releaseCamera();
+ }
+
+ @Override
+ protected void onResume() {
+ Log.i(TAG, "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("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, "onCreate");
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(new Sample2View(this));
+ mView = new Sample2View(this);
+ setContentView(mView);
}
@Override
package org.opencv.samples.tutorial2;
-import java.util.ArrayList;
-import java.util.List;
-
import org.opencv.android.Utils;
import org.opencv.core.Core;
import org.opencv.core.Mat;
-import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
private Mat mRgba;
private Mat mGray;
private Mat mIntermediateMat;
- private Mat mIntermediateMat2;
- private Mat mEmpty;
- private Scalar lo, hi;
- private Scalar bl, wh;
public Sample2View(Context context) {
super(context);
}
@Override
- public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
- super.surfaceChanged(_holder, format, width, height);
-
+ public void surfaceCreated(SurfaceHolder holder) {
synchronized (this) {
// initialize Mats before usage
mGray = new Mat();
mRgba = new Mat();
mIntermediateMat = new Mat();
- mIntermediateMat2 = new Mat();
- mEmpty = new Mat();
- lo = new Scalar(85, 100, 30);
- hi = new Scalar(130, 255, 255);
- bl = new Scalar(0, 0, 0, 255);
- wh = new Scalar(255, 255, 255, 255);
}
+
+ super.surfaceCreated(holder);
}
@Override
protected Bitmap processFrame(VideoCapture capture) {
- /**/
switch (Sample2NativeCamera.viewMode) {
case Sample2NativeCamera.VIEW_MODE_GRAY:
capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME);
Core.putText(mRgba, "OpenCV + Android", new Point(10, 100), 3, 2, new Scalar(255, 0, 0, 255), 3);
break;
case Sample2NativeCamera.VIEW_MODE_CANNY:
- /*capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME);
+ capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME);
Imgproc.Canny(mGray, mIntermediateMat, 80, 100);
Imgproc.cvtColor(mIntermediateMat, mRgba, Imgproc.COLOR_GRAY2BGRA, 4);
- */
- capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);
- Imgproc.cvtColor(mRgba, mIntermediateMat, Imgproc.COLOR_RGB2HSV_FULL);
- Core.inRange(mIntermediateMat, lo, hi, mIntermediateMat2); // green
- Imgproc.dilate(mIntermediateMat2, mIntermediateMat2, mEmpty);
- //
- List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
- Mat hierarchy = new Mat();
- Imgproc.findContours(mIntermediateMat2, contours, hierarchy,Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);
- Log.d("processFrame", "contours.size()" + contours.size());
- double maxArea = 0;
- int indexMaxArea = -1;
- for (int i = 0; i < contours.size(); i++) {
- double s = Imgproc.contourArea(contours.get(i));
- if(s > maxArea){
- indexMaxArea = i;
- maxArea = s;
- }
- }
-
- mRgba.setTo(bl);
- Imgproc.drawContours(mRgba, contours, indexMaxArea, wh);
- //
- //Imgproc.cvtColor(mIntermediateMat2, mRgba, Imgproc.COLOR_GRAY2RGBA);
break;
}
- /**/
Bitmap bmp = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(mRgba, bmp);
return bmp;
} catch(Exception e) {
- Log.e("org.opencv.samples.puzzle15", "Utils.matToBitmap() throws an exception: " + e.getMessage());
+ Log.e("org.opencv.samples.tutorial2", "Utils.matToBitmap() throws an exception: " + e.getMessage());
bmp.recycle();
return null;
}
if (mIntermediateMat != null)
mIntermediateMat.release();
- if (mIntermediateMat2 != null)
- mIntermediateMat2.release();
-
mRgba = null;
mGray = null;
mIntermediateMat = null;
Log.i(TAG, "Instantiated new " + this.getClass());
}
- public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
- Log.i(TAG, "surfaceCreated");
+ public boolean openCamera() {
+ Log.i(TAG, "openCamera");
+ synchronized (this) {
+ releaseCamera();
+ mCamera = new VideoCapture(Highgui.CV_CAP_ANDROID);
+ if (!mCamera.isOpened()) {
+ mCamera.release();
+ mCamera = null;
+ Log.e(TAG, "Failed to open native camera");
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public void releaseCamera() {
+ Log.i(TAG, "releaseCamera");
+ synchronized (this) {
+ if (mCamera != null) {
+ mCamera.release();
+ mCamera = null;
+ }
+ }
+ }
+
+ public void setupCamera(int width, int height) {
+ Log.i(TAG, "setupCamera");
synchronized (this) {
if (mCamera != null && mCamera.isOpened()) {
- Log.i(TAG, "before mCamera.getSupportedPreviewSizes()");
List<Size> sizes = mCamera.getSupportedPreviewSizes();
- Log.i(TAG, "after mCamera.getSupportedPreviewSizes()");
int mFrameWidth = width;
int mFrameHeight = height;
mCamera.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, mFrameHeight);
}
}
+
+ }
+
+ public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
+ Log.i(TAG, "surfaceChanged");
+ setupCamera(width, height);
}
public void surfaceCreated(SurfaceHolder holder) {
Log.i(TAG, "surfaceCreated");
- mCamera = new VideoCapture(Highgui.CV_CAP_ANDROID);
- if (mCamera.isOpened()) {
- (new Thread(this)).start();
- } else {
- mCamera.release();
- mCamera = null;
- Log.e(TAG, "Failed to open native camera");
- }
+ (new Thread(this)).start();
}
public void surfaceDestroyed(SurfaceHolder holder) {
Log.i(TAG, "surfaceDestroyed");
- if (mCamera != null) {
- synchronized (this) {
- mCamera.release();
- mCamera = null;
- }
- }
+ releaseCamera();
}
protected abstract Bitmap processFrame(VideoCapture capture);
<?xml version="1.0" encoding="utf-8"?>\r
<resources>\r
- <string name="app_name">Tutorial 2 Advanced - 1. Add Native OpenCV</string>\r
+ <string name="app_name">Tutorial 3 (Advanced) - Add Native OpenCV</string>\r
</resources>\r
package org.opencv.samples.tutorial3;
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 Sample3Native extends Activity {
private static final String TAG = "Sample::Activity";
+ private Sample3View mView;
public Sample3Native() {
Log.i(TAG, "Instantiated new " + this.getClass());
}
+ @Override
+ protected void onPause() {
+ Log.i(TAG, "onPause");
+ super.onPause();
+ mView.releaseCamera();
+ }
+
+ @Override
+ protected void onResume() {
+ Log.i(TAG, "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("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, "onCreate");
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(new Sample3View(this));
+ mView = new Sample3View(this);
+ setContentView(mView);
}
}
import java.io.IOException;
import java.util.List;
-
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
mCamera.setPreviewDisplay(null);
}
- public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
- Log.i(TAG, "surfaceCreated");
- if (mCamera != null) {
- 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 coppied */
- mFrame = new byte [size];
- mCamera.addCallbackBuffer(mBuffer);
-
- try {
- setPreview();
- } catch (IOException e) {
- Log.e(TAG, "mCamera.setPreviewDisplay/setPreviewTexture fails: " + e);
- }
-
- /* Notify that the preview is about to be started and deliver preview size */
- onPreviewStared(params.getPreviewSize().width, params.getPreviewSize().height);
-
- /* Now we can start a preview */
- mCamera.startPreview();
- }
- }
-
- public void surfaceCreated(SurfaceHolder holder) {
- Log.i(TAG, "surfaceCreated");
+ public boolean openCamera() {
+ Log.i(TAG, "openCamera");
+ releaseCamera();
mCamera = Camera.open();
+ if(mCamera == null) {
+ Log.e(TAG, "Can't open camera!");
+ return false;
+ }
mCamera.setPreviewCallbackWithBuffer(new PreviewCallback() {
public void onPreviewFrame(byte[] data, Camera camera) {
camera.addCallbackBuffer(mBuffer);
}
});
-
- (new Thread(this)).start();
+ return true;
}
-
- public void surfaceDestroyed(SurfaceHolder holder) {
- Log.i(TAG, "surfaceDestroyed");
+
+ public void releaseCamera() {
+ Log.i(TAG, "releaseCamera");
mThreadRun = false;
- if (mCamera != null) {
- synchronized (this) {
+ synchronized (this) {
+ if (mCamera != null) {
mCamera.stopPreview();
mCamera.setPreviewCallback(null);
mCamera.release();
}
onPreviewStopped();
}
+
+ public void setupCamera(int width, int height) {
+ Log.i(TAG, "setupCamera");
+ synchronized (this) {
+ if (mCamera != null) {
+ 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);
+
+ try {
+ setPreview();
+ } catch (IOException e) {
+ Log.e(TAG, "mCamera.setPreviewDisplay/setPreviewTexture fails: " + e);
+ }
+
+ /* Notify that the preview is about to be started and deliver preview size */
+ onPreviewStared(params.getPreviewSize().width, params.getPreviewSize().height);
+
+ /* Now we can start a preview */
+ mCamera.startPreview();
+ }
+ }
+ }
+
+ public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
+ Log.i(TAG, "surfaceChanged");
+ setupCamera(width, height);
+ }
+
+ public void surfaceCreated(SurfaceHolder holder) {
+ Log.i(TAG, "surfaceCreated");
+ (new Thread(this)).start();
+ }
+
+ public void surfaceDestroyed(SurfaceHolder holder) {
+ Log.i(TAG, "surfaceDestroyed");
+ releaseCamera();
+ }
+
/* The bitmap returned by this method shall be owned by the child and released in onPreviewStopped() */
protected abstract Bitmap processFrame(byte[] data);
<?xml version="1.0" encoding="utf-8"?>\r
<resources>\r
- <string name="app_name">Tutorial 2 Advanced - 2. Mix Java+Native OpenCV</string>\r
+ <string name="app_name">Tutorial 4 (Advanced) - Mix Java+Native OpenCV</string>\r
</resources>\r
package org.opencv.samples.tutorial4;
import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
Log.i(TAG, "Instantiated new " + this.getClass());
}
+ @Override
+ protected void onPause() {
+ Log.i(TAG, "onPause");
+ super.onPause();
+ mView.releaseCamera();
+ }
+
+ @Override
+ protected void onResume() {
+ Log.i(TAG, "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("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) {
package org.opencv.samples.tutorial4;
import org.opencv.android.Utils;
-import org.opencv.core.Mat;
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.util.Log;
-import android.view.SurfaceHolder;
class Sample4View extends SampleViewBase {
import java.io.IOException;
import java.util.List;
-
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
mCamera.setPreviewDisplay(null);
}
- public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
- Log.i(TAG, "surfaceCreated");
- if (mCamera != null) {
- 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 coppied */
- mFrame = new byte [size];
- mCamera.addCallbackBuffer(mBuffer);
-
- try {
- setPreview();
- } catch (IOException e) {
- Log.e(TAG, "mCamera.setPreviewDisplay/setPreviewTexture fails: " + e);
- }
-
- /* Notify that the preview is about to be started and deliver preview size */
- onPreviewStared(params.getPreviewSize().width, params.getPreviewSize().height);
-
- /* Now we can start a preview */
- mCamera.startPreview();
- }
- }
-
- public void surfaceCreated(SurfaceHolder holder) {
- Log.i(TAG, "surfaceCreated");
+ public boolean openCamera() {
+ Log.i(TAG, "openCamera");
+ releaseCamera();
mCamera = Camera.open();
+ if(mCamera == null) {
+ Log.e(TAG, "Can't open camera!");
+ return false;
+ }
mCamera.setPreviewCallbackWithBuffer(new PreviewCallback() {
public void onPreviewFrame(byte[] data, Camera camera) {
camera.addCallbackBuffer(mBuffer);
}
});
-
- (new Thread(this)).start();
+ return true;
}
-
- public void surfaceDestroyed(SurfaceHolder holder) {
- Log.i(TAG, "surfaceDestroyed");
+
+ public void releaseCamera() {
+ Log.i(TAG, "releaseCamera");
mThreadRun = false;
- if (mCamera != null) {
- synchronized (this) {
+ synchronized (this) {
+ if (mCamera != null) {
mCamera.stopPreview();
mCamera.setPreviewCallback(null);
mCamera.release();
}
onPreviewStopped();
}
+
+ public void setupCamera(int width, int height) {
+ Log.i(TAG, "setupCamera");
+ synchronized (this) {
+ if (mCamera != null) {
+ 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);
+
+ try {
+ setPreview();
+ } catch (IOException e) {
+ Log.e(TAG, "mCamera.setPreviewDisplay/setPreviewTexture fails: " + e);
+ }
+
+ /* Notify that the preview is about to be started and deliver preview size */
+ onPreviewStared(params.getPreviewSize().width, params.getPreviewSize().height);
+
+ /* Now we can start a preview */
+ mCamera.startPreview();
+ }
+ }
+ }
+
+ public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
+ Log.i(TAG, "surfaceChanged");
+ setupCamera(width, height);
+ }
+
+ public void surfaceCreated(SurfaceHolder holder) {
+ Log.i(TAG, "surfaceCreated");
+ (new Thread(this)).start();
+ }
+
+ public void surfaceDestroyed(SurfaceHolder holder) {
+ Log.i(TAG, "surfaceDestroyed");
+ releaseCamera();
+ }
+
+
/* The bitmap returned by this method shall be owned by the child and released in onPreviewStopped() */
protected abstract Bitmap processFrame(byte[] data);