[캡스톤] 안드로이드에서 OpenCV 사용하기

이정연·2023년 5월 4일
0

Solution 1 블록 다이어그램

솔루션 1로 프로젝트 목적을 달성했지만 통신 방법 특성상 많은 지연 시간이 발생

따라서, 통신부를 제거하고 안드로이드 내부에서 구현하기로 결정

안드로이드 내부에서 카메라를 사용하기 위하여 Java에서 openCV를 구현하는 방법을 탐색

openCV In JAVA

Java에서 openCV 라이브러리를 이용하는 방법은 두 가지가 있다. 하나는 openCV에서 자바로 바인딩해준 라이브러리를 쓰는 방법과 네이티브 코드(C/C++)로 작성된 openCV를 끌어다 쓰는 방법

우리 팀은 후자를 선택했다.

Why Native CODE?

네이티브 코드에서 OpenCV 라이브러리를 사용하는 경우에는 C/C++로 코드를 작성하고, 컴파일하여 머신 코드로 변환한다. 이 때 머신 코드는 하드웨어에 직접 실행되기 때문에 네이티브 코드는 일반적으로 자바 코드보다 빠르다.

따라서, 효율성 측면에서 native code로 openCV를 사용했고 이를 위하여 NDK & JNI를 이용했다.

openCV를 활용하여 테스트 해본 장면

방법

ndk-build

안드로이드 스튜디오에서 JNI를 사용하기 위해서는 다음과 같은 과정이 필요합니다.

  1. 네이티브 코드 작성

    • 안드로이드 스튜디오에서 C/C++ 소스코드를 작성합니다.
    • 일반적으로 app/src/main/jni 디렉토리를 생성하여 소스코드를 저장합니다.
  2. Android.mk 파일 작성

    • 네이티브 코드를 컴파일하기 위한 Android.mk 파일을 작성합니다.
    • Android.mk 파일은 컴파일에 필요한 모듈, 소스코드, 헤더파일 등을 정의합니다.
  3. Application.mk 파일 작성

    • 네이티브 코드 컴파일 시 사용할 설정 정보를 정의하는 Application.mk 파일을 작성합니다.
  4. 라이브러리 파일(.so) 생성

    • 안드로이드 스튜디오에서는 ndk-build를 사용하여 네이티브 코드를 컴파일하고, 라이브러리 파일(.so)을 생성합니다.
  5. JNI 코드 작성

    • 자바 코드에서 네이티브 메서드를 호출하려면 JNI 코드를 작성해야 합니다.
    • JNI 코드에서는 네이티브 라이브러리를 로드하고, 네이티브 메서드를 호출합니다.
  6. 네이티브 메서드 호출

    • 자바 코드에서 JNI 코드를 사용하여 네이티브 메서드를 호출합니다.
    • 네이티브 코드가 실행되고, 실행 결과를 자바로 반환합니다.

안드로이드 스튜디오에서 JNI를 사용하기 위해서는 ndk-build 툴을 설치하고, Android.mk 및 Application.mk 파일을 작성해야 합니다. 이를 통해 네이티브 코드를 컴파일하고, 라이브러리 파일을 생성할 수 있으며, 자바 코드에서 JNI 함수를 사용하여 네이티브 코드를 호출할 수 있습니다.

최근 안드로이드 스튜디오는 CMake를 사용하여 JNI 코드를 작성하는 방법을 제공하고 있습니다. CMake를 사용하면 ndk-build보다 더 간편하고 유연하게 JNI 코드를 작성할 수 있습니다.

CMake

CMake를 사용하여 안드로이드 스튜디오에서 JNI 코드를 작성하는 방법은 다음과 같습니다.

  1. CMakeLists.txt 파일 작성

    • CMakeLists.txt 파일은 CMake 빌드 시스템에서 사용되는 빌드 스크립트 파일입니다.
    • 안드로이드 스튜디오에서는 app/src/main/cpp 디렉토리에 CMakeLists.txt 파일을 작성합니다.
    • CMakeLists.txt 파일에는 빌드에 필요한 모듈, 라이브러리, 소스코드 등을 정의합니다.
  2. C++ 소스코드 작성

    • C++로 구현할 JNI 메서드를 작성합니다.
    • 소스코드는 app/src/main/cpp 디렉토리에 저장합니다.
  3. 자바 코드 작성

    • JNI 메서드를 호출하는 자바 코드를 작성합니다.
  4. CMake 프로젝트 빌드

    • 안드로이드 스튜디오에서 CMake 프로젝트를 빌드합니다.
    • 빌드 결과로 라이브러리 파일(.so)이 생성됩니다.

안드로이드 스튜디오에서 CMake를 사용하여 JNI 코드를 작성하는 방법은 ndk-build와 달리 안드로이드 스튜디오에서 지원하는 빌드 시스템 중 하나이므로 더욱 쉽고 간편합니다. 이 방법을 사용하면 CMakeLists.txt 파일을 작성하여 빌드 시스템을 구성하고, C++로 구현한 JNI 메서드를 쉽게 사용할 수 있습니다.


ndk-build와 CMake의 차이

결론적으로 말하면 CMake가 훨씬 작성하기 간결하다.

ndk-build는 Android.mk, Application.mk, 라이브러리 파일을 작성해주어야 하는데 CMake는 CMakeLists.txt 파일 하나만 작성해주면 되기 때문이다.

결과 화면

👆🏻 openCV 라이브러리를 CMakeLists.txt 파일에 작성한 화면

사용자 화면을 굳이 보여줄 필요가 없기 때문에 setVisibility 메서드의 옵션을 INVISIBLE로 부여함. (카메라 백그라운드 실행)

첨언

미디어파이프에서 카메라 입력 라이브러리를 지원해주는 사실을 모르고 OpenCV를 이용했었다.

OpenCV는 미디어파이프와 병합 과정에서 충돌도 발생하고 미디어파이프에서 이미 카메라 입력을 지원해주는데 굳이 OpenCV를 고집할 필요가 없어서

import com.google.mediapipe.solutioncore.CameraInput

CameraInput 메서드를 사용해 카메라 입력을 받았다.

profile
0x68656C6C6F21

0개의 댓글