diff --git a/android/Application.mk.in b/android/Application.mk.in
index ab8f84a3ff..c504912243 100644
--- a/android/Application.mk.in
+++ b/android/Application.mk.in
@@ -1,6 +1,6 @@
APP_BUILD_SCRIPT := $(call my-dir)/Android.mk
APP_PROJECT_PATH := $(call my-dir)
# The ARMv7 is significanly faster due to the use of the hardware FPU
-APP_ABI := armeabi armeabi-v7a
+APP_ABI := ${ARM_TARGETS}
APP_MODULES := png jpeg jasper zlib opencv_lapack opencv_core opencv_imgproc opencv_ml opencv_highgui opencv_features2d \
opencv_legacy opencv_objdetect opencv_calib3d opencv_video opencv_contrib opencv_flann
diff --git a/android/CMakeLists.txt b/android/CMakeLists.txt
index acf7ebe299..302cce3385 100644
--- a/android/CMakeLists.txt
+++ b/android/CMakeLists.txt
@@ -40,6 +40,13 @@ foreach(mdir ${module_includes})
set(android_module_include_dirs "${android_module_include_dirs} ${n_f}/include")
endforeach()
+set(PossibleArmTargets
+ "armeabi armeabi-v7a;armeabi;armeabi-v7a")
+set(ARM_TARGETS "armeabi armeabi-v7a" CACHE STRING "the arm targets for android, recommend armeabi-v7a for floating point support and neon")
+set_property(CACHE ARM_TARGETS PROPERTY STRINGS ${PossibleArmTargets} )
+
+
+
configure_file("${CMAKE_SOURCE_DIR}/Android.mk.master.in" "${CMAKE_BINARY_DIR}/Android.mk")
configure_file("${CMAKE_SOURCE_DIR}/Application.mk.in" "${CMAKE_BINARY_DIR}/Application.mk")
configure_file("${CMAKE_SOURCE_DIR}/AndroidManifest.xml.in" "${CMAKE_BINARY_DIR}/AndroidManifest.xml")
diff --git a/android/android-jni/res/layout/camerasettings.xml b/android/android-jni/res/layout/camerasettings.xml
index b6f1bd26ac..558301441c 100644
--- a/android/android-jni/res/layout/camerasettings.xml
+++ b/android/android-jni/res/layout/camerasettings.xml
@@ -27,5 +27,17 @@
android:prompt="@string/camera_mode_prompt" android:entries="@array/camera_mode">
+
+
+
+
+
+
+
diff --git a/android/android-jni/res/values/settingnumbers.xml b/android/android-jni/res/values/settingnumbers.xml
index f3bd1737f7..54771c1e53 100644
--- a/android/android-jni/res/values/settingnumbers.xml
+++ b/android/android-jni/res/values/settingnumbers.xml
@@ -17,4 +17,15 @@ Image Size:\n(may not be exact)
Camera Mode:
+
+
+- auto
+- incandescent
+- fluorescent
+- daylight
+- cloudy-daylight
+
+
+Whitebalance:
+
\ No newline at end of file
diff --git a/android/android-jni/src/com/opencv/camera/CameraConfig.java b/android/android-jni/src/com/opencv/camera/CameraConfig.java
index ba6e8e6e9c..6f522ed475 100644
--- a/android/android-jni/src/com/opencv/camera/CameraConfig.java
+++ b/android/android-jni/src/com/opencv/camera/CameraConfig.java
@@ -19,6 +19,7 @@ public class CameraConfig extends Activity {
public static final String IMAGE_HEIGHT = "IMAGE_HEIGHT";
public static final int CAMERA_MODE_BW = 0;
public static final int CAMERA_MODE_COLOR = 1;
+ private static final String WHITEBALANCE = "WHITEBALANCE";
public static int readCameraMode(Context ctx) {
// Restore preferences
@@ -27,6 +28,13 @@ public class CameraConfig extends Activity {
int mode = settings.getInt(CAMERA_MODE, CAMERA_MODE_BW);
return mode;
}
+
+ public static String readWhitebalace(Context ctx) {
+ // Restore preferences
+ SharedPreferences settings = ctx.getSharedPreferences(CAMERA_SETTINGS,
+ 0);
+ return settings.getString(WHITEBALANCE, "auto");
+ }
static public void setCameraMode(Context context, String mode) {
int m = 0;
@@ -92,11 +100,14 @@ public class CameraConfig extends Activity {
final Spinner size_spinner;
final Spinner mode_spinner;
+ final Spinner whitebalance_spinner;
size_spinner = (Spinner) findViewById(R.id.image_size);
mode_spinner = (Spinner) findViewById(R.id.camera_mode);
+ whitebalance_spinner = (Spinner) findViewById(R.id.whitebalance);
String strsize = sizeToString(size);
String strmode = modeToString(mode);
+ String wbmode = readWhitebalace(getApplicationContext());
String sizes[] = getResources().getStringArray(R.array.image_sizes);
@@ -118,6 +129,16 @@ public class CameraConfig extends Activity {
}
if(i <= modes.length)
mode_spinner.setSelection(i-1);
+
+ i = 1;
+ String wbmodes[] = getResources().getStringArray(R.array.whitebalance);
+ for (String x :wbmodes) {
+ if (x.equals(wbmode))
+ break;
+ i++;
+ }
+ if(i <= wbmodes.length)
+ whitebalance_spinner.setSelection(i-1);
size_spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@@ -150,7 +171,34 @@ public class CameraConfig extends Activity {
}
});
+
+ whitebalance_spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
+
+ @Override
+ public void onItemSelected(AdapterView> arg0, View spinner,
+ int position, long arg3) {
+ Object o = whitebalance_spinner.getItemAtPosition(position);
+ if (o != null)
+ setWhitebalance(spinner.getContext(), (String) o);
+
+ }
+
+
+ @Override
+ public void onNothingSelected(AdapterView> arg0) {
+
+ }
+ });
+
+ }
+ public static void setWhitebalance(Context ctx, String o) {
+ SharedPreferences settings = ctx.getSharedPreferences(CAMERA_SETTINGS,
+ 0);
+ Editor editor = settings.edit();
+ editor.putString(WHITEBALANCE, o);
+ editor.commit();
+
}
private String modeToString(int mode) {
diff --git a/android/android-jni/src/com/opencv/camera/NativePreviewer.java b/android/android-jni/src/com/opencv/camera/NativePreviewer.java
index 6707f8ffea..1d60d8ffa5 100644
--- a/android/android-jni/src/com/opencv/camera/NativePreviewer.java
+++ b/android/android-jni/src/com/opencv/camera/NativePreviewer.java
@@ -23,6 +23,8 @@ import com.opencv.camera.NativeProcessor.PoolCallback;
public class NativePreviewer extends SurfaceView implements
SurfaceHolder.Callback, Camera.PreviewCallback, NativeProcessorCallback {
+ private String whitebalance_mode = "auto";
+
/** Constructor useful for defining a NativePreviewer in android layout xml
*
* @param context
@@ -94,6 +96,7 @@ public class NativePreviewer extends SurfaceView implements
int mode = CameraConfig.readCameraMode(ctx);
setPreviewSize(size[0], size[1]);
setGrayscale(mode == CameraConfig.CAMERA_MODE_BW ? true : false);
+ whitebalance_mode = CameraConfig.readWhitebalace(ctx);
}
public void surfaceCreated(SurfaceHolder holder) {
@@ -135,8 +138,20 @@ public class NativePreviewer extends SurfaceView implements
Log.d("NativePreviewer", "Determined compatible preview size is: (" + preview_width + "," + preview_height+")");
+ Log.d("NativePreviewer","Supported params: " + mCamera.getParameters().flatten());
+
+ //this is available in 8+
+ //parameters.setExposureCompensation(0);
+ parameters.setWhiteBalance(whitebalance_mode);
+ parameters.setAntibanding(Camera.Parameters.ANTIBANDING_OFF);
+
List fmodes = mCamera.getParameters().getSupportedFocusModes();
+ //for(String x: fmodes){
+
+ //}
+ if(parameters.get("meter-mode")!=null)
+ parameters.set("meter-mode","meter-average");
int idx = fmodes.indexOf(Camera.Parameters.FOCUS_MODE_INFINITY);
if (idx != -1) {
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);
@@ -151,9 +166,10 @@ public class NativePreviewer extends SurfaceView implements
List scenemodes = mCamera.getParameters()
.getSupportedSceneModes();
if (scenemodes != null)
- if (scenemodes.indexOf(Camera.Parameters.SCENE_MODE_STEADYPHOTO) != -1) {
+ if (scenemodes.indexOf(Camera.Parameters.SCENE_MODE_ACTION) != -1) {
parameters
- .setSceneMode(Camera.Parameters.SCENE_MODE_STEADYPHOTO);
+ .setSceneMode(Camera.Parameters.SCENE_MODE_ACTION);
+ Log.d("NativePreviewer","set scenemode to action");
}
parameters.setPreviewSize(preview_width, preview_height);