Development record of developer who study hard everyday.

, , ,

1. 안드로이드에서 OpenCV 라이브러리와 ndk 사용하기

 안드로이드에서 OpenCV 라이브러리와 ndk 사용하기


안드로이드 개발블로그

이번에 들어가는 신규프로젝트에서 OpenCV 라이브러리를 사용하여 이미지를 다뤄야했다.

OpenCV 라이브러리를 안드로이드에서 어떻게 사용하는지 살펴보자.


1. OpenCV sdk 다운로드

https://github.com/opencv/opencv/releases

위 링크로 가서 openCV 라이브러리를 다운로드하자.

글 작성하는 시점 기준 최신버전은 4.8.0이다.


2.  Import OpenCV

import OpenCV

File - New - Import Module 클릭


find opencv sdk file

폴더 아이콘을 클릭해서 OpenCV sdk가 저장되어있는 경로를 설정하고 모듈의 이름을 변경한다.

나는 ":opencv"라고 했다.


dependency 추가

File - ProjectStructure 클릭


openCV implementation

Dependencies - app 클릭해서 +버튼 누르기


openCV dependency 추가

Module Dependency 클릭


openCV 클릭

openCV 클릭하고 ok 클릭


OpenCV 추가 완료

OpenCV 모듈을 추가하고 dependency 추가도 완료했다!


3. ndk 추가

OpenCV 라이브러리를 모듈로 추가한 후, OpenCV의 다양한 이미지 처리 함수를 사용해도 좋지만 ndk를 사용하여 OpenCV의 C++로 정의된 함수들을 사용해보자.

아무래도 JAVA로된 OpenCV의 함수들보다 성능이 더 좋다고한다.

jni폴더 만들기

왼쪽 메뉴를 Android에서 Project로 바꿔준 후 main폴더 아래에 jni폴더를 만든다.


native 함수 정의

OpenCVUtil 클래스를 만들고 안에 Java로 native 함수를 선언한다.


External Tool javah 정의

File - settings 또는 Ctrl + Alt + S 눌러서 Settings 창에 들어간 후 External Tools를 추가한다

Name은 javah

Program은 자바버전이 설치된경로\javah.exe

(예: C:\Users\Boo\.jdks\corretto-1.8.0_322\bin\javah.exe )

Arguments는 -classpath $Classpath$ -v -jni $FileClass$

Working directory는 $ProjectFileDir$\app\src\main\jni

로 설정하고 ok버튼을 눌러준다.

참고로 이건 윈도우 기준이다;;


javah 실행

Java native 함수를 선언한 OpenCVUtil 클래스를 마우스 오른쪽 버튼 클릭 - External Tools - javah 클릭

그럼 전에 설정한 javah 명령어가 실행이 되어 jni 폴더에 c++헤더파일이 만들어진다.


c++ 소스파일 만들기

app/src/main/jni 폴더 아래에 C++ 소스파일을 만든다.

파일명은 main으로 했다.


#include <jni.h>
#include "com_boo_opencv_OpenCVUtil.h"

#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/types_c.h>

using namespace cv;
using namespace std;

extern "C"{
JNIEXPORT void JNICALL Java_com_boo_opencv_OpenCVUtil_ConvertRGBtoGray
(JNIEnv *env, jclass instance, jlong matAddrInput, jlong matAddrResult){
Mat &matInput = *(Mat *)matAddrInput;
Mat &matResult = *(Mat *)matAddrResult;

cvtColor(matInput, matResult, CV_RGBA2GRAY);
}
}

헤더파일에 정의된 함수를 main.cpp 파일에 정의해준다.


이제 C++헤더파일과 소스파일을 ndk로 빌드해서 AndroidProject에서 사용할 수 있게(참조 가능하게) 만들어야한다.


sdk tool 들어가기

Tools - SDK Manager 클릭


ndk 설치

Android Sdk - SDK Tools에 들어가서 NDK를 설치해준다.

버전은 꼭 최신버전이 아니여도 좋다.


local.properties에 ndk경로 적기

그리고 local.properties에 설치경로를 작성한다.


jni폴더에 Androi.mk 파일 만들기

jni폴더에 Androi.mk 파일 만들기

app/src/main/jni 폴더에 Android.mk파일을 만든다.


LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

#opencv library
OPENCVROOT := C:/Users/Boo/AndroidStudioProjects/SampleOpenCV/OpenCV-android-sdk
OPENCV_CAMERA_MODULES := on
OPENCV_INSTALL_MODULES := on
OPENCV_LIB_TYPE := SHARED
include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk

LOCAL_MODULE := native-lib
LOCAL_SRC_FILES := main.cpp
LOCAL_LDLIBS += -llog

include $(BUILD_SHARED_LIBRARY)

Android.mk파일의 내용은 위와 같다.

OPENCVROOT : 다운받은 OpenCV-android-sdk의 파일경로

OPENCV_CAMERA_MODULES : 카메라 모듈 설정

OPENCV_INSTALL_MODULES : 모듈 설치 설정

OPENCV_LIB_TYPE : OpenCV 라이브러리 타입 설정

LOCAL_MODULE : 네이티브 모듈 이름(소스상에서 이 이름을 load하여 C++함수를 사용)

LOCAL_SRC_FILES : C++ 소스파일 이름

LOCAL_LDLIBS : 로그 설정


마찬가지로 app/src/main/jni 폴더에 Application.mk 파일을 만든다.

Application.mk 파일의 내용은 아래와 같다.

#APP_OPTIM := debug
APP_ABI := all
APP_PLATFORM := android-21

APP_STL := c++_static
APP_CPPFLAGS := -frtti -fexceptions
NDK_TOOLCHAIN_VERSION := clang

APP_BUILD_SCRIPT := Android.mk

APP_ABI : 적용할 abi 설정

APP_PLATFORM : minSdk 설정과 같다.

APP_BUILD_SCRIPT : 앱에서 빌드할 Android.mk 스크립트 파일


이제 거의 끝났다.

build.gradle(app수준) 파일에 ndk로 빌드할 파일을 명시해준다.

android {
externalNativeBuild {
ndkBuild {
path file('src/main/jni/Android.mk')
}
}
}


Terminal로 ndk 빌드 시작

경로를 프로젝트파일경로/app/src/main/jni로 이동한다.

터미널에서 local.properties에 적어준 ndk 설치경로에 있는 ndk-build.cmd 파일을 실행한다!


ndk빌드 완료

ndk 빌드 완료!!


이제 native로 정의한 ConvertRGBtoGray 함수를 사용할 수 있다!

Share:

댓글 없음:

댓글 쓰기