diff --git a/samples/android/CMakeLists.txt b/samples/android/CMakeLists.txt
index bf96bdf5a2..12c697c5cc 100644
--- a/samples/android/CMakeLists.txt
+++ b/samples/android/CMakeLists.txt
@@ -16,6 +16,7 @@ add_subdirectory(tutorial-1-addopencv)
add_subdirectory(tutorial-2-opencvcamera)
add_subdirectory(tutorial-3-native)
add_subdirectory(tutorial-4-mixed)
+add_subdirectory(tutorial-5-cameracontrol)
#hello-android sample
if(HAVE_opencv_highgui)
diff --git a/samples/android/tutorial-5-cameracontrol/.classpath b/samples/android/tutorial-5-cameracontrol/.classpath
new file mode 100644
index 0000000000..3f9691c5dd
--- /dev/null
+++ b/samples/android/tutorial-5-cameracontrol/.classpath
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/samples/android/tutorial-5-cameracontrol/.project b/samples/android/tutorial-5-cameracontrol/.project
new file mode 100644
index 0000000000..40a2d7ff25
--- /dev/null
+++ b/samples/android/tutorial-5-cameracontrol/.project
@@ -0,0 +1,33 @@
+
+
+ OpenCV Tutorial 5 - Camera Control
+
+
+
+
+
+ com.android.ide.eclipse.adt.ResourceManagerBuilder
+
+
+
+
+ com.android.ide.eclipse.adt.PreCompilerBuilder
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ com.android.ide.eclipse.adt.ApkBuilder
+
+
+
+
+
+ com.android.ide.eclipse.adt.AndroidNature
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/samples/android/tutorial-5-cameracontrol/.settings/org.eclipse.jdt.core.prefs b/samples/android/tutorial-5-cameracontrol/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000..b080d2ddc8
--- /dev/null
+++ b/samples/android/tutorial-5-cameracontrol/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,4 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/samples/android/tutorial-5-cameracontrol/AndroidManifest.xml b/samples/android/tutorial-5-cameracontrol/AndroidManifest.xml
new file mode 100644
index 0000000000..053033d6c0
--- /dev/null
+++ b/samples/android/tutorial-5-cameracontrol/AndroidManifest.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/android/tutorial-5-cameracontrol/CMakeLists.txt b/samples/android/tutorial-5-cameracontrol/CMakeLists.txt
new file mode 100644
index 0000000000..986f75402e
--- /dev/null
+++ b/samples/android/tutorial-5-cameracontrol/CMakeLists.txt
@@ -0,0 +1,7 @@
+set(sample example-tutorial-5-cameracontrol)
+
+add_android_project(${sample} "${CMAKE_CURRENT_SOURCE_DIR}" LIBRARY_DEPS ${OpenCV_BINARY_DIR} SDK_TARGET 11 ${ANDROID_SDK_TARGET})
+if(TARGET ${sample})
+ add_dependencies(opencv_android_examples ${sample})
+endif()
+
diff --git a/samples/android/tutorial-5-cameracontrol/res/drawable/icon.png b/samples/android/tutorial-5-cameracontrol/res/drawable/icon.png
new file mode 100644
index 0000000000..630454927b
Binary files /dev/null and b/samples/android/tutorial-5-cameracontrol/res/drawable/icon.png differ
diff --git a/samples/android/tutorial-5-cameracontrol/res/layout/tutorial5_surface_view.xml b/samples/android/tutorial-5-cameracontrol/res/layout/tutorial5_surface_view.xml
new file mode 100644
index 0000000000..36376e56bc
--- /dev/null
+++ b/samples/android/tutorial-5-cameracontrol/res/layout/tutorial5_surface_view.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
diff --git a/samples/android/tutorial-5-cameracontrol/res/values/strings.xml b/samples/android/tutorial-5-cameracontrol/res/values/strings.xml
new file mode 100644
index 0000000000..bf1a740ffb
--- /dev/null
+++ b/samples/android/tutorial-5-cameracontrol/res/values/strings.xml
@@ -0,0 +1,4 @@
+
+
+ OCV T5 Camera Control
+
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
new file mode 100644
index 0000000000..358d527b98
--- /dev/null
+++ b/samples/android/tutorial-5-cameracontrol/src/org/opencv/samples/tutorial5/Sample5CameraControl.java
@@ -0,0 +1,127 @@
+package org.opencv.samples.tutorial5;
+
+import java.util.List;
+import java.util.ListIterator;
+
+import org.opencv.android.BaseLoaderCallback;
+import org.opencv.android.LoaderCallbackInterface;
+import org.opencv.android.OpenCVLoader;
+import org.opencv.core.Mat;
+import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.Environment;
+import android.util.Log;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.MotionEvent;
+import android.view.SurfaceView;
+import android.view.View;
+import android.view.View.OnTouchListener;
+import android.view.WindowManager;
+
+public class Sample5CameraControl extends Activity implements CvCameraViewListener, OnTouchListener {
+ private static final String TAG = "OCVSample::Activity";
+
+ private SampleJavaCameraView mOpenCvCameraView;
+ private MenuItem[] mEffectMenuItems;
+
+ private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
+ @Override
+ public void onManagerConnected(int status) {
+ switch (status) {
+ case LoaderCallbackInterface.SUCCESS:
+ {
+ Log.i(TAG, "OpenCV loaded successfully");
+ mOpenCvCameraView.enableView();
+ mOpenCvCameraView.setOnTouchListener(Sample5CameraControl.this);
+ } break;
+ default:
+ {
+ super.onManagerConnected(status);
+ } break;
+ }
+ }
+ };
+
+ public Sample5CameraControl() {
+ Log.i(TAG, "Instantiated new " + this.getClass());
+ }
+
+ /** Called when the activity is first created. */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ Log.i(TAG, "called onCreate");
+ super.onCreate(savedInstanceState);
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+
+ setContentView(R.layout.tutorial5_surface_view);
+
+ mOpenCvCameraView = (SampleJavaCameraView) findViewById(R.id.tutorial5_activity_java_surface_view);
+
+ mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
+
+ mOpenCvCameraView.setCvCameraViewListener(this);
+ }
+
+ @Override
+ public void onPause()
+ {
+ if (mOpenCvCameraView != null)
+ mOpenCvCameraView.disableView();
+ super.onPause();
+ }
+
+ @Override
+ public void onResume()
+ {
+ super.onResume();
+ OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);
+ }
+
+ public void onDestroy() {
+ super.onDestroy();
+ if (mOpenCvCameraView != null)
+ mOpenCvCameraView.disableView();
+ }
+
+ public void onCameraViewStarted(int width, int height) {
+ }
+
+ public void onCameraViewStopped() {
+ }
+
+ public Mat onCameraFrame(Mat inputFrame) {
+ return inputFrame;
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ List effects = mOpenCvCameraView.getEffectList();
+
+ mEffectMenuItems = new MenuItem[effects.size()];
+
+ int idx = 0;
+ ListIterator itr = effects.listIterator();
+ while(itr.hasNext()) {
+ String element = itr.next();
+ mEffectMenuItems[idx] = menu.add(element);
+ idx++;
+ }
+ return true;
+ }
+
+ public boolean onOptionsItemSelected(MenuItem item) {
+ Log.i(TAG, "called onOptionsItemSelected; selected item: " + item);
+ mOpenCvCameraView.setEffect((String) item.getTitle());
+ return true;
+ }
+
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ Log.i(TAG,"onTouch event");
+ mOpenCvCameraView.takePicture(Environment.getExternalStorageDirectory().getPath() + "/sample_picture.jpg");
+ return false;
+ }
+}
diff --git a/samples/android/tutorial-5-cameracontrol/src/org/opencv/samples/tutorial5/SampleJavaCameraView.java b/samples/android/tutorial-5-cameracontrol/src/org/opencv/samples/tutorial5/SampleJavaCameraView.java
new file mode 100644
index 0000000000..fa33b8f4b7
--- /dev/null
+++ b/samples/android/tutorial-5-cameracontrol/src/org/opencv/samples/tutorial5/SampleJavaCameraView.java
@@ -0,0 +1,60 @@
+package org.opencv.samples.tutorial5;
+
+import java.io.FileOutputStream;
+import java.util.List;
+
+import org.opencv.android.JavaCameraView;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.hardware.Camera;
+import android.hardware.Camera.PictureCallback;
+import android.util.AttributeSet;
+import android.util.Log;
+
+public class SampleJavaCameraView extends JavaCameraView {
+
+ private static final String TAG = "Sample::SampleJavaCameraView";
+
+ public SampleJavaCameraView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public List getEffectList() {
+ return mCamera.getParameters().getSupportedColorEffects();
+ }
+
+ public String getEffect() {
+ return mCamera.getParameters().getColorEffect();
+ }
+
+ public void setEffect(String effect) {
+ Camera.Parameters params = mCamera.getParameters();
+ params.setColorEffect(effect);
+ mCamera.setParameters(params);
+ }
+
+ public void takePicture(final String fileName) {
+ Log.i(TAG, "Tacking picture");
+ PictureCallback callback = new PictureCallback() {
+
+ private String mPictureFileName = fileName;
+
+ @Override
+ public void onPictureTaken(byte[] data, Camera camera) {
+ Log.i(TAG, "Saving a bitmap to file");
+ Bitmap picture = BitmapFactory.decodeByteArray(data, 0, data.length);
+ try {
+ FileOutputStream out = new FileOutputStream(mPictureFileName);
+ picture.compress(Bitmap.CompressFormat.JPEG, 90, out);
+ mCamera.startPreview();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ };
+
+ mCamera.takePicture(null, null, callback);
+ }
+}