정보공간_1

[4기 강남 김태협] Android OpenCV JNI 설치 방법 본문

IT 놀이터/Elite Member Tech & Talk

[4기 강남 김태협] Android OpenCV JNI 설치 방법

알 수 없는 사용자 2013. 11. 30. 15:40

안녕하세요. 강남 멤버십 22-2기 김태협 입니다.

 

이번 블로그 포스팅 내용은 Android OpenCV를 위한 JNI 설치에 관한 내용입니다. 다들 아시겠지만 혹시 OpenCV를 잘 모르시는 분들이 계실 수 있어, 간단히 OpenCV에 대해서 잠시 설명하고 갈까합니다 :D


 

1. OpenCV

 

 

OpenCV는 인텔에서 영상처리 및 컴퓨터비전을 위한 목적으로 만들어진 라이브러리 입니다. 현재에도 영상 처리에 관련한 많은 알고리즘들이 검증되고 추가되고 있으며 구조 또한 이전의 C스타일 방식에서 C++인 객체지향으로 바뀌어 더욱 효율적으로 프로그래밍을 할 수 있게 되었습니다. 무엇보다 문서화가 정말 잘 되어 있어서 영상처리에 관심 있는 누구나 쉽게 시작할 수 있는 장점이 있습니다.

 

 

2. Android OpenCV

 

 

지금 부터는 Android OpenCV에 대해서 알아보도록 하겠습니다. OpenCVAndroid를 지원하기 때문에 스마트 폰에서도 OpenCV 라이브러리를 이용하여 영상처리 프로그램을 구현할 수 가 있습니다. Android OpenCVJava 스타일과 JNI스타일 두 가지 방법으로 사용할 수가 있습니다. Java 스타일은 Java로 포팅된 OpenCV 라이브러리를 사용하는 방법으로 Android와 높은 호완성과 쉬운 구현이 장점입니다. 하지만 중간에 Java API를 거쳐 OpenCV 라이브러리르 호출 해야하기 때문에 속도가 느린 단점이 발생합니다. JNI버전은 이와 다르게 어플리케이션에서 직접 JNI Call을 통해 OpenCV라이브러리를 호출하게 되어 속도가 빠른 장점이 있습니다.(Java에서 직접 C++함수 호출 가능) 따라서 퍼포먼스가 중요한 Android 영상처리 프로그램을 구현하신다면, Java버전보다는 JNI을 이용하여 구현하는 것이 올은 방법이 되겠지요.

 

 

3. Android OpenCV를 위한 JNI설치 및 예제 분석

 

지금부터는OpenCV를 위한 JNI 설치 과정을 설명하도록 하겠습니다. JNI를 이용하여 Android OpenCV를 하기위해서 다음 항목들이 설치가 되어야합니다.

 

        1. Android SDK

      2. Android NDK

      3. JDK

      4. Cygwin

      5. Eclipse

      6. OpenCV

 

위 항목만 보더라도 Android에서 JNI를 이용하여 OpenCV를 하기위해 설치해야 할 것들이 참 많이 있는 것을 알 수 있습니다.  하지만 설치 과정은 더욱 까다롭습니다. JNI를 이용하기 위해 저 모든 항목들을 맞물려 돌아갈 수 있도록 세부 설정들을 해줘야 하기 때문입니다.

그래서 여러분들께 Nvida에서 개발한 Tegra Android Developer Pcak SDK(TADP)를 소개할까 합니다. TADP를 설치하면 한번에 쉽게 OpenCV JNI 환경을 구축 할 수 가 있습니다.

 

Nvidia Tegra Android Developer Pack

 

위 그림처럼 Nvidia 개발자 홈페이지에서 TADP를 다운로드 링크를 확인할 수 있습니다. 그리고 설치를 하고 이클립스 실행하면 다음과 같은 Android OpenCV JNI 예제 프로젝트가 있는 볼 수있습니다 :D

  

 

프로젝트 목록에는 Java만 이용하여 OpenCV를 사용하는 예제, JNI만 이용하여 OpenCV를 사용하는 예제 그리고 Java와 JNI를 혼용하여 사용하는 예제 등 다양한 예제가 있습니다. 이번 포스팅에서 소개하는 내용은 JNI이기 때문에 Android OpenCV JNI 예제를 살펴 보도록 하겠습니다.

Add Native OpenCV라는 예제를 보면, 오른쪽 빨간색 네모처럼 JNI에 관련된 환경이 구축되어있는 것을 확인 할 수 있습니다. 여기서 jni폴더는 Java에서 호출할 C++ 함수를 공유라이브러리로 빌드하기 위한 파일들이 위치한 폴더입니다. C++로 되어있는 함수를 Java에서 호출하기 위해서는 공유라이블러리 형태로 되어있어야 하기 때문입니다.

 

 

 

Android.mk 파일을 살펴보면, 빌드할 소스파일과 공유라이브러 이름이 있는 것을 확인할 수 가있습니다. 만약 빌드해야할 cpp 파일이 여러개라면, LOCAl_SRC_FILES에 추가하면 됩니다.

 

 

위 그림은 Java에서 호출할 FindFeature라는 C++ 함수를 작성하기 위해 JNI 프로토콜을 이용하여 함수를 선언 및 정의한 내용입니다. Java에서 C++ 함수를 호출하기 위해서는 위와 같은 JNI 프로토콜을 준수하여야 합니다.

 

 

위 그림은 Java에서 C++로 작성한 FindFeatures 함수를 호출하기 위한 선언 입니다. Java에서 C++ 함수를 호출하기 위해서 함수 선언부 앞에  native라는 키워드를 붙여줘야 합니다.

그리고 다음과 같이 System.LoadLibrary("native_sample") 함수를 이용하여 공유라리브러리를 로드하면 Android에서 JNI를 이용하여 C++로 작성된 OpenCV 소스를 사용할 수가 있습니다.

 

 

지금 까지 영상처리 퍼포먼스를 높이기 위해 Android에서 JNI를 이용하여 OpenCV 라이브러리를 사용하는 방법에 대해서 알아보았습니다.  여러분들도 모바일에서 영상처리 프로그래밍에 관심이 있으시다면 한번 Android OpenCV JNI를 사용해보시기 바랍니다.

 

그럼, 다음 블로그 포스팅 때 다시 찾아 뵙겠습니다.

감사합니다.