Added native camera Android sample; Added manual port of VideoCapture class.
authorAndrey Kamaev <no@email>
Fri, 15 Jul 2011 14:03:53 +0000 (14:03 +0000)
committerAndrey Kamaev <no@email>
Fri, 15 Jul 2011 14:03:53 +0000 (14:03 +0000)
18 files changed:
modules/java/android_test/src/org/opencv/test/highgui/VideoCaptureTest.java
modules/java/gen_java.py
modules/java/src/cpp/VideoCapture.cpp [new file with mode: 0644]
modules/java/src/java/VideoCapture.java [new file with mode: 0644]
samples/android/0-base/AndroidManifest.xml
samples/android/1-java/AndroidManifest.xml
samples/android/2-native/AndroidManifest.xml
samples/android/3-nativecamera/.classpath [new file with mode: 0644]
samples/android/3-nativecamera/.project [new file with mode: 0644]
samples/android/3-nativecamera/.settings/org.eclipse.jdt.core.prefs [new file with mode: 0644]
samples/android/3-nativecamera/AndroidManifest.xml [new file with mode: 0644]
samples/android/3-nativecamera/default.properties [new file with mode: 0644]
samples/android/3-nativecamera/res/drawable/icon.png [new file with mode: 0644]
samples/android/3-nativecamera/res/values/strings.xml [new file with mode: 0644]
samples/android/3-nativecamera/src/org/opencv/samples/s3/Sample3NativeCamera.java [new file with mode: 0644]
samples/android/3-nativecamera/src/org/opencv/samples/s3/Sample3View.java [new file with mode: 0644]
samples/android/3-nativecamera/src/org/opencv/samples/s3/SampleViewBase.java [new file with mode: 0644]
samples/android/4-mixed/AndroidManifest.xml

index 2d848a8..bd74edb 100644 (file)
@@ -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;
 
index 3fa712f..63a828f 100644 (file)
@@ -88,6 +88,7 @@ func_ignore_list = (
 \r
 class_ignore_list = (\r
     "VideoWriter",\r
+    "VideoCapture",\r
 )\r
 \r
 # c_type    : { java/jni correspondence }\r
diff --git a/modules/java/src/cpp/VideoCapture.cpp b/modules/java/src/cpp/VideoCapture.cpp
new file mode 100644 (file)
index 0000000..1271204
--- /dev/null
@@ -0,0 +1,454 @@
+//
+// This file is auto-generated, please don't edit!
+//
+
+#include <jni.h>
+
+#ifdef DEBUG
+#include <android/log.h>
+#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 (file)
index 0000000..51f9764
--- /dev/null
@@ -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<Size> getSupportedPreviewSizes()
+    {
+        String[] sizes_str = n_getSupportedPreviewSizes(nativeObj).split(",");
+        List<Size> sizes = new LinkedList<Size>();
+
+        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);
+
+}
index d2919b9..3e07ce5 100644 (file)
@@ -12,7 +12,9 @@
 
     <application android:label="@string/app_name" android:icon="@drawable/icon">
         <activity android:name="Sample0Base"
-                  android:label="@string/app_name">
+                  android:label="@string/app_name"
+                  android:screenOrientation="landscape"
+                  android:configChanges="keyboardHidden|orientation">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
index 8742d3b..b0ccc99 100644 (file)
@@ -12,7 +12,9 @@
 
     <application android:label="@string/app_name" android:icon="@drawable/icon">
         <activity android:name="Sample1Java"
-                  android:label="@string/app_name">
+                  android:label="@string/app_name"
+                  android:screenOrientation="landscape"
+                  android:configChanges="keyboardHidden|orientation">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
index 117e3dd..167f8f2 100644 (file)
@@ -12,7 +12,9 @@
 
     <application android:label="@string/app_name" android:icon="@drawable/icon">
         <activity android:name="Sample2Native"
-                  android:label="@string/app_name">
+                  android:label="@string/app_name"
+                  android:screenOrientation="landscape"
+                  android:configChanges="keyboardHidden|orientation">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
diff --git a/samples/android/3-nativecamera/.classpath b/samples/android/3-nativecamera/.classpath
new file mode 100644 (file)
index 0000000..da04f5d
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="src" path="gen"/>
+       <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
+       <classpathentry kind="src" path="opencv2.3.1_src"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/samples/android/3-nativecamera/.project b/samples/android/3-nativecamera/.project
new file mode 100644 (file)
index 0000000..1452ef5
--- /dev/null
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>Sample 3 Native Camera</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>com.android.ide.eclipse.adt.ApkBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>com.android.ide.eclipse.adt.AndroidNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+       <linkedResources>
+               <link>
+                       <name>opencv2.3.1_src</name>
+                       <type>2</type>
+                       <locationURI>_android_opencv2_3_1_d2471b5d/src</locationURI>
+               </link>
+       </linkedResources>
+</projectDescription>
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 (file)
index 0000000..d995784
--- /dev/null
@@ -0,0 +1,5 @@
+#Wed Jun 29 04:36:40 MSD 2011\r
+eclipse.preferences.version=1\r
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5\r
+org.eclipse.jdt.core.compiler.compliance=1.5\r
+org.eclipse.jdt.core.compiler.source=1.5\r
diff --git a/samples/android/3-nativecamera/AndroidManifest.xml b/samples/android/3-nativecamera/AndroidManifest.xml
new file mode 100644 (file)
index 0000000..79323e7
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+      package="org.opencv.samples.s3"
+      android:versionCode="1"
+      android:versionName="1.0">
+
+    <supports-screens android:resizeable="true"
+                      android:smallScreens="true" 
+                      android:normalScreens="true" 
+                      android:largeScreens="true" 
+                      android:anyDensity="true" />
+
+    <application android:label="@string/app_name" android:icon="@drawable/icon">
+        <activity android:name="Sample3NativeCamera"
+                  android:label="@string/app_name"
+                  android:screenOrientation="landscape"
+                  android:configChanges="keyboardHidden|orientation">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+    
+    <uses-sdk android:minSdkVersion="8" />
+
+    <uses-permission android:name="android.permission.CAMERA"/>
+    <uses-feature android:name="android.hardware.camera" />
+    <uses-feature android:name="android.hardware.camera.autofocus" />
+
+</manifest> 
diff --git a/samples/android/3-nativecamera/default.properties b/samples/android/3-nativecamera/default.properties
new file mode 100644 (file)
index 0000000..fb3ea1f
--- /dev/null
@@ -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 (file)
index 0000000..4e828ba
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 (file)
index 0000000..581d9e6
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<resources>\r
+    <string name="app_name">Sample 3: Native Camera</string>\r
+</resources>\r
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 (file)
index 0000000..d9c8c6a
--- /dev/null
@@ -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 (file)
index 0000000..4f2c7f9
--- /dev/null
@@ -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 (file)
index 0000000..1ee3746
--- /dev/null
@@ -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<Size> 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
index 095e21b..46b9e29 100644 (file)
@@ -12,7 +12,9 @@
 
     <application android:label="@string/app_name" android:icon="@drawable/icon">
         <activity android:name="Sample4Mixed"
-                  android:label="@string/app_name">
+                  android:label="@string/app_name"
+                  android:screenOrientation="landscape"
+                  android:configChanges="keyboardHidden|orientation">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />