안드로이드에서 OpenCV 라이브러리와 ndk 사용하기
이번에 들어가는 신규프로젝트에서 OpenCV 라이브러리를 사용하여 이미지를 다뤄야했다.
OpenCV 라이브러리를 안드로이드에서 어떻게 사용하는지 살펴보자.
1. OpenCV sdk 다운로드
https://github.com/opencv/opencv/releases
위 링크로 가서 openCV 라이브러리를 다운로드하자.
글 작성하는 시점 기준 최신버전은 4.8.0이다.
2. Import OpenCV
File - New - Import Module 클릭
폴더 아이콘을 클릭해서 OpenCV sdk가 저장되어있는 경로를 설정하고 모듈의 이름을 변경한다.
나는 ":opencv"라고 했다.
3. ndk 추가
OpenCV 라이브러리를 모듈로 추가한 후, OpenCV의 다양한 이미지 처리 함수를 사용해도 좋지만 ndk를 사용하여 OpenCV의 C++로 정의된 함수들을 사용해보자.
아무래도 JAVA로된 OpenCV의 함수들보다 성능이 더 좋다고한다.
왼쪽 메뉴를 Android에서 Project로 바꿔준 후 main폴더 아래에 jni폴더를 만든다.
OpenCVUtil 클래스를 만들고 안에 Java로 native 함수를 선언한다.
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버튼을 눌러준다.
참고로 이건 윈도우 기준이다;;
Java native 함수를 선언한 OpenCVUtil 클래스를 마우스 오른쪽 버튼 클릭 - External Tools - javah 클릭
그럼 전에 설정한 javah 명령어가 실행이 되어 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에서 사용할 수 있게(참조 가능하게) 만들어야한다.
Android Sdk - SDK Tools에 들어가서 NDK를 설치해준다.
버전은 꼭 최신버전이 아니여도 좋다.
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')
}
}
}
경로를 프로젝트파일경로/app/src/main/jni로 이동한다.
터미널에서 local.properties에 적어준 ndk 설치경로에 있는 ndk-build.cmd 파일을 실행한다!
이제 native로 정의한 ConvertRGBtoGray 함수를 사용할 수 있다!
댓글 없음:
댓글 쓰기