세모튜브
안드로이드 스튜디오 - Face Detection - OPENCV - samples에서 사용한 방법 본문
opencv sdk : samples에서 사용한 세팅방법에 대해 살펴보자.( compileSdkVersion API 30기준 )
우선 opencv sdk를 다운받자.( opencv-4.4.0-android-sdk 기준 )
안드로이드를 선택하고 sdk를 다운받고 압축을 풀자.
압축을 해제하면 아래와 같이 samples과 sdk가 존재한다.
이제 이 경로에 연습용 프로젝트를 생성하자.
- Empty Activity
- 아래와 같이 설정..
- Save location 경로는 sdk압축을 푼 경로에 맞추자.
- Minimum SDK는 API 21
- Finish -> 아래처럼 구조가 형성되게 하면 된다.
연습용 프로젝트 servicecamera에 필요사항을 설정하자.
- include sdk
Gradle Scripts에서 settings.gradle를 열고 아래처럼 설정하자.
def opencvsdk='../'
include ':opencv'
project(':opencv').projectDir = new File(opencvsdk + '/sdk')
Sync Now 클릭.
- Module Dependency : sdk
File => Project Structure를 선택하고 아래처럼 Dependencies => app => Module Dependency를 선택하자.
- Step 1. opencv 선택 => Step 2. implementation 선택
아래 이미지처럼 opencv가 implementation 되어 있으면 된다. => OK.
- externalNativeBuild 설정
아래 이미지처럼 sdk - samples - face-detection의 jni폴더를 이용한다.
jni폴더를 복사한 후.. ( JNI (Java Native Interface) )
아래 이미지처럼 연습용 프로젝트 servicecamera - app 폴더에 붙혀넣기 하자.
Gradle Scripts에서 build.gradle(Module: app)를 열고 아래처럼 설정하자.
apply plugin: 'com.android.application'
android {
compileSdkVersion 30
buildToolsVersion "30.0.2"
defaultConfig {
.
.
.
externalNativeBuild {
cmake {
arguments "-DOpenCV_DIR=" + project(':opencv').projectDir + "/native/jni",
"-DANDROID_TOOLCHAIN=clang",
"-DANDROID_STL=c++_shared"
targets "detection_based_tracker"
}
}
}
.
.
.
externalNativeBuild {
cmake {
path 'jni/CMakeLists.txt'
}
}
.
.
.
}
dependencies {
.
.
.
implementation project(':opencv')
}
Sync Now 클릭.
아래 이미지처럼 cpp폴더가 생기면 된다.
- AndroidManifest.xml 설정
<activity></activity> 수정
<supports-screens /> 등록
<user-permission, feature /> 등록
.
.
.
<application
.
.
.
<activity android:name="FdActivity"
android:label="@string/app_name"
android:screenOrientation="landscape"
android:configChanges="keyboardHidden|orientation">
.
.
.
</activity>
</application>
<supports-screens android:resizeable="true"
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:anyDensity="true" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" android:required="false"/>
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>
<uses-feature android:name="android.hardware.camera.front" android:required="false"/>
<uses-feature android:name="android.hardware.camera.front.autofocus" android:required="false"/>
</manifest>
- fdActivity.java 만들기
- samples - face-detection에 있는 소스를 복사하자. => detectionbasedtracker.java 같이 복사.
연습용 프로젝트에 붙혀넣기 하자.
아래 이미지처럼 파일이 복사되면 된다.
- 두 파일의 첫줄에 있는 패캐지명 수정하자.
package org.opencv.samples.facedetect; 를 package example.opencv.servicecamera; 로...
- cascade file 추가하자.
samples - face-detection - res - raw 폴더를 복사하자.
연습용 프로젝트에 붙혀넣기 하자.
- layout 파일 복사
samples - face-detection - res - layout - face_detect_surface_view.xml 파일를 복사하자.
연습용 프로젝트에 붙혀넣기 하자.
- JNI소스 수정하기.
JNI (Java Native Interface) 란 ?
- 자바가 다른 언어로 만들어진 어플리케이션과 상호 작용할 수 있는 인터페이스
- 쉽게 말해 Java와 다른 언어를 연동하는 솔루션
DetectionBasedTracker 파일을 열면 아래 이미지처럼 interface 함수에 제대로 적용이 않되어 있다.
DetectionBasedTracker_jni.cpp
DetectionBasedTracker_jni.h
위 2개의 파일에 정의된
Java_org_opencv_samples_facedetect_DetectionBasedTracker_
나의 프로젝트 패케지명으로 모두 수정 하자.
Java_example_opencv_servicecamera_DetectionBasedTracker_
<<수정방법>>
Edit => Find => Replace in Path => Replace All => Replace
컴파일 및 실행
컴파일 및 실행을 하면 정상적으로 실행 된다.
마무리
opencv를 사용하는 다른방법도 있다.
sdk다운후 samples에 있는 프로젝트를 확인하면서 정리해 보았다.