수색…


비동기 초기화

응용 프로그램을 개발할 때 비동기 초기화를 사용하는 것이 좋습니다. 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() 메서드가 사용되지 않습니다. 실험 및 지역 개발 목적으로 만 설계되었습니다. 비동기 초기화를 사용하여 앱 사용 방식을 게시하고자하는 경우.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow