From f8720ec60eabeaa10eb36cc01e42dc81a7b2e96d Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Thu, 7 Feb 2013 13:01:26 +0400 Subject: [PATCH] Code review issues fixed. Compatibility issues fixed. --- .../java/android+CameraBridgeViewBase.java | 84 ++++++++++++++++++- .../samples/puzzle15/Puzzle15Activity.java | 4 +- .../ColorBlobDetectionActivity.java | 4 +- .../opencv/samples/facedetect/FdActivity.java | 4 +- .../ImageManipulationsActivity.java | 4 +- .../opencv/samples/tutorial1/Sample1Java.java | 4 +- .../tutorial2/Sample2NativeCamera.java | 4 +- .../samples/tutorial3/Sample3Native.java | 4 +- .../samples/tutorial4/Sample4Mixed.java | 7 +- .../tutorial5/Sample5CameraControl.java | 4 +- 10 files changed, 100 insertions(+), 23 deletions(-) diff --git a/modules/java/generator/src/java/android+CameraBridgeViewBase.java b/modules/java/generator/src/java/android+CameraBridgeViewBase.java index 44b97e7611..2b25e1d03f 100644 --- a/modules/java/generator/src/java/android+CameraBridgeViewBase.java +++ b/modules/java/generator/src/java/android+CameraBridgeViewBase.java @@ -6,6 +6,7 @@ import org.opencv.R; import org.opencv.android.Utils; import org.opencv.core.Mat; import org.opencv.core.Size; +import org.opencv.highgui.Highgui; import android.app.Activity; import android.app.AlertDialog; @@ -35,7 +36,7 @@ public abstract class CameraBridgeViewBase extends SurfaceView implements Surfac private int mState = STOPPED; private Bitmap mCacheBitmap; - private CvCameraViewListener mListener; + private CvCameraViewListener2 mListener; private boolean mSurfaceExist; private Object mSyncObject = new Object(); @@ -43,6 +44,7 @@ public abstract class CameraBridgeViewBase extends SurfaceView implements Surfac protected int mFrameHeight; protected int mMaxHeight; protected int mMaxWidth; + protected int mPreviewFormat = Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA; protected int mCameraIndex = -1; protected boolean mEnabled; protected FpsMeter mFpsMeter = null; @@ -84,14 +86,75 @@ public abstract class CameraBridgeViewBase extends SurfaceView implements Surfac */ public void onCameraViewStopped(); + /** + * This method is invoked when delivery of the frame needs to be done. + * The returned values - is a modified frame which needs to be displayed on the screen. + * TODO: pass the parameters specifying the format of the frame (BPP, YUV or RGB and etc) + */ + public Mat onCameraFrame(Mat inputFrame); + } + + public interface CvCameraViewListener2 { + /** + * This method is invoked when camera preview has started. After this method is invoked + * the frames will start to be delivered to client via the onCameraFrame() callback. + * @param width - the width of the frames that will be delivered + * @param height - the height of the frames that will be delivered + */ + public void onCameraViewStarted(int width, int height); + + /** + * This method is invoked when camera preview has been stopped for some reason. + * No frames will be delivered via onCameraFrame() callback after this method is called. + */ + public void onCameraViewStopped(); + /** * This method is invoked when delivery of the frame needs to be done. * The returned values - is a modified frame which needs to be displayed on the screen. * TODO: pass the parameters specifying the format of the frame (BPP, YUV or RGB and etc) */ public Mat onCameraFrame(CvCameraViewFrame inputFrame); + }; - } + protected class CvCameraViewListenerAdapter implements CvCameraViewListener2 { + public CvCameraViewListenerAdapter(CvCameraViewListener oldStypeListener) { + mOldStyleListener = oldStypeListener; + } + + public void onCameraViewStarted(int width, int height) { + mOldStyleListener.onCameraViewStarted(width, height); + } + + public void onCameraViewStopped() { + mOldStyleListener.onCameraViewStopped(); + } + + public Mat onCameraFrame(CvCameraViewFrame inputFrame) { + Mat result = null; + switch (mPreviewFormat) { + case Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA: + result = mOldStyleListener.onCameraFrame(inputFrame.rgba()); + break; + case Highgui.CV_CAP_ANDROID_GREY_FRAME: + result = mOldStyleListener.onCameraFrame(inputFrame.gray()); + break; + default: + Log.e(TAG, "Invalid frame format! Only RGBA and Gray Scale are supported!"); + }; + + return result; + } + + public void setFrameFormat(int format) { + mPreviewFormat = format; + } + + private CvCameraViewListenerAdapter() {} + + private int mPreviewFormat = Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA; + private CvCameraViewListener mOldStyleListener; + }; public interface CvCameraViewFrame { public abstract Mat rgba(); @@ -168,10 +231,16 @@ public abstract class CameraBridgeViewBase extends SurfaceView implements Surfac * @param listener */ - public void setCvCameraViewListener(CvCameraViewListener listener) { + public void setCvCameraViewListener(CvCameraViewListener2 listener) { mListener = listener; } + public void setCvCameraViewListener(CvCameraViewListener listener) { + CvCameraViewListenerAdapter adapter = new CvCameraViewListenerAdapter(listener); + adapter.setFrameFormat(mPreviewFormat); + mListener = adapter; + } + /** * This method sets the maximum size that camera frame is allowed to be. When selecting * size - the biggest size which less or equal the size set will be selected. @@ -186,6 +255,15 @@ public abstract class CameraBridgeViewBase extends SurfaceView implements Surfac mMaxHeight = maxHeight; } + public void SetCaptureFormat(int format) + { + mPreviewFormat = format; + if (mListener instanceof CvCameraViewListenerAdapter) { + CvCameraViewListenerAdapter adapter = (CvCameraViewListenerAdapter) mListener; + adapter.setFrameFormat(mPreviewFormat); + } + } + /** * Called when mSyncObject lock is held */ diff --git a/samples/android/15-puzzle/src/org/opencv/samples/puzzle15/Puzzle15Activity.java b/samples/android/15-puzzle/src/org/opencv/samples/puzzle15/Puzzle15Activity.java index d32c46de26..15c8b8ff53 100644 --- a/samples/android/15-puzzle/src/org/opencv/samples/puzzle15/Puzzle15Activity.java +++ b/samples/android/15-puzzle/src/org/opencv/samples/puzzle15/Puzzle15Activity.java @@ -6,7 +6,7 @@ import org.opencv.android.LoaderCallbackInterface; import org.opencv.android.OpenCVLoader; import org.opencv.core.Mat; import org.opencv.android.CameraBridgeViewBase; -import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener; +import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2; import android.os.Bundle; import android.app.Activity; @@ -17,7 +17,7 @@ import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; -public class Puzzle15Activity extends Activity implements CvCameraViewListener, View.OnTouchListener { +public class Puzzle15Activity extends Activity implements CvCameraViewListener2, View.OnTouchListener { private static final String TAG = "Sample::Puzzle15::Activity"; diff --git a/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetectionActivity.java b/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetectionActivity.java index c7ac9a2ae0..f6be4b93e2 100644 --- a/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetectionActivity.java +++ b/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetectionActivity.java @@ -14,7 +14,7 @@ import org.opencv.core.Rect; import org.opencv.core.Scalar; import org.opencv.core.Size; import org.opencv.android.CameraBridgeViewBase; -import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener; +import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2; import org.opencv.imgproc.Imgproc; import android.app.Activity; @@ -26,7 +26,7 @@ import android.view.Window; import android.view.WindowManager; import android.view.View.OnTouchListener; -public class ColorBlobDetectionActivity extends Activity implements OnTouchListener, CvCameraViewListener { +public class ColorBlobDetectionActivity extends Activity implements OnTouchListener, CvCameraViewListener2 { private static final String TAG = "OCVSample::Activity"; private boolean mIsColorSelected = false; diff --git a/samples/android/face-detection/src/org/opencv/samples/facedetect/FdActivity.java b/samples/android/face-detection/src/org/opencv/samples/facedetect/FdActivity.java index 333d08bfb3..a9dfab06a3 100644 --- a/samples/android/face-detection/src/org/opencv/samples/facedetect/FdActivity.java +++ b/samples/android/face-detection/src/org/opencv/samples/facedetect/FdActivity.java @@ -16,7 +16,7 @@ import org.opencv.core.Rect; import org.opencv.core.Scalar; import org.opencv.core.Size; import org.opencv.android.CameraBridgeViewBase; -import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener; +import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2; import org.opencv.objdetect.CascadeClassifier; import android.app.Activity; @@ -27,7 +27,7 @@ import android.view.Menu; import android.view.MenuItem; import android.view.WindowManager; -public class FdActivity extends Activity implements CvCameraViewListener { +public class FdActivity extends Activity implements CvCameraViewListener2 { private static final String TAG = "OCVSample::Activity"; private static final Scalar FACE_RECT_COLOR = new Scalar(0, 255, 0, 255); diff --git a/samples/android/image-manipulations/src/org/opencv/samples/imagemanipulations/ImageManipulationsActivity.java b/samples/android/image-manipulations/src/org/opencv/samples/imagemanipulations/ImageManipulationsActivity.java index 513e9b770c..52f77db2a6 100644 --- a/samples/android/image-manipulations/src/org/opencv/samples/imagemanipulations/ImageManipulationsActivity.java +++ b/samples/android/image-manipulations/src/org/opencv/samples/imagemanipulations/ImageManipulationsActivity.java @@ -15,7 +15,7 @@ import org.opencv.core.Point; import org.opencv.core.Scalar; import org.opencv.core.Size; import org.opencv.android.CameraBridgeViewBase; -import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener; +import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2; import org.opencv.imgproc.Imgproc; import android.app.Activity; @@ -25,7 +25,7 @@ import android.view.Menu; import android.view.MenuItem; import android.view.WindowManager; -public class ImageManipulationsActivity extends Activity implements CvCameraViewListener { +public class ImageManipulationsActivity extends Activity implements CvCameraViewListener2 { private static final String TAG = "OCVSample::Activity"; public static final int VIEW_MODE_RGBA = 0; diff --git a/samples/android/tutorial-1-addopencv/src/org/opencv/samples/tutorial1/Sample1Java.java b/samples/android/tutorial-1-addopencv/src/org/opencv/samples/tutorial1/Sample1Java.java index 65e7cd7897..1a1f06fadd 100644 --- a/samples/android/tutorial-1-addopencv/src/org/opencv/samples/tutorial1/Sample1Java.java +++ b/samples/android/tutorial-1-addopencv/src/org/opencv/samples/tutorial1/Sample1Java.java @@ -6,7 +6,7 @@ import org.opencv.android.LoaderCallbackInterface; import org.opencv.android.OpenCVLoader; import org.opencv.core.Mat; import org.opencv.android.CameraBridgeViewBase; -import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener; +import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2; import android.app.Activity; import android.os.Bundle; @@ -17,7 +17,7 @@ import android.view.SurfaceView; import android.view.WindowManager; import android.widget.Toast; -public class Sample1Java extends Activity implements CvCameraViewListener { +public class Sample1Java extends Activity implements CvCameraViewListener2 { private static final String TAG = "OCVSample::Activity"; private CameraBridgeViewBase mOpenCvCameraView; diff --git a/samples/android/tutorial-2-opencvcamera/src/org/opencv/samples/tutorial2/Sample2NativeCamera.java b/samples/android/tutorial-2-opencvcamera/src/org/opencv/samples/tutorial2/Sample2NativeCamera.java index 167d5e027a..45c3b37cb4 100644 --- a/samples/android/tutorial-2-opencvcamera/src/org/opencv/samples/tutorial2/Sample2NativeCamera.java +++ b/samples/android/tutorial-2-opencvcamera/src/org/opencv/samples/tutorial2/Sample2NativeCamera.java @@ -10,7 +10,7 @@ import org.opencv.core.Mat; import org.opencv.core.Point; import org.opencv.core.Scalar; import org.opencv.android.CameraBridgeViewBase; -import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener; +import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2; import org.opencv.imgproc.Imgproc; import android.app.Activity; @@ -20,7 +20,7 @@ import android.view.Menu; import android.view.MenuItem; import android.view.WindowManager; -public class Sample2NativeCamera extends Activity implements CvCameraViewListener { +public class Sample2NativeCamera extends Activity implements CvCameraViewListener2 { private static final String TAG = "OCVSample::Activity"; public static final int VIEW_MODE_RGBA = 0; diff --git a/samples/android/tutorial-3-native/src/org/opencv/samples/tutorial3/Sample3Native.java b/samples/android/tutorial-3-native/src/org/opencv/samples/tutorial3/Sample3Native.java index 50baab1ce8..ded920f0fd 100644 --- a/samples/android/tutorial-3-native/src/org/opencv/samples/tutorial3/Sample3Native.java +++ b/samples/android/tutorial-3-native/src/org/opencv/samples/tutorial3/Sample3Native.java @@ -7,14 +7,14 @@ import org.opencv.android.OpenCVLoader; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.android.CameraBridgeViewBase; -import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener; +import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.WindowManager; -public class Sample3Native extends Activity implements CvCameraViewListener { +public class Sample3Native extends Activity implements CvCameraViewListener2 { private static final String TAG = "OCVSample::Activity"; private Mat mRgba; diff --git a/samples/android/tutorial-4-mixed/src/org/opencv/samples/tutorial4/Sample4Mixed.java b/samples/android/tutorial-4-mixed/src/org/opencv/samples/tutorial4/Sample4Mixed.java index d16b7355d8..ddae246b08 100644 --- a/samples/android/tutorial-4-mixed/src/org/opencv/samples/tutorial4/Sample4Mixed.java +++ b/samples/android/tutorial-4-mixed/src/org/opencv/samples/tutorial4/Sample4Mixed.java @@ -7,7 +7,7 @@ import org.opencv.android.OpenCVLoader; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.android.CameraBridgeViewBase; -import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener; +import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2; import org.opencv.imgproc.Imgproc; import android.app.Activity; @@ -17,7 +17,7 @@ import android.view.Menu; import android.view.MenuItem; import android.view.WindowManager; -public class Sample4Mixed extends Activity implements CvCameraViewListener { +public class Sample4Mixed extends Activity implements CvCameraViewListener2 { private static final String TAG = "OCVSample::Activity"; private static final int VIEW_MODE_RGBA = 0; @@ -133,13 +133,12 @@ public class Sample4Mixed extends Activity implements CvCameraViewListener { // input frame has gray scale format mRgba = inputFrame.rgba(); Imgproc.Canny(inputFrame.gray(), mIntermediateMat, 80, 100); - Imgproc.cvtColor(mIntermediateMat, mRgba, Imgproc.COLOR_GRAY2BGRA, 4); + Imgproc.cvtColor(mIntermediateMat, mRgba, Imgproc.COLOR_GRAY2RGBA, 4); break; case VIEW_MODE_FEATURES: // input frame has RGBA format mRgba = inputFrame.rgba(); mGray = inputFrame.gray(); - Imgproc.cvtColor(mRgba, mGray, Imgproc.COLOR_RGBA2GRAY); FindFeatures(mGray.getNativeObjAddr(), mRgba.getNativeObjAddr()); break; } diff --git a/samples/android/tutorial-5-cameracontrol/src/org/opencv/samples/tutorial5/Sample5CameraControl.java b/samples/android/tutorial-5-cameracontrol/src/org/opencv/samples/tutorial5/Sample5CameraControl.java index 9c2f66dde7..7eba7a345b 100644 --- a/samples/android/tutorial-5-cameracontrol/src/org/opencv/samples/tutorial5/Sample5CameraControl.java +++ b/samples/android/tutorial-5-cameracontrol/src/org/opencv/samples/tutorial5/Sample5CameraControl.java @@ -10,7 +10,7 @@ import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame; import org.opencv.android.LoaderCallbackInterface; import org.opencv.android.OpenCVLoader; import org.opencv.core.Mat; -import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener; +import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2; import android.annotation.SuppressLint; import android.app.Activity; @@ -28,7 +28,7 @@ import android.view.View.OnTouchListener; import android.view.WindowManager; import android.widget.Toast; -public class Sample5CameraControl extends Activity implements CvCameraViewListener, OnTouchListener { +public class Sample5CameraControl extends Activity implements CvCameraViewListener2, OnTouchListener { private static final String TAG = "OCVSample::Activity"; private SampleJavaCameraView mOpenCvCameraView;