OpenCV for Android 使用(Linux)

OpenCV for Android 使用(Linux)


根據OpenCV4Android的文檔一步步往下走。

導入這些項目後,出現如下的構建問題:

* Build of configuration Default for project OpenCV Tutorial 2 - Mixed Processing *
/ndk-build.cmd
Cannot run program “/ndk-build.cmd”: Unknown reason
Error: Program “/ndk-build.cmd” is not found in PATH
PATH=[/home/vonzhou/software/android-sdk-linux/platform-tools:/home/vonzhou/software/android-sdk-linux/tools:/home/vonzhou/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games]
* Build Finished *

主要原因是:

Warning After the initial import, on a non-Windows (Linux and Mac OS) operating system Eclipse will still show build errors for applications with native C++ code. To resolve the issues, please do the following:
Open Project Properties -> C/C++ Build, and replace “Build command” text to “${NDKROOT}/ndk-build” (remove .cmd at the end).

當然要確保安裝了NDK。

The Native Development Kit (NDK) is a set of tools that allow you to leverage C and C++ code in your Android apps. You can use it either to build from your own source code, or to take advantage of existing prebuilt libraries.

  • 下載android-ndk-r10e-linux-x86.bin(我是Linux)[]
  • 運行該文件可以解壓縮
  • 配置Eclipse中的NDK路徑:Window -> Preferences -> Android -> NDK
  • 不要忘了設置NDKROOT環境變量啊
  • 右鍵選擇Properties->c/c++ build 改ndk-build.cmd -> ndk-build
  • 此外,Android.mk中不能出現空格

經過反覆折騰,從opencv for android sdk中導入的project沒有錯誤了

如果這時你運行那些實例,(在AVD中)你會被告知“OpenCV Manager package was not installed ….” ,SO 我們需要安裝那個apk!(那個apk在哪兒?在OpenCV-android-sdk/apk下面,選擇對應的版本,然後copy到android sdk platformt-tools下面,運行adb進行安裝,這樣就安裝到了我們的AVD中),看圖:

這裏寫圖片描述


接下來寫個簡單的Demo Project 來展示Android中對opencv的使用

利用javah工具通過Class文件的本地函數聲明,生成.h頭文件,這裏得到 com_example_test_ImageProc.h

Usage: javah [options]
where [options] include:
-help Print this help message and exit
-classpath Path from which to load classes
-bootclasspath Path from which to load bootstrap classes
-d

Output directory
-o Output file (only one of -d or -o may be used)
-jni Generate JNI-style header file (default)
-version Print version information
-verbose Enable verbose output
-force Always write output files
are specified with their fully qualified names (for
instance, java.lang.Object).

把這個頭文件(可以重命名)放到我們的jni folder下(將在這裏寫C/C++代碼),接下來會構建ImageProc.c 已經makefile文件。
接下來使用ndk-build命令來得到共享庫文件(要切換到jni folder下面哦),比如libabc.so,所以你在Java程序中能夠System.load這個module!

這裏寫圖片描述
然後運行這個Android app, 顯然遇到了問題

06-16 10:53:32.354: E/AndroidRuntime(832): FATAL EXCEPTION: main
06-16 10:53:32.354: E/AndroidRuntime(832): java.lang.UnsatisfiedLinkError: Cannot load library: load_library(linker.cpp:745): library “image_proc” not found
06-16 10:53:32.354: E/AndroidRuntime(832): at java.lang.Runtime.load(Runtime.java:340)
06-16 10:53:32.354: E/AndroidRuntime(832): at java.lang.System.load(System.java:521)
06-16 10:53:32.354: E/AndroidRuntime(832): at com.example.test.MainActivity1.onManagerConnected(MainActivity.java:29) 06-16 10:53:32.354: E/AndroidRuntime(832): at org.opencv.android.AsyncServiceHelper1.onManagerConnected(MainActivity.java:29)061610:53:32.354:E/AndroidRuntime(832):atorg.opencv.android.AsyncServiceHelper 1.onServiceConnected(AsyncServiceHelper.java:318)
06-16 10:53:32.354: E/AndroidRuntime(832): at android.app.LoadedApkServiceDispatcher.doConnected(LoadedApk.java:1101) 06-16 10:53:32.354: E/AndroidRuntime(832): at android.app.LoadedApkServiceDispatcher.doConnected(LoadedApk.java:1101)061610:53:32.354:E/AndroidRuntime(832):atandroid.app.LoadedApk ServiceDispatcherRunConnection.run(LoadedApk.java:1118) 06-16 10:53:32.354: E/AndroidRuntime(832): at android.os.Handler.handleCallback(Handler.java:725) 06-16 10:53:32.354: E/AndroidRuntime(832): at android.os.Handler.dispatchMessage(Handler.java:92) 06-16 10:53:32.354: E/AndroidRuntime(832): at android.os.Looper.loop(Looper.java:137) 06-16 10:53:32.354: E/AndroidRuntime(832): at android.app.ActivityThread.main(ActivityThread.java:5041) 06-16 10:53:32.354: E/AndroidRuntime(832): at java.lang.reflect.Method.invokeNative(Native Method) 06-16 10:53:32.354: E/AndroidRuntime(832): at java.lang.reflect.Method.invoke(Method.java:511) 06-16 10:53:32.354: E/AndroidRuntime(832): at com.android.internal.os.ZygoteInitRunConnection.run(LoadedApk.java:1118)061610:53:32.354:E/AndroidRuntime(832):atandroid.os.Handler.handleCallback(Handler.java:725)061610:53:32.354:E/AndroidRuntime(832):atandroid.os.Handler.dispatchMessage(Handler.java:92)061610:53:32.354:E/AndroidRuntime(832):atandroid.os.Looper.loop(Looper.java:137)061610:53:32.354:E/AndroidRuntime(832):atandroid.app.ActivityThread.main(ActivityThread.java:5041)061610:53:32.354:E/AndroidRuntime(832):atjava.lang.reflect.Method.invokeNative(NativeMethod)061610:53:32.354:E/AndroidRuntime(832):atjava.lang.reflect.Method.invoke(Method.java:511)061610:53:32.354:E/AndroidRuntime(832):atcom.android.internal.os.ZygoteInit MethodAndArgsCaller.run(ZygoteInit.java:793)
06-16 10:53:32.354: E/AndroidRuntime(832): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
06-16 10:53:32.354: E/AndroidRuntime(832): at dalvik.system.NativeStart.main(Native Method)

雖然發生UnsatisfiedLinkError的原因很多,但是這裏的癥結是那個 library “image_proc” not found ,那麼你爲何不找找剛纔build得到的libimage_proc.so文件在哪兒呢?通過上圖可以看到在該工程下libs目錄中:

vonzhou@CHOWN:~/GitHub/AndroidProject/Test$ ls libs/armeabi-v7a/
libimage_proc.so

*爲何跑到了armeabi-v7a下面? 因爲APP_ABI := armeabi-v7a。

FUCK!爲何文件存在,還是說找不到??


思考,思考哪裏出了問題?怎麼可能,完全不知道這一切是如何發生的好嗎!

好吧!上面完全是根據網上的教程畫圖,忽略了本質!本質就是小即是大。

只能從頭開始,你試過自己通過JNI調用簡單的本地方法實現嗎?這其中也是遇到各種問題
(1)error: ‘JNIEXPORT’ does not name a type
需要引入頭文件(JNIEXPORT定義在jni.h中)
(2)error: base operand of ‘->’ has non-pointer type ‘JNIEnv {aka _JNIEnv}’
注意是C還是C++參考這裏

//C
return (*env)->NewStringUTF(env, "Hello from JNI !");
//C++
return env->NewStringUTF("Hello from JNI !");

(3)要在Android.mk中include OpenCV.mk,否則出錯

[armeabi-v7a] Compile++ thumb: native-util <= native-util.cpp
/home/vonzhou/GitHub/AndroidProject/Test/jni/native-util.cpp:1:33: fatal error: opencv2/core/core.hpp: No such file or directory
#include

LOCAL_PATH:= $(call my-dir)
$(warning $(LOCAL_PATH))

include $(CLEAR_VARS)

include /opt/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk

#LOCAL_MODULE     := imageproc
#LOCAL_SRC_FILES  := ImageProc.cpp

LOCAL_SRC_FILES  := native-util.cpp
LOCAL_MODULE     := native-util

include $(BUILD_SHARED_LIBRARY)

Application.mk

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-8

庫加載代碼:

public class MainActivity extends Activity implements OnClickListener {

    private TextView tv;
    private Button btn;
    private ImageView imageView;
    private Bitmap bitmap;
    private static final String  TAG = "Sample::Feature Detection::Activity";

    // callback for handling the connection status
    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
        public void onManagerConnected(int status) {
            switch (status) {
            case LoaderCallbackInterface.SUCCESS: {
                try {
                    Log.i(TAG, "OpenCV loaded successfully");
                    System.load("native-util");

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            default:
                super.onManagerConnected(status);
            }
        }
    };

    public void onResume() {
        super.onResume();
        // Loads and initializes OpenCV library using OpenCV Engine service.
        // You can choose it.
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_11, this,
                mLoaderCallback);
    }
}

Oops~!出錯:

06-17 02:38:42.371: E/AndroidRuntime(1445): FATAL EXCEPTION: main
06-17 02:38:42.371: E/AndroidRuntime(1445): java.lang.UnsatisfiedLinkError: Cannot load library: load_library(linker.cpp:745): library “native-util” not found
06-17 02:38:42.371: E/AndroidRuntime(1445): at java.lang.Runtime.load(Runtime.java:340)
06-17 02:38:42.371: E/AndroidRuntime(1445): at java.lang.System.load(System.java:521)
06-17 02:38:42.371: E/AndroidRuntime(1445): at com.example.test.MainActivity1.onManagerConnected(MainActivity.java:34)061702:38:42.371:E/AndroidRuntime(1445):atorg.opencv.android.AsyncServiceHelper 1.onServiceConnected(AsyncServiceHelper.java:318)
06-17 02:38:42.371: E/AndroidRuntime(1445): at android.app.LoadedApkServiceDispatcher.doConnected(LoadedApk.java:1101)061702:38:42.371:E/AndroidRuntime(1445):atandroid.app.LoadedApk ServiceDispatcherRunConnection.run(LoadedApk.java:1118)061702:38:42.371:E/AndroidRuntime(1445):atandroid.os.Handler.handleCallback(Handler.java:725)061702:38:42.371:E/AndroidRuntime(1445):atandroid.os.Handler.dispatchMessage(Handler.java:92)061702:38:42.371:E/AndroidRuntime(1445):atandroid.os.Looper.loop(Looper.java:137)061702:38:42.371:E/AndroidRuntime(1445):atandroid.app.ActivityThread.main(ActivityThread.java:5041)061702:38:42.371:E/AndroidRuntime(1445):atjava.lang.reflect.Method.invokeNative(NativeMethod)061702:38:42.371:E/AndroidRuntime(1445):atjava.lang.reflect.Method.invoke(Method.java:511)061702:38:42.371:E/AndroidRuntime(1445):atcom.android.internal.os.ZygoteInit MethodAndArgsCaller.run(ZygoteInit.java:793)
06-17 02:38:42.371: E/AndroidRuntime(1445): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
06-17 02:38:42.371: E/AndroidRuntime(1445): at dalvik.system.NativeStart.main(Native Method)

so庫明顯存在,爲何說找不到呢?難道加載庫的函數有什麼不爲人知的地方?
好吧,System.load 和 System.loadLibrary 是不同的,不同!修改代碼

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
        public void onManagerConnected(int status) {
            switch (status) {
            case LoaderCallbackInterface.SUCCESS: {
                try {
                    Log.i(TAG, "OpenCV loaded successfully");
                    System.loadLibrary("native-util");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            default:
                super.onManagerConnected(status);
            }
        }
    };

是的,這個錯誤沒了,但是運行失敗:

06-17 02:47:11.041: E/AndroidRuntime(1624): FATAL EXCEPTION: main
06-17 02:47:11.041: E/AndroidRuntime(1624): java.lang.UnsatisfiedLinkError: Couldn’t load native-util from loader dalvik.system.PathClassLoader[dexPath=/data/app/com.example.test-2.apk,libraryPath=/data/app-lib/com.example.test-2]: findLibrary returned null
06-17 02:47:11.041: E/AndroidRuntime(1624): at java.lang.Runtime.loadLibrary(Runtime.java:365)
06-17 02:47:11.041: E/AndroidRuntime(1624): at java.lang.System.loadLibrary(System.java:535)
06-17 02:47:11.041: E/AndroidRuntime(1624): at com.example.test.MainActivity1.onManagerConnected(MainActivity.java:35)061702:47:11.041:E/AndroidRuntime(1624):atorg.opencv.android.AsyncServiceHelper 1.onServiceConnected(AsyncServiceHelper.java:318)
06-17 02:47:11.041: E/AndroidRuntime(1624): at android.app.LoadedApkServiceDispatcher.doConnected(LoadedApk.java:1101)061702:47:11.041:E/AndroidRuntime(1624):atandroid.app.LoadedApk ServiceDispatcherRunConnection.run(LoadedApk.java:1118)061702:47:11.041:E/AndroidRuntime(1624):atandroid.os.Handler.handleCallback(Handler.java:725)061702:47:11.041:E/AndroidRuntime(1624):atandroid.os.Handler.dispatchMessage(Handler.java:92)061702:47:11.041:E/AndroidRuntime(1624):atandroid.os.Looper.loop(Looper.java:137)061702:47:11.041:E/AndroidRuntime(1624):atandroid.app.ActivityThread.main(ActivityThread.java:5041)061702:47:11.041:E/AndroidRuntime(1624):atjava.lang.reflect.Method.invokeNative(NativeMethod)061702:47:11.041:E/AndroidRuntime(1624):atjava.lang.reflect.Method.invoke(Method.java:511)061702:47:11.041:E/AndroidRuntime(1624):atcom.android.internal.os.ZygoteInit MethodAndArgsCaller.run(ZygoteInit.java:793)
06-17 02:47:11.041: E/AndroidRuntime(1624): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
06-17 02:47:11.041: E/AndroidRuntime(1624): at dalvik.system.NativeStart.main(Native Method)

解決方法是不指定庫的存放路徑(這些東西爲了兼容各種硬件,搞得各種複雜~~),修改Application.mk如下,這樣得到的庫默認存放在libs/armeabi 下面

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
#APP_ABI := armeabi-v7a
APP_PLATFORM := android-8

好了!到達這一步的卻不容易,只是讓Java中正確加載了Opencv,以及知道如何如何寫本地代碼,還沒牽扯如何調用opencv API來進行實際的圖像處理.到這一步的日誌輸出也值得看看。

06-17 03:25:58.930: D/OpenCVManager/Helper(2647): Service connection created
06-17 03:25:58.950: D/OpenCVManager/Helper(2647): Trying to get library path
06-17 03:25:59.241: D/OpenCVManager/Helper(2647): Trying to get library list
06-17 03:25:59.491: D/OpenCVManager/Helper(2647): Library list: “”
06-17 03:25:59.491: D/OpenCVManager/Helper(2647): First attempt to load libs
06-17 03:25:59.491: D/OpenCVManager/Helper(2647): Trying to init OpenCV libs
06-17 03:25:59.501: D/OpenCVManager/Helper(2647): Trying to load library /data/app-lib/org.opencv.engine-1/libopencv_java.so
06-17 03:25:59.511: D/dalvikvm(2647): Trying to load lib /data/app-lib/org.opencv.engine-1/libopencv_java.so 0x40ce1fb8
06-17 03:25:59.711: D/dalvikvm(2647): Added shared lib /data/app-lib/org.opencv.engine-1/libopencv_java.so 0x40ce1fb8
06-17 03:25:59.711: D/OpenCVManager/Helper(2647): OpenCV libs init was ok!
06-17 03:25:59.711: D/OpenCVManager/Helper(2647): First attempt to load libs is OK
06-17 03:25:59.731: I/OpenCVManager/Helper(2647): General configuration for OpenCV 2.4.11 =====================================
06-17 03:25:59.731: I/OpenCVManager/Helper(2647): Version control: 2.4.11-dirty
06-17 03:25:59.741: I/OpenCVManager/Helper(2647): Platform:
06-17 03:25:59.741: I/OpenCVManager/Helper(2647): Host: Linux 3.2.0-77-generic x86_64
06-17 03:25:59.741: I/OpenCVManager/Helper(2647): Target: Linux 1 armv5te
06-17 03:25:59.751: I/OpenCVManager/Helper(2647): CMake: 2.8.12.1
06-17 03:25:59.751: I/OpenCVManager/Helper(2647): CMake generator: Ninja
06-17 03:25:59.761: I/OpenCVManager/Helper(2647): CMake build tool: /usr/local/bin/ninja
06-17 03:25:59.761: I/OpenCVManager/Helper(2647): Configuration: Release
06-17 03:25:59.771: I/OpenCVManager/Helper(2647): C/C++:
06-17 03:25:59.771: I/OpenCVManager/Helper(2647): Built as dynamic libs?: NO
06-17 03:25:59.771: I/OpenCVManager/Helper(2647): C++ Compiler: /usr/bin/ccache /opt/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-g++ (ver 4.6)
06-17 03:25:59.781: I/OpenCVManager/Helper(2647): C++ flags (Release): -fexceptions -frtti -fpic -Wno-psabi –sysroot=/opt/android-ndk-r8c/platforms/android-8/arch-arm -funwind-tables -finline-limit=64 -fsigned-char -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fdata-sections -ffunction-sections -Wa,–noexecstack -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wno-narrowing -fdiagnostics-show-option -fomit-frame-pointer -mthumb -fomit-frame-pointer -fno-strict-aliasing -O3 -DNDEBUG -DNDEBUG
06-17 03:25:59.781: I/OpenCVManager/Helper(2647): C++ flags (Debug): -fexceptions -frtti -fpic -Wno-psabi –sysroot=/opt/android-ndk-r8c/platforms/android-8/arch-arm -funwind-tables -finline-limit=64 -fsigned-char -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fdata-sections -ffunction-sections -Wa,–noexecstack -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wno-narrowing -fdiagnostics-show-option -fomit-frame-pointer -marm -fno-omit-frame-pointer -fno-strict-aliasing -O0 -g -DDEBUG -D_DEBUG -O0 -DDEBUG -D_DEBUG
06-17 03:25:59.781: I/OpenCVManager/Helper(2647): C Compiler: /usr/bin/ccache /opt/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc
06-17 03:25:59.781: I/OpenCVManager/Helper(2647): C flags (Release): -fexceptions -fpic -Wno-psabi –sysroot=/opt/android-ndk-r8c/platforms/android-8/arch-arm -funwind-tables -finline-limit=64 -fsigned-char -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fdata-sections -ffunction-sections -Wa,–noexecstack -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wno-narrowing -fdiagnostics-show-option -fomit-frame-pointer -mthumb -fomit-frame-pointer -fno-strict-aliasing -O3 -DNDEBUG -DNDEBUG
06-17 03:25:59.781: I/OpenCVManager/Helper(2647): C flags (Debug): -fexceptions -fpic -Wno-psabi –sysroot=/opt/android-ndk-r8c/platforms/android-8/arch-arm -funwind-tables -finline-limit=64 -fsigned-char -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fdata-sections -ffunction-sections -Wa,–noexecstack -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wno-narrowing -fdiagnostics-show-option -fomit-frame-pointer -marm -fno-omit-frame-pointer -fno-strict-aliasing -O0 -g -DDEBUG -D_DEBUG -O0 -DDEBUG -D_DEBUG
06-17 03:25:59.781: I/OpenCVManager/Helper(2647): Linker flags (Release): -Wl,–no-undefined -Wl,–gc-sections -fuse-ld=gold -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now
06-17 03:25:59.791: I/OpenCVManager/Helper(2647): Linker flags (Debug): -Wl,–no-undefined -Wl,–gc-sections -fuse-ld=gold -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now
06-17 03:25:59.791: I/OpenCVManager/Helper(2647): Precompiled headers: NO
06-17 03:25:59.801: I/OpenCVManager/Helper(2647): OpenCV modules:
06-17 03:25:59.801: I/OpenCVManager/Helper(2647): To be built: core androidcamera flann imgproc highgui features2d calib3d ml objdetect video contrib photo java legacy ocl stitching superres ts videostab
06-17 03:25:59.801: I/OpenCVManager/Helper(2647): Disabled: gpu nonfree world
06-17 03:25:59.801: I/OpenCVManager/Helper(2647): Disabled by dependency: -
06-17 03:25:59.801: I/OpenCVManager/Helper(2647): Unavailable: dynamicuda python viz
06-17 03:25:59.801: I/OpenCVManager/Helper(2647): Android:
06-17 03:25:59.811: I/OpenCVManager/Helper(2647): Android ABI: armeabi
06-17 03:25:59.811: I/OpenCVManager/Helper(2647): STL type: gnustl_static
06-17 03:25:59.811: I/OpenCVManager/Helper(2647): Native API level: android-8
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): SDK target: android-14
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Android NDK: /opt/android-ndk-r8c (toolchain: arm-linux-androideabi-4.6)
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): android tool: /hdd2/opt/tadp-3.0r3/android-sdk-linux/tools/android (Android SDK Tools, revision 23.0.2.)
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Google Play package: NO
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Android examples: YES
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): GUI:
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): GTK+ 2.x: NO
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): GThread : NO
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): GtkGlExt: NO
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): OpenGL support: NO
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): VTK support: NO
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Media I/O:
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): ZLib: z (ver 1.2.3)
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): JPEG: build (ver 62)
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): PNG: build (ver 1.5.12)
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): TIFF: build (ver 42 - 4.0.2)
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): JPEG 2000: build (ver 1.900.1)
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): OpenEXR: build (ver 1.7.1)
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Video I/O:
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): AndroidNativeCamera: YES, use prebuilt libraries
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Other third-party libraries:
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Use IPP: NO
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Use Eigen: YES (ver 3.1.2)
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Use TBB: NO
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Use OpenMP: NO
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Use GCD NO
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Use Concurrency NO
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Use C=: NO
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Use Cuda: NO
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Use OpenCL: YES
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): OpenCL:
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Version: dynamic
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Include path: /hdd2/buildbot/slaves/slave_ardbeg1/50-SDK/opencv/3rdparty/include/opencl/1.2
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Use AMD FFT: NO
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Use AMD BLAS: NO
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Python:
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Interpreter: /usr/bin/python2 (ver 2.7.3)
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Java:
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): ant: /usr/bin/ant (ver 1.8.2)
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Java tests: NO
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Tests and samples:
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Tests: NO
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Performance tests: NO
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): C/C++ Examples: NO
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): Install path: /hdd2/buildbot/slaves/slave_ardbeg1/50-SDK/build/builds/o4a/install
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): cvconfig.h is in: /hdd2/buildbot/slaves/slave_ardbeg1/50-SDK/build/builds/o4a
06-17 03:25:59.821: I/OpenCVManager/Helper(2647): —————————————————————–
06-17 03:25:59.821: D/OpenCVManager/Helper(2647): Init finished with status 0
06-17 03:25:59.821: D/OpenCVManager/Helper(2647): Unbind from service
06-17 03:25:59.930: D/OpenCVManager/Helper(2647): Calling using callback
06-17 03:25:59.930: I/Sample::Feature Detection::Activity(2647): OpenCV loaded successfully
06-17 03:25:59.930: D/dalvikvm(2647): Trying to load lib /data/app-lib/com.example.test-1/libnative-util.so 0x40ce1fb8
06-17 03:26:00.100: D/dalvikvm(2647): Added shared lib /data/app-lib/com.example.test-1/libnative-util.so 0x40ce1fb8
06-17 03:26:00.100: D/dalvikvm(2647): No JNI_OnLoad found in /data/app-lib/com.example.test-1/libnative-util.so 0x40ce1fb8, skipping init
06-17 03:26:00.120: I/Choreographer(2647): Skipped 787 frames! The application may be doing too much work on its main thread.
06-17 03:26:00.400: I/Choreographer(2647): Skipped 52 frames! The application may be doing too much work on its main thread.
06-17 03:26:00.461: D/gralloc_goldfish(2647): Emulator without GPU emulation detected.
06-17 03:26:02.791: D/dalvikvm(2647): GC_CONCURRENT freed 1127K, 28% free 3430K/4708K, paused 6ms+5ms, total 82ms
06-17 03:26:03.120: D/dalvikvm(2647): GC_CONCURRENT freed <1K, 17% free 3918K/4708K, paused 6ms+4ms, total 43ms
06-17 03:26:03.120: D/dalvikvm(2647): WAIT_FOR_CONCURRENT_GC blocked 29ms
06-17 03:26:03.160: I/Choreographer(2647): Skipped 299 frames! The application may be doing too much work on its main thread.
06-17 03:26:03.240: D/dalvikvm(2647): GC_CONCURRENT freed <1K, 7% free 4406K/4708K, paused 6ms+22ms, total 98ms

下面做點可以看得見的效果,圖像哪種處理最簡單??把一個彩色圖轉換成灰度圖,並顯示!這裏直接調用API就能完成,還沒有在Native C++ code中具體操作。運行示意圖如下:
這裏寫圖片描述
點擊按鈕後:
這裏寫圖片描述


代碼在GitHub上


參考:
1.OpenCV4Android SDK
2.Android Development with OpenCV
3.base operand of ‘->’ has non-pointer type ‘JNIEnv’
4.Working With Java Arrays in Native Methods
5.cvtColor

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章