37
©SIProp Project, 2006-2008 1 How to Build & Use OpenCL on OpenCV & Android NDK Noritsuna Imamura [email protected]

How to Build & Use OpenCL on OpenCV & Android NDK

Embed Size (px)

DESCRIPTION

This manual is “How to Build” manual for OpenCV with OpenCL for Android. If you want to “Use OpenCL on OpenCV” ONLY, Please see http://github.com/noritsuna/OpenCVwithOpenCL4AndroidNDKSample

Citation preview

Page 1: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 1

How to Build & Use OpenCLon OpenCV & Android NDK

Noritsuna Imamura

[email protected]

Page 2: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 2

!!!!!!ATTENTION!!!!!!

This manual is “How to Build” manual.

If you want to “Use OpenCL on OpenCV” ONLY,

Please see

http://github.com/noritsuna/OpenCVwithOpenCL4AndroidNDKSample

Page 3: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 3

How to Build OpenCL on OpenCV

for Android NDK

Page 4: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 4

Download OpenCV & NDK tool

› wget https://github.com/Itseez/opencv/archive/2.4.10.1tar.gz

› tar zxfv 2.4.10.1.tar.gz

› mkdir ~/android/› cd ~/android/› wget http://dl.google.com/android/android-

sdk_r23.0.2-linux.tgz› wget

http://dl.google.com/android/ndk/android-ndk-r10c-linux-x86_64.bin

› tar zxfv android-sdk_r23.0.2-linux.tgz› ./android-ndk-r10c-linux-x86_64.bin

Page 5: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 5

Edit Setup File

./opencv-2.4.10.1/platforms/scripts/cmake_android_arm.sh

Add WITH_EIGEN=off option.Currently version has some bugs.

› cmake -DWITH_EIGEN=OFF -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON -DCMAKE_TOOLCHAIN_FILE=../android/android.toolchain.cmake $@ ../..

Page 6: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 6

Set Path to SDK/NDK

› export ANDROID_NDK=~/android/android-ndk-r10c

› export ANDROID_SDK=~/android/android-sdk-linux

Page 7: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 7

Add “SO loading“ func for Android 1/3

Change “SO loading“ func for Linux to this funcwithout Android.

~/opencv-2.4.10.1/modules/ocl/src/cl_runtime/cl_runtime.cpp

› #if defined(__linux__)↓

› #if defined(__linux__) && !defined(__ANDROID__)

Page 8: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 8

Add “SO loading“ func for Android 2/3

Add “SO loading“ func for Android. (continue to next page)

~/opencv-2.4.10.1/modules/ocl/src/cl_runtime/cl_runtime.cpp

› #if defined(__ANDROID__)› #include <dlfcn.h>› #include <sys/stat.h>

› #if defined(__ARM_ARCH_8A__) || defined(_X64_)› static const char *default_so_paths[] = {› "/system/lib64/libOpenCL.so",› "/system/vendor/lib64/libOpenCL.so",› "/system/vendor/lib64/egl/libGLES_mali.so"› };› #else› static const char *default_so_paths[] = {› "/system/lib/libOpenCL.so",› "/system/vendor/lib/libOpenCL.so",› "/system/vendor/lib/egl/libGLES_mali.so"› };› #endif

Page 9: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 9

Add “SO loading“ func for Android 3/3

› static int access_file(const char *filename)› {› struct stat buffer;› return (stat(filename, &buffer) == 0);› }

› static void* GetProcAddress (const char* name)› {› static void* h = NULL;› unsigned int i;› if (!h)› {› const char* name;› for(i=0; i<(sizeof(default_so_paths)/sizeof(char*)); i++)› {› if(access_file(default_so_paths[i])) {› name = (char *)default_so_paths[i];› h = dlopen(name, RTLD_LAZY);› if (h) break;› }› }› if (!h)› return NULL;› }

› return dlsym(h, name);› }› #define CV_CL_GET_PROC_ADDRESS(name) GetProcAddress(name)› #endif

Page 10: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 10

Execute Auto Config & make

This Script make Makefile for OpenCV.

In “~/opencv-2.4.10.1/platforms/scripts/build_android_arm.sh”

Make !!!

› cd ~/opencv-2.4.10.1/platforms/scripts/› ./cmake_android_arm.sh

› cd ~/opencv-2.4.10.1/platforms/scripts/build_android_arm/

› make

Page 11: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 11

Where are Made Files?

OpenCV Libs.

In “~/opencv-2.4.10.1/platforms/build_android_arm/lib”

highgui

core

etc...

3rd Party Libs for OpenCV.

In “~/opencv-2.4.10.1/platforms/build_android_arm/3rdparty/lib”

libIlmImf

libjasper

libjpeg

libpng

libtiff

Page 12: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 12

Copy libs to sample program

OpenCV Libs.

cp ~/opencv-2.4.10.1/platforms/build_android_arm/lib/armeabi-v7a/* ~/opencv-2.4.10.1/samples/android/native-activity/libs_opencv/

3rd Party Libs for OpenCV.

cp ~/opencv-2.4.10.1/platforms/build_android_arm/3rdparty/lib/armeabi-v7a/* ~/opencv-2.4.10.1/samples/android/native-activity/libs_opencv/

Page 13: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 13

How to Use OpenCL on OpenCV

for Android NDK(Native App)

Page 14: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 14

Download Sample Source Code

http://github.com/noritsuna/OpenCVwithOpenCL4AndroidNDKSample

Based OpenCV-2.4.10.1 & Android 4.4

Made Android Native Activity.

Convert RGB Color Image to Black&White Image.

Page 15: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 15

Native Application

NDK wo/ADT

Standard Android Application for C/C++

Only C/C++ on LimitedLibrary Layer

Advantage

Only C/C++

DirectCall C/C++ API

Dis-Advantage

Use a few Android Tools

A few Docs from Google Developer Site & Blogs

APK File(Your Application)(C/C++)

Library Layer (C/C++)

Kernel/Driver Layer(C/ASM)

Call as C/C++ APIs

Call as SysCall(C/ASM)

Call Stack

Page 16: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 16

How to Make this Sample Source Code from OpenCV’s Sample Project

Page 17: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 17

Use NativeActivity of OpenCV

This Sample uses Only C/C++ Code.

~/opencv-2.4.10.1/samples/android/native-activity

Structure of NativeActivity

AndroidManifest.xml <- Property File for Android

res <- Directory that has Resource file(Image,Voice)

jni <- Directory that has files for NDKAndroid.mk <- make file of NDK

Application.mk <- property file of NDK

native.cpp <- Sample App

Other Files/Dir, don’t use.

Page 18: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 18

Edit AndroidManifest.xml

Replace “application” Section

1. <application android:label="@string/app_name" android:hasCode="false">

2. <activity android:name="android.app.NativeActivity"3. android:label="@string/app_name"4.

android:configChanges="orientation|keyboardHidden">5. <!-- Tell NativeActivity the name of or .so -->6. <meta-data android:name="android.app.lib_name"7. android:value="native_activity" />8. <intent-filter>9. <action

android:name="android.intent.action.MAIN" />10. <category

android:name="android.intent.category.LAUNCHER" />11. </intent-filter>12. </activity>13. </application>

Page 19: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 19

About AndroidManifest.xml

API Level

Permission

1. <!-- This is the platform API where NativeActivity was introduced. -->

2. <uses-sdk android:minSdkVersion=“9" />

1. <uses-permission android:name="android.permission.CAMERA"/>

Page 20: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 20

Create jni/Android.mk 1/9

1. Delete jni/Android.mk & Create the new jni/Android.mk

2. Set LOCAL_PATH & include

1. LOCAL_PATH := $(call my-dir)

2. include $(CLEAR_VARS)

Page 21: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 21

Create jni/Android.mk 2/9

1. Set OpenCV’s Modules & Libs

1. OPENCV_MODULES:=contrib legacy ml stitching superres objdetect ts videostabvideo photo calib3d features2d highguiimgproc flann ocl core androidcamera

2. OPENCV_3RDPARTY_COMPONENTS:=assetmanager tbb libjpeg libpng libtiff libjasperIlmImf

3. OPENCV_CAMERA_MODULES:= native_camera_r2.2.0 native_camera_r2.3.3 native_camera_r3.0.1 native_camera_r4.0.0 native_camera_r4.0.3 native_camera_r4.1.1 native_camera_r4.2.0 native_camera_r4.3.0 native_camera_r4.4.0

Page 22: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 22

Create jni/Android.mk 3/9

Set Loading OpenCV Libs Function

1. $(foreachmodule,$(OPENCV_MODULES),$(eval $(call add_opencv_module,$(module))))

1. define add_opencv_module2. include $(CLEAR_VARS)3. LOCAL_MODULE:=opencv_$14.

LOCAL_SRC_FILES:=../libs_opencv/libopencv_$1.a

5. include $(PREBUILT_STATIC_LIBRARY)6. endef

Page 23: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 23

Create jni/Android.mk 4/9

Set Loading OpenCV Libs Function

1. $(foreachmodule,$(OPENCV_3RDPARTY_COMPONENTS),$(eval $(call add_opencv_3rdparty_component,$(module))))

1. define add_opencv_3rdparty_component2. include $(CLEAR_VARS)3. LOCAL_MODULE:=$14.

LOCAL_SRC_FILES:=../libs_opencv/lib$1.a5. include $(PREBUILT_STATIC_LIBRARY)6. endef

Page 24: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 24

Create jni/Android.mk 5/9

Set Loading AndroidCamera Libs Function

1. $(foreachmodule,$(OPENCV_CAMERA_MODULES),$(eval $(call add_opencv_camera_module,$(module))))

1. define add_opencv_camera_module2. include $(CLEAR_VARS)3. LOCAL_MODULE:=$14.

LOCAL_SRC_FILES:=../libs_opencv/lib$1.so5. include $(PREBUILT_SHARED_LIBRARY)6. endef

Page 25: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 25

Create jni/Android.mk 6/9

Set loading info lib

1. include $(CLEAR_VARS)2. LOCAL_MODULE:=opencv_info3. LOCAL_SRC_FILES:=../libs_opencv/libopenc

v_info.so4. include $(PREBUILT_SHARED_LIBRARY)

Page 26: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 26

Create jni/Android.mk 7/9

Set Include Dir

Set Module name & Source Code

OpenCVwithOpenCL4AndroidNDKNativeActivity.cpp

1. include $(CLEAR_VARS)

2. LOCAL_C_INCLUDES+=./jni/include

3. LOCAL_MODULE := OpenCV_CL4. LOCAL_SRC_FILES :=

OpenCVwithOpenCL4AndroidNDKNativeActivity.cpp

Page 27: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 27

Create jni/Android.mk 8/9

Set Loading Lib & OpenCV Lib

LOCAL_LDLIBS-lm -llog -lc -ldl -lz -landroid

LOCAL_STATIC_LIBRARIES$(foreach mod, $(OPENCV_MODULES), opencv_$(mod)) $(OPENCV_3RDPARTY_COMPONENTS)

1. LOCAL_LDLIBS += -lm -llog -lc -ldl -lz -landroid

2. LOCAL_STATIC_LIBRARIES := android_native_app_glue $(foreach mod, $(OPENCV_MODULES), opencv_$(mod)) $(OPENCV_3RDPARTY_COMPONENTS)

Page 28: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 28

Create jni/Android.mk 9/9

Set Library Type

Make SO libBUILD_SHARED_LIBRARY

Set Loading Android module

Use “native_app_glue” module$(call import-module,android/native_app_glue)

1. include $(BUILD_SHARED_LIBRARY)

2. $(call import-module,android/native_app_glue)

Page 29: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 29

Setup/Make Build.xml 1/2

Making Setting File for Android using ANT

Today, Development on CUI Only!!!Don’t use Eclipse!

› android list target› Available Android targets:› ----------› id: 1 or "android-9"› Name: Android 2.3.1› Type: Platform› API level: 9› Revision: 2› Skins: WQVGA400, QVGA, HVGA, WVGA800 (default), WVGA854› ABIs : armeabi› ----------› id: 2 or "android-18"› Name: Android 4.3› Type: Platform› API level: 18› Revision: 2› Skins: WXGA800, WQVGA400, QVGA, WQVGA432, WXGA800-7in, WVGA800

(default), HVGA, WXGA720, WSVGA, WVGA854› ABIs : armeabi-v7a› ----------

Page 30: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 30

Setup/Make Build.xml 2/2

Make Build.xml

› android update project --path . --target 2

Page 31: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 31

Build NativeActivity

Build C/C++ Source Codes

Make APK File

› ndk-build [clean all]

› ant [debug|release]

Page 32: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 32

Install NativeActivity.apk

Install APK File

UnInstall APK File

Show Log

› adb install bin/NativeActivity-debug.apk

› adb logcat

› adb uninstall com.example.native_activity

Page 33: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 33

adb(Android Debug Bridge)

Functions

Shell on Android Deviceadb shell

Show Connected Android Devicesadb devices

Install/Uninstall APK Fileadb install/uninstall [App Name]/[Package Name]

Send/Get File to/from Android Deviceadb push/pull [from File Path] [to File Path]

Show Log (DDMS)adb logcat

Page 34: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 34

Quick Explanation to OpenCL

1. void android_main(android_app* app) {2. (snip)3. cv::Mat drawing_frame;4. (snip)

5. colorSampleImage = imread(file_path);6. (snip)

7. // Create Mat Object for OpenCL8. cv::ocl::oclMat oclIn(colorSampleImage), oclOut;9. // Change Color RGB->Black&White on OpenCL10. cv::ocl::cvtColor(oclIn, oclOut, cv::COLOR_BGR2GRAY);11. // Download Mat Object for OpenCL to Mat for CPU12. oclOut.download(drawing_frame); 13.14. engine_draw_frame(&engine, drawing_frame);

Page 35: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 35

How to Set up OpenCL Driver

adreno-3xx: Qualcomm's Adreno 3xx GPUs

mali-t6xx: ARM's Mali-T6xx GPUs

Page 36: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 36

Download OpenCL Drivers

OpenCL Drivers was deleted since 4.2

adreno-3xx: Qualcomm's Adreno 3xx GPUs

mali-t6xx: ARM's Mali-T6xx GPUs

Download from:

https://github.com/madeye/opencl-android-proprietary

Page 37: How to Build & Use OpenCL on OpenCV & Android NDK

©SIProp Project, 2006-2008 37

Set up Drivers to your Android

Ex. adreno-3xx: Qualcomm's Adreno 3xx GPUs

1. $ adb push kitkat/system/vendor/lib /sdcard/2. $ adb shell3. $ su4. # mount -o rw,remount -t yaffs2 /dev/block/mtdblock3

/system5. # cp /sdcard/libOpenCL.so /system/vendor/lib/6. # cp /sdcard/libllvm-a3xx.so /system/vendor/lib/7. # chmod 644 /system/vendor/lib/libOpenCL.so8. # chmod 644 /system/vendor/lib/libllvm-a3xx.so