diff --git a/modules/java/android_test/src/org/opencv/test/highgui/VideoCaptureTest.java b/modules/java/android_test/src/org/opencv/test/highgui/VideoCaptureTest.java index 2d848a8036..bd74edbff1 100644 --- a/modules/java/android_test/src/org/opencv/test/highgui/VideoCaptureTest.java +++ b/modules/java/android_test/src/org/opencv/test/highgui/VideoCaptureTest.java @@ -1,7 +1,7 @@ package org.opencv.test.highgui; import org.opencv.highgui; -import org.opencv.highgui.VideoCapture; +import org.opencv.VideoCapture; import org.opencv.test.OpenCVTestCase; diff --git a/modules/java/gen_java.py b/modules/java/gen_java.py index 3fa712fa34..63a828f8a8 100644 --- a/modules/java/gen_java.py +++ b/modules/java/gen_java.py @@ -88,6 +88,7 @@ func_ignore_list = ( class_ignore_list = ( "VideoWriter", + "VideoCapture", ) # c_type : { java/jni correspondence } diff --git a/modules/java/src/cpp/VideoCapture.cpp b/modules/java/src/cpp/VideoCapture.cpp new file mode 100644 index 0000000000..12712046c3 --- /dev/null +++ b/modules/java/src/cpp/VideoCapture.cpp @@ -0,0 +1,454 @@ +// +// This file is auto-generated, please don't edit! +// + +#include + +#ifdef DEBUG +#include +#define MODULE_LOG_TAG "OpenCV.highgui" +#define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, MODULE_LOG_TAG, __VA_ARGS__)) +#endif // DEBUG + +#include "opencv2/highgui/highgui_c.h" +#include "opencv2/highgui/highgui.hpp" +using namespace cv; + + +extern "C" { + +// +// VideoCapture::VideoCapture() +// + + +JNIEXPORT jlong JNICALL Java_org_opencv_VideoCapture_n_1VideoCapture__ + (JNIEnv* env, jclass cls) +{ + try { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1VideoCapture__()"); +#endif // DEBUG + + VideoCapture* _retval_ = new VideoCapture( ); + + return (jlong) _retval_; + } catch(cv::Exception e) { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1VideoCapture__() catched cv::Exception: %s", e.what()); +#endif // DEBUG + jclass je = env->FindClass("org/opencv/CvException"); + if(!je) je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, e.what()); + return 0; + } catch (...) { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1VideoCapture__() catched unknown exception (...)"); +#endif // DEBUG + jclass je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1VideoCapture__()}"); + return 0; + } +} + + +// +// VideoCapture::VideoCapture(int device) +// + + +JNIEXPORT jlong JNICALL Java_org_opencv_VideoCapture_n_1VideoCapture__I + (JNIEnv* env, jclass cls, jint device) +{ + try { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1VideoCapture__I()"); +#endif // DEBUG + + VideoCapture* _retval_ = new VideoCapture( device ); + + return (jlong) _retval_; + } catch(cv::Exception e) { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1VideoCapture__I() catched cv::Exception: %s", e.what()); +#endif // DEBUG + jclass je = env->FindClass("org/opencv/CvException"); + if(!je) je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, e.what()); + return 0; + } catch (...) { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1VideoCapture__I() catched unknown exception (...)"); +#endif // DEBUG + jclass je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1VideoCapture__I()}"); + return 0; + } +} + + + +// +// double VideoCapture::get(int propId) +// + + +JNIEXPORT jdouble JNICALL Java_org_opencv_VideoCapture_n_1get + (JNIEnv* env, jclass cls, jlong self, jint propId) +{ + try { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1get()"); +#endif // DEBUG + VideoCapture* me = (VideoCapture*) self; //TODO: check for NULL + double _retval_ = me->get( propId ); + + return _retval_; + } catch(cv::Exception e) { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1get() catched cv::Exception: %s", e.what()); +#endif // DEBUG + jclass je = env->FindClass("org/opencv/CvException"); + if(!je) je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, e.what()); + return 0; + } catch (...) { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1get() catched unknown exception (...)"); +#endif // DEBUG + jclass je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1get()}"); + return 0; + } +} + + + +// +// bool VideoCapture::grab() +// + + +JNIEXPORT jboolean JNICALL Java_org_opencv_VideoCapture_n_1grab + (JNIEnv* env, jclass cls, jlong self) +{ + try { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1grab()"); +#endif // DEBUG + VideoCapture* me = (VideoCapture*) self; //TODO: check for NULL + bool _retval_ = me->grab( ); + + return _retval_; + } catch(cv::Exception e) { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1grab() catched cv::Exception: %s", e.what()); +#endif // DEBUG + jclass je = env->FindClass("org/opencv/CvException"); + if(!je) je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, e.what()); + return 0; + } catch (...) { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1grab() catched unknown exception (...)"); +#endif // DEBUG + jclass je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1grab()}"); + return 0; + } +} + + + +// +// bool VideoCapture::isOpened() +// + + +JNIEXPORT jboolean JNICALL Java_org_opencv_VideoCapture_n_1isOpened + (JNIEnv* env, jclass cls, jlong self) +{ + try { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1isOpened()"); +#endif // DEBUG + VideoCapture* me = (VideoCapture*) self; //TODO: check for NULL + bool _retval_ = me->isOpened( ); + + return _retval_; + } catch(cv::Exception e) { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1isOpened() catched cv::Exception: %s", e.what()); +#endif // DEBUG + jclass je = env->FindClass("org/opencv/CvException"); + if(!je) je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, e.what()); + return 0; + } catch (...) { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1isOpened() catched unknown exception (...)"); +#endif // DEBUG + jclass je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1isOpened()}"); + return 0; + } +} + + +// +// bool VideoCapture::open(int device) +// + + +JNIEXPORT jboolean JNICALL Java_org_opencv_VideoCapture_n_1open__JI + (JNIEnv* env, jclass cls, jlong self, jint device) +{ + try { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1open__JI()"); +#endif // DEBUG + VideoCapture* me = (VideoCapture*) self; //TODO: check for NULL + bool _retval_ = me->open( device ); + + return _retval_; + } catch(cv::Exception e) { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1open__JI() catched cv::Exception: %s", e.what()); +#endif // DEBUG + jclass je = env->FindClass("org/opencv/CvException"); + if(!je) je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, e.what()); + return 0; + } catch (...) { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1open__JI() catched unknown exception (...)"); +#endif // DEBUG + jclass je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1open__JI()}"); + return 0; + } +} + + + +// +// bool VideoCapture::read(Mat image) +// + + +JNIEXPORT jboolean JNICALL Java_org_opencv_VideoCapture_n_1read + (JNIEnv* env, jclass cls, jlong self, jlong image_nativeObj) +{ + try { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1read()"); +#endif // DEBUG + VideoCapture* me = (VideoCapture*) self; //TODO: check for NULL + Mat& image = *((Mat*)image_nativeObj); + bool _retval_ = me->read( image ); + + return _retval_; + } catch(cv::Exception e) { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1read() catched cv::Exception: %s", e.what()); +#endif // DEBUG + jclass je = env->FindClass("org/opencv/CvException"); + if(!je) je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, e.what()); + return 0; + } catch (...) { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1read() catched unknown exception (...)"); +#endif // DEBUG + jclass je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1read()}"); + return 0; + } +} + + + +// +// void VideoCapture::release() +// + + +JNIEXPORT void JNICALL Java_org_opencv_VideoCapture_n_1release + (JNIEnv* env, jclass cls, jlong self) +{ + try { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1release()"); +#endif // DEBUG + VideoCapture* me = (VideoCapture*) self; //TODO: check for NULL + me->release( ); + + return; + } catch(cv::Exception e) { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1release() catched cv::Exception: %s", e.what()); +#endif // DEBUG + jclass je = env->FindClass("org/opencv/CvException"); + if(!je) je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, e.what()); + return; + } catch (...) { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1release() catched unknown exception (...)"); +#endif // DEBUG + jclass je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1release()}"); + return; + } +} + + + +// +// bool VideoCapture::retrieve(Mat image, int channel = 0) +// + + +JNIEXPORT jboolean JNICALL Java_org_opencv_VideoCapture_n_1retrieve__JJI + (JNIEnv* env, jclass cls, jlong self, jlong image_nativeObj, jint channel) +{ + try { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1retrieve__JJI()"); +#endif // DEBUG + VideoCapture* me = (VideoCapture*) self; //TODO: check for NULL + Mat& image = *((Mat*)image_nativeObj); + bool _retval_ = me->retrieve( image, channel ); + + return _retval_; + } catch(cv::Exception e) { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1retrieve__JJI() catched cv::Exception: %s", e.what()); +#endif // DEBUG + jclass je = env->FindClass("org/opencv/CvException"); + if(!je) je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, e.what()); + return 0; + } catch (...) { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1retrieve__JJI() catched unknown exception (...)"); +#endif // DEBUG + jclass je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1retrieve__JJI()}"); + return 0; + } +} + + + + +JNIEXPORT jboolean JNICALL Java_org_opencv_VideoCapture_n_1retrieve__JJ + (JNIEnv* env, jclass cls, jlong self, jlong image_nativeObj) +{ + try { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1retrieve__JJ()"); +#endif // DEBUG + VideoCapture* me = (VideoCapture*) self; //TODO: check for NULL + Mat& image = *((Mat*)image_nativeObj); + bool _retval_ = me->retrieve( image ); + + return _retval_; + } catch(cv::Exception e) { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1retrieve__JJ() catched cv::Exception: %s", e.what()); +#endif // DEBUG + jclass je = env->FindClass("org/opencv/CvException"); + if(!je) je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, e.what()); + return 0; + } catch (...) { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1retrieve__JJ() catched unknown exception (...)"); +#endif // DEBUG + jclass je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1retrieve__JJ()}"); + return 0; + } +} + + + +// +// bool VideoCapture::set(int propId, double value) +// + + +JNIEXPORT jboolean JNICALL Java_org_opencv_VideoCapture_n_1set + (JNIEnv* env, jclass cls, jlong self, jint propId, jdouble value) +{ + try { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1set()"); +#endif // DEBUG + VideoCapture* me = (VideoCapture*) self; //TODO: check for NULL + bool _retval_ = me->set( propId, value ); + + return _retval_; + } catch(cv::Exception e) { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1set() catched cv::Exception: %s", e.what()); +#endif // DEBUG + jclass je = env->FindClass("org/opencv/CvException"); + if(!je) je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, e.what()); + return 0; + } catch (...) { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1set() catched unknown exception (...)"); +#endif // DEBUG + jclass je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1set()}"); + return 0; + } +} + +JNIEXPORT jstring JNICALL Java_org_opencv_VideoCapture_n_1getSupportedPreviewSizes + (JNIEnv *env, jclass cls, jlong self) +{ + try { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1set()"); +#endif // DEBUG + VideoCapture* me = (VideoCapture*) self; //TODO: check for NULL + double addr = me->get(CV_CAP_PROP_SUPPORTED_PREVIEW_SIZES_STRING); + char* result = *((char**)&addr); + return env->NewStringUTF(result); + } catch(cv::Exception e) { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1getSupportedPreviewSizes() catched cv::Exception: %s", e.what()); +#endif // DEBUG + jclass je = env->FindClass("org/opencv/CvException"); + if(!je) je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, e.what()); + return env->NewStringUTF(""); + } catch (...) { +#ifdef DEBUG + LOGD("highgui::VideoCapture_n_1getSupportedPreviewSizes() catched unknown exception (...)"); +#endif // DEBUG + jclass je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1getSupportedPreviewSizes()}"); + return env->NewStringUTF(""); + } +} + + + +// +// native support for java finalize() +// static void VideoCapture::n_delete( __int64 self ) +// + +JNIEXPORT void JNICALL Java_org_opencv_VideoCapture_n_1delete + (JNIEnv* env, jclass cls, jlong self) +{ + delete (VideoCapture*) self; +} + +} // extern "C" + diff --git a/modules/java/src/java/VideoCapture.java b/modules/java/src/java/VideoCapture.java new file mode 100644 index 0000000000..51f976496c --- /dev/null +++ b/modules/java/src/java/VideoCapture.java @@ -0,0 +1,229 @@ +package org.opencv; + +import java.util.List; +import java.util.LinkedList; + +// C++: class VideoCapture +//javadoc: VideoCapture +public class VideoCapture { + + protected final long nativeObj; + protected VideoCapture(long addr) { nativeObj = addr; } + + + // + // C++: VideoCapture::VideoCapture() + // + + //javadoc: VideoCapture::VideoCapture() + public VideoCapture() + { + + nativeObj = n_VideoCapture(); + + return; + } + + + // + // C++: VideoCapture::VideoCapture(int device) + // + + //javadoc: VideoCapture::VideoCapture(device) + public VideoCapture(int device) + { + + nativeObj = n_VideoCapture(device); + + return; + } + + + + // + // C++: double VideoCapture::get(int propId) + // + + //javadoc: VideoCapture::get(propId) + public double get(int propId) + { + + double retVal = n_get(nativeObj, propId); + + return retVal; + } + + public List getSupportedPreviewSizes() + { + String[] sizes_str = n_getSupportedPreviewSizes(nativeObj).split(","); + List sizes = new LinkedList(); + + for(String str : sizes_str){ + String[] wh = str.split("x"); + sizes.add(new Size(Double.parseDouble(wh[0]), Double.parseDouble(wh[1]))); + } + + return sizes; + } + + + // + // C++: bool VideoCapture::grab() + // + + //javadoc: VideoCapture::grab() + public boolean grab() + { + + boolean retVal = n_grab(nativeObj); + + return retVal; + } + + + // + // C++: bool VideoCapture::isOpened() + // + + //javadoc: VideoCapture::isOpened() + public boolean isOpened() + { + + boolean retVal = n_isOpened(nativeObj); + + return retVal; + } + + + // + // C++: bool VideoCapture::open(int device) + // + + //javadoc: VideoCapture::open(device) + public boolean open(int device) + { + + boolean retVal = n_open(nativeObj, device); + + return retVal; + } + + + // + // C++: bool VideoCapture::read(Mat image) + // + + //javadoc: VideoCapture::read(image) + public boolean read(Mat image) + { + + boolean retVal = n_read(nativeObj, image.nativeObj); + + return retVal; + } + + + // + // C++: void VideoCapture::release() + // + + //javadoc: VideoCapture::release() + public void release() + { + + n_release(nativeObj); + + return; + } + + + // + // C++: bool VideoCapture::retrieve(Mat image, int channel = 0) + // + + //javadoc: VideoCapture::retrieve(image, channel) + public boolean retrieve(Mat image, int channel) + { + + boolean retVal = n_retrieve(nativeObj, image.nativeObj, channel); + + return retVal; + } + + //javadoc: VideoCapture::retrieve(image) + public boolean retrieve(Mat image) + { + + boolean retVal = n_retrieve(nativeObj, image.nativeObj); + + return retVal; + } + + + // + // C++: bool VideoCapture::set(int propId, double value) + // + + //javadoc: VideoCapture::set(propId, value) + public boolean set(int propId, double value) + { + + boolean retVal = n_set(nativeObj, propId, value); + + return retVal; + } + + + @Override + protected void finalize() throws Throwable { + n_delete(nativeObj); + super.finalize(); + } + + // native stuff + + static { System.loadLibrary("opencv_java"); } + + // C++: VideoCapture::VideoCapture() + private static native long n_VideoCapture(); + + // C++: VideoCapture::VideoCapture(string filename) + private static native long n_VideoCapture(java.lang.String filename); + + // C++: VideoCapture::VideoCapture(int device) + private static native long n_VideoCapture(int device); + + // C++: double VideoCapture::get(int propId) + private static native double n_get(long nativeObj, int propId); + + // C++: bool VideoCapture::grab() + private static native boolean n_grab(long nativeObj); + + // C++: bool VideoCapture::isOpened() + private static native boolean n_isOpened(long nativeObj); + + // C++: bool VideoCapture::open(string filename) + private static native boolean n_open(long nativeObj, java.lang.String filename); + + // C++: bool VideoCapture::open(int device) + private static native boolean n_open(long nativeObj, int device); + + // C++: bool VideoCapture::read(Mat image) + private static native boolean n_read(long nativeObj, long image_nativeObj); + + // C++: void VideoCapture::release() + private static native void n_release(long nativeObj); + + // C++: bool VideoCapture::retrieve(Mat image, int channel = 0) + private static native boolean n_retrieve(long nativeObj, long image_nativeObj, int channel); + private static native boolean n_retrieve(long nativeObj, long image_nativeObj); + + // C++: bool VideoCapture::set(int propId, double value) + private static native boolean n_set(long nativeObj, int propId, double value); + + private static native String n_getSupportedPreviewSizes(long nativeObj); + + // native support for java finalize() + private static native void n_delete(long nativeObj); + +} diff --git a/samples/android/0-base/AndroidManifest.xml b/samples/android/0-base/AndroidManifest.xml index d2919b9848..3e07ce5859 100644 --- a/samples/android/0-base/AndroidManifest.xml +++ b/samples/android/0-base/AndroidManifest.xml @@ -12,7 +12,9 @@ + android:label="@string/app_name" + android:screenOrientation="landscape" + android:configChanges="keyboardHidden|orientation"> diff --git a/samples/android/1-java/AndroidManifest.xml b/samples/android/1-java/AndroidManifest.xml index 8742d3bbef..b0ccc99906 100644 --- a/samples/android/1-java/AndroidManifest.xml +++ b/samples/android/1-java/AndroidManifest.xml @@ -12,7 +12,9 @@ + android:label="@string/app_name" + android:screenOrientation="landscape" + android:configChanges="keyboardHidden|orientation"> diff --git a/samples/android/2-native/AndroidManifest.xml b/samples/android/2-native/AndroidManifest.xml index 117e3ddd2e..167f8f2d08 100644 --- a/samples/android/2-native/AndroidManifest.xml +++ b/samples/android/2-native/AndroidManifest.xml @@ -12,7 +12,9 @@ + android:label="@string/app_name" + android:screenOrientation="landscape" + android:configChanges="keyboardHidden|orientation"> diff --git a/samples/android/3-nativecamera/.classpath b/samples/android/3-nativecamera/.classpath new file mode 100644 index 0000000000..da04f5de0f --- /dev/null +++ b/samples/android/3-nativecamera/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/samples/android/3-nativecamera/.project b/samples/android/3-nativecamera/.project new file mode 100644 index 0000000000..1452ef555f --- /dev/null +++ b/samples/android/3-nativecamera/.project @@ -0,0 +1,40 @@ + + + Sample 3 Native Camera + + + + + + 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 + + + + opencv2.3.1_src + 2 + _android_opencv2_3_1_d2471b5d/src + + + diff --git a/samples/android/3-nativecamera/.settings/org.eclipse.jdt.core.prefs b/samples/android/3-nativecamera/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..d995784334 --- /dev/null +++ b/samples/android/3-nativecamera/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,5 @@ +#Wed Jun 29 04:36:40 MSD 2011 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/samples/android/3-nativecamera/AndroidManifest.xml b/samples/android/3-nativecamera/AndroidManifest.xml new file mode 100644 index 0000000000..79323e7d28 --- /dev/null +++ b/samples/android/3-nativecamera/AndroidManifest.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/android/3-nativecamera/default.properties b/samples/android/3-nativecamera/default.properties new file mode 100644 index 0000000000..fb3ea1f7b3 --- /dev/null +++ b/samples/android/3-nativecamera/default.properties @@ -0,0 +1,3 @@ +android.library.reference.1=../../../android/build +# Project target. +target=android-8 diff --git a/samples/android/3-nativecamera/res/drawable/icon.png b/samples/android/3-nativecamera/res/drawable/icon.png new file mode 100644 index 0000000000..4e828bafd8 Binary files /dev/null and b/samples/android/3-nativecamera/res/drawable/icon.png differ diff --git a/samples/android/3-nativecamera/res/values/strings.xml b/samples/android/3-nativecamera/res/values/strings.xml new file mode 100644 index 0000000000..581d9e67b2 --- /dev/null +++ b/samples/android/3-nativecamera/res/values/strings.xml @@ -0,0 +1,4 @@ + + + Sample 3: Native Camera + diff --git a/samples/android/3-nativecamera/src/org/opencv/samples/s3/Sample3NativeCamera.java b/samples/android/3-nativecamera/src/org/opencv/samples/s3/Sample3NativeCamera.java new file mode 100644 index 0000000000..d9c8c6a0a4 --- /dev/null +++ b/samples/android/3-nativecamera/src/org/opencv/samples/s3/Sample3NativeCamera.java @@ -0,0 +1,66 @@ +package org.opencv.samples.s3; + +import android.app.Activity; +import android.os.Bundle; +import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; +import android.view.Window; + +public class Sample3NativeCamera extends Activity { + private static final String TAG = "Sample::Activity"; + + public static final int VIEW_MODE_RGBA = 0; + public static final int VIEW_MODE_GRAY = 1; + public static final int VIEW_MODE_CANNY = 2; + public static final int VIEW_MODE_SOBEL = 3; + public static final int VIEW_MODE_BLUR = 4; + + private MenuItem mItemPreviewRGBA; + private MenuItem mItemPreviewGray; + private MenuItem mItemPreviewCanny; + private MenuItem mItemPreviewSobel; + private MenuItem mItemPreviewBlur; + + public static int viewMode = VIEW_MODE_RGBA; + + public Sample3NativeCamera() { + Log.i(TAG, "Instantiated new " + this.getClass()); + } + + /** 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)); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + Log.i(TAG, "onCreateOptionsMenu"); + mItemPreviewRGBA = menu.add("Preview RGBA"); + mItemPreviewGray = menu.add("Preview GRAY"); + mItemPreviewCanny = menu.add("Canny"); + mItemPreviewSobel = menu.add("Sobel"); + mItemPreviewBlur = menu.add("Blur"); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + Log.i(TAG, "Menu Item selected " + item); + if (item == mItemPreviewRGBA) + viewMode = VIEW_MODE_RGBA; + else if (item == mItemPreviewGray) + viewMode = VIEW_MODE_GRAY; + else if (item == mItemPreviewCanny) + viewMode = VIEW_MODE_CANNY; + else if (item == mItemPreviewSobel) + viewMode = VIEW_MODE_SOBEL; + else if (item == mItemPreviewBlur) + viewMode = VIEW_MODE_BLUR; + return true; + } +} diff --git a/samples/android/3-nativecamera/src/org/opencv/samples/s3/Sample3View.java b/samples/android/3-nativecamera/src/org/opencv/samples/s3/Sample3View.java new file mode 100644 index 0000000000..4f2c7f9a45 --- /dev/null +++ b/samples/android/3-nativecamera/src/org/opencv/samples/s3/Sample3View.java @@ -0,0 +1,85 @@ +package org.opencv.samples.s3; + +import org.opencv.*; + +import android.content.Context; +import android.graphics.Bitmap; +import android.view.SurfaceHolder; + +class Sample3View extends SampleViewBase { + private Mat mRgba; + private Mat mGray; + private Mat mIntermediateMat; + + public Sample3View(Context context) { + super(context); + } + + @Override + public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) { + super.surfaceChanged(_holder, format, width, height); + + synchronized (this) { + // initialize Mats before usage + mGray = new Mat(); + mRgba = new Mat(); + mIntermediateMat = new Mat(); + } + } + + @Override + protected Bitmap processFrame(VideoCapture capture) { + switch (Sample3NativeCamera.viewMode) { + case Sample3NativeCamera.VIEW_MODE_GRAY: + capture.retrieve(mGray, highgui.CV_CAP_ANDROID_GREY_FRAME); + imgproc.cvtColor(mGray, mRgba, imgproc.CV_GRAY2RGBA, 4); + break; + case Sample3NativeCamera.VIEW_MODE_RGBA: + capture.retrieve(mRgba, highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); + core.putText(mRgba, "OpenCV + Android", new Point(10, 100), 3/* CV_FONT_HERSHEY_COMPLEX */, 2, new Scalar(255, 0, 0, 255), 3); + break; + case Sample3NativeCamera.VIEW_MODE_CANNY: + capture.retrieve(mGray, highgui.CV_CAP_ANDROID_GREY_FRAME); + imgproc.Canny(mGray, mIntermediateMat, 80, 100); + imgproc.cvtColor(mIntermediateMat, mRgba, imgproc.CV_GRAY2BGRA, 4); + break; + case Sample3NativeCamera.VIEW_MODE_SOBEL: + capture.retrieve(mGray, highgui.CV_CAP_ANDROID_GREY_FRAME); + imgproc.Sobel(mGray, mIntermediateMat, CvType.CV_8U, 1, 1); + core.convertScaleAbs(mIntermediateMat, mIntermediateMat, 8); + imgproc.cvtColor(mIntermediateMat, mRgba, imgproc.CV_GRAY2BGRA, 4); + break; + case Sample3NativeCamera.VIEW_MODE_BLUR: + capture.retrieve(mRgba, highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); + imgproc.blur(mRgba, mRgba, new Size(15, 15)); + break; + } + + Bitmap bmp = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888); + + if (android.MatToBitmap(mRgba, bmp)) + return bmp; + + bmp.recycle(); + return null; + } + + @Override + public void run() { + super.run(); + + synchronized (this) { + // Explicitly deallocate Mats + if (mRgba != null) + mRgba.dispose(); + if (mGray != null) + mGray.dispose(); + if (mIntermediateMat != null) + mIntermediateMat.dispose(); + + mRgba = null; + mGray = null; + mIntermediateMat = null; + } + } +} \ No newline at end of file diff --git a/samples/android/3-nativecamera/src/org/opencv/samples/s3/SampleViewBase.java b/samples/android/3-nativecamera/src/org/opencv/samples/s3/SampleViewBase.java new file mode 100644 index 0000000000..1ee37460f4 --- /dev/null +++ b/samples/android/3-nativecamera/src/org/opencv/samples/s3/SampleViewBase.java @@ -0,0 +1,104 @@ +package org.opencv.samples.s3; + +import java.util.List; + +import org.opencv.*; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +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 = "Sample::SurfaceView"; + + private SurfaceHolder mHolder; + private VideoCapture mCamera; + private boolean mThreadRun; + + public SampleViewBase(Context context) { + super(context); + mHolder = getHolder(); + mHolder.addCallback(this); + Log.i(TAG, "Instantiated new " + this.getClass()); + } + + public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) { + Log.i(TAG, "surfaceCreated"); + if (mCamera != null && mCamera.isOpened()) { + Log.i(TAG, "before mCamera.getSupportedPreviewSizes()"); + List sizes = mCamera.getSupportedPreviewSizes(); + Log.i(TAG, "after mCamera.getSupportedPreviewSizes()"); + int mFrameWidth = width; + int mFrameHeight = height; + + // selecting optimal camera preview size + { + double minDiff = Double.MAX_VALUE; + for (Size size : sizes) { + if (Math.abs(size.height - height) < minDiff) { + mFrameWidth = (int) size.width; + mFrameHeight = (int) size.height; + minDiff = Math.abs(size.height - height); + } + } + } + + mCamera.set(highgui.CV_CAP_PROP_FRAME_WIDTH, mFrameWidth); + mCamera.set(highgui.CV_CAP_PROP_FRAME_HEIGHT, mFrameHeight); + } + } + + 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"); + } + } + + public void surfaceDestroyed(SurfaceHolder holder) { + Log.i(TAG, "surfaceDestroyed"); + mThreadRun = false; + if (mCamera != null) { + synchronized (this) { + mCamera.release(); + mCamera = null; + } + } + } + + protected abstract Bitmap processFrame(VideoCapture capture); + + public void run() { + mThreadRun = true; + Log.i(TAG, "Starting processing thread"); + while (mThreadRun) { + Bitmap bmp = null; + + if (!mCamera.grab()) { + Log.e(TAG, "mCamera.grab() failed"); + break; + } + + synchronized (this) { + bmp = processFrame(mCamera); + } + + if (bmp != null) { + Canvas canvas = mHolder.lockCanvas(); + if (canvas != null) { + canvas.drawBitmap(bmp, (canvas.getWidth() - bmp.getWidth()) / 2, (canvas.getHeight() - bmp.getHeight()) / 2, null); + mHolder.unlockCanvasAndPost(canvas); + } + bmp.recycle(); + } + } + } +} \ No newline at end of file diff --git a/samples/android/4-mixed/AndroidManifest.xml b/samples/android/4-mixed/AndroidManifest.xml index 095e21bf51..46b9e2933c 100644 --- a/samples/android/4-mixed/AndroidManifest.xml +++ b/samples/android/4-mixed/AndroidManifest.xml @@ -12,7 +12,9 @@ + android:label="@string/app_name" + android:screenOrientation="landscape" + android:configChanges="keyboardHidden|orientation">