opencv
Android에서 OpenCV 초기화
수색…
비동기 초기화
응용 프로그램을 개발할 때 비동기 초기화를 사용하는 것이 좋습니다. OpenCV Manager 를 사용하여 대상 시스템에 외부 적으로 설치된 OpenCV 라이브러리에 액세스합니다.
비동기 초기화를 구현하는 코드 스 니펫 :
public class MainActivity extends Activity implements CvCameraViewListener2 {
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch(status) {
case LoaderCallbackInterface.SUCCESS:
Log.i(TAG,"OpenCV Manager Connected");
//from now onwards, you can use OpenCV API
Mat m = new Mat(5, 10, CvType.CV_8UC1, new Scalar(0));
break;
case LoaderCallbackInterface.INIT_FAILED:
Log.i(TAG,"Init Failed");
break;
case LoaderCallbackInterface.INSTALL_CANCELED:
Log.i(TAG,"Install Cancelled");
break;
case LoaderCallbackInterface.INCOMPATIBLE_MANAGER_VERSION:
Log.i(TAG,"Incompatible Version");
break;
case LoaderCallbackInterface.MARKET_ERROR:
Log.i(TAG,"Market Error");
break;
default:
Log.i(TAG,"OpenCV Manager Install");
super.onManagerConnected(status);
break;
}
}
};
@Override
public void onResume() {
super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0, this, mLoaderCallback);
}
...
}
이 경우, 우리의 응용 프로그램은 OpenCV Manager와 함께 비동기식으로 작동합니다. 초기화가 끝나면 UI 스레드에서 OnManagerConnected
콜백이 호출됩니다.
이 콜백을 호출하기 전에는 OpenCV 호출을 사용하거나 OpenCV 종속 원시 라이브러리를로드 할 수 없습니다. 성공적인 OpenCV 초기화 후에 OpenCV에 의존하는 고유 한 네이티브 라이브러리를로드하십시오.
기본 BaseLoaderCallback
구현은 응용 프로그램 컨텍스트를 Activity
하고 초기화 실패시 종료하려면 Activity.finish()
메서드를 호출합니다. 이 동작을 재정의하려면 BaseLoaderCallback
클래스의 finish()
메서드를 재정의하고 고유 한 finalization 메서드를 구현해야합니다.
OpenCV 관리자
OpenCV Manager는 최종 사용자 장치에서 OpenCV 라이브러리 바이너리를 관리하기 위해 개발 된 Android 서비스입니다. 동일한 장치에있는 응용 프로그램간에 OpenCV 동적 라이브러리를 공유 할 수 있습니다.
Manager는 다음과 같은 이점을 제공합니다.
- 적은 메모리 사용량 (약 40MB). 모든 응용 프로그램은 서비스의 동일한 바이너리를 사용하며 자체 lib를 내부에 보관하지 않습니다.
- 지원되는 모든 플랫폼에 대한 하드웨어 관련 최적화
- 신뢰할 수있는 OpenCV 라이브러리 소스. OpenCV가있는 모든 패키지는 Google Play 마켓에 게시됩니다.
- 정기적 인 업데이트 및 버그 수정.
유일한 단점은 사용자에게 다운로드 및 추가 앱을 묻는 메시지가 표시되므로 사용자 환경이 약간 저하된다는 것입니다.
자세한 정보 : Android OpenCV Manager
18/10/16 업데이트 됨 :
Play 스토어에 배포 된 OpenCV Manager 버전의 버그가 있습니다 (21/09/15 업데이트 됨).
OpenCV 3.1.0 버전에만 영향을줍니다. OpenCV 함수를 실행할 때SIGSEGV
오류가 발생합니다. 안드로이드 SDK로 배포 된 버전은 잘 동작합니다 (OpenCV-android-sdk/apk/OpenCV_3.1.0_Manager_3.10_{platform}.apk
). OpenCV 웹 사이트 에서 다운로드 할 수 있습니다.
자세한 정보 : 문제 # 6247 .
정적 초기화
이 방법에 따르면 모든 OpenCV 바이너리가 응용 프로그램 패키지에 포함됩니다. 주로 개발 및 디버깅 목적으로 설계되었습니다. 이 방법은 프로덕션 코드에서 사용되지 않으므로 비동기 초기화가 권장됩니다.
응용 프로그램 프로젝트에 JNI가 없으면 OpenCV-3.1.0-android-sdk/sdk/native/libs
의 해당 OpenCV 기본 라이브러리를 프로젝트 디렉토리의 app/src/main/jniLibs
폴더로 복사 app/src/main/jniLibs
.
JNI 파트가있는 응용 프로그램 프로젝트의 경우 수동 라이브러리 복사 대신 Android.mk
파일을 수정해야합니다. "include $(CLEAR_VARS)"
다음에 다음 두 코드 행을 추가하고 "include path_to_OpenCV-3.1.0-android-sdk/sdk/native/jni/OpenCV.mk"
:
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
결과는 다음과 같아야합니다.
include $(CLEAR_VARS)
# OpenCV
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
include ../../sdk/native/jni/OpenCV.mk
그런 다음 OpenCV 라이브러리는 JNI 빌드 중에 응용 프로그램 jniLibs
폴더에 복사됩니다.
애플리케이션에서 OpenCV를 활성화하는 마지막 단계는 OpenCV API를 호출하기 전에 Java 초기화 코드입니다. 예를 들어 Activity 클래스의 정적 섹션에서이 작업을 수행 할 수 있습니다.
static {
if (!OpenCVLoader.initDebug()) {
// Handle initialization error
}
}
응용 프로그램에 다른 OpenCV 종속 원시 라이브러리가 포함되어있는 경우 OpenCV 초기화 후에로드해야합니다.
static {
if (!OpenCVLoader.initDebug()) {
// Handle initialization error
} else {
System.loadLibrary("my_jni_lib1");
System.loadLibrary("my_jni_lib2");
}
}
참고 : 프로덕션 코드에서는
initDebug()
메서드가 사용되지 않습니다. 실험 및 지역 개발 목적으로 만 설계되었습니다. 비동기 초기화를 사용하여 앱 사용 방식을 게시하고자하는 경우.