Android Studio의 OpenCV


141

Android Studio의 앱에서 OpenCV 라이브러리를 사용하고 싶습니다. 여기에 나온 지침을 따르지만 오류가 발생합니다

이름이 'default'인 구성을 찾을 수 없습니다

무엇이 잘못 될 수 있습니까?

gradle 2.2.1과 함께 Android Studio 1.0을 사용합니다.


1
이제 Android 스튜디오에서 모듈을 가져올 수 있으며 단계가 훨씬 간단 해졌습니다. 이 stackoverflow.com/a/27356635/1180117
Kiran

고맙습니다, 작동합니다. 답으로 쓰면 받아 들일 수 있습니다.
Bartosz Bialecki

@ BartoszBialecki @Kiran, 나는 그것을 4 번 단계로 따라갔습니다. nativesdk 디렉토리 아래 에서 디렉토리를 찾을 수 없습니다 .
Romantic Electron

1
@RomanticElectron 당신은 안드로이드 SDK가 아니라 OpenCV 라이브러리의 SDK에서 natvie 디렉토리를 추가해야합니다.
Bartosz Bialecki

@BartoszBialecki 감사
Romantic Electron

답변:


312

Android Studio에서 Android OpenCV SDK를 사용하기위한 아래 단계 이것은 this ( 1 ) SO 답변 의 단순화 된 버전입니다 .

  1. OpenCV.org 에서 Android 용 최신 OpenCV SDK를 다운로드 하고 zip 파일의 압축 을 푸십시오 .
  2. 안드로이드 스튜디오로 가져 오기 OpenCV의는 ,에서 파일 -> 새로 만들기 -> 가져 오기 모듈은 선택 SDK를 / 자바 압축을 푼 OpenCV의 아카이브에 폴더.
  3. 가져온 OpenCV 모듈에서 build.gradle 을 업데이트하여 프로젝트 build.gradle과 일치하도록 4 개의 필드를 업데이트하십시오. a) compileSdkVersion b) buildToolsVersion c) minSdkVersion 및 d) targetSdkVersion.
  4. 응용 프로그램-> 모듈 설정으로 모듈 종속성추가 하고 종속성 탭을 선택 하십시오. 하단의 + 아이콘을 클릭 하고 모듈 종속성 을 선택한 다음 가져온 OpenCV 모듈을 선택하십시오.
    • Android Studio v1.2.2의 경우 모듈 설정에 액세스하려면 : 프로젝트보기에서 종속 모듈을 마우스 오른쪽 단추로 클릭-> 모듈 설정 열기
  5. sdk / native 아래의 libs 폴더를 app / src / main 아래의 Android Studio로 복사하십시오 .
  6. Android Studio 에서 복사 된 libs 디렉토리의 이름 을 jniLibs바꾸면 됩니다.

단계 (6)은 Android 스튜디오 app/src/main/jniLibs가 이전 libs폴더 대신 기본 라이브러리를 필요 로하기 때문입니다 . Android OpenCV를 처음 사용하는 사람들은 아래 단계를 놓치지 마십시오.

  • include static{ System.loadLibrary("opencv_java"); }(참고 :이 단계에서 OpenCV 버전 3의 경우 대신 라이브러리를로드해야합니다 opencv_java3.)
  • 단계 (5)에서 x86과 같은 플랫폼 라이브러리를 무시하면 장치 / 에뮬레이터가 해당 플랫폼에 있지 않은지 확인하십시오.

작성된 OpenCV는 C / C ++로되어 있습니다. 자바 래퍼는

  1. Android OpenCV SDK-OpenCV.org는 Android Java 랩퍼를 유지 보수했습니다. 나는 이것을 제안한다.
  2. OpenCV Java-OpenCV.org는 자동 생성 된 데스크탑 Java 랩퍼를 유지 보수했습니다.
  3. JavaCV- 독립적 인 개발자가 유지 관리하는 인기있는 Java 래퍼입니다. 안드로이드 전용이 아닙니다. 이 라이브러리 OpenCV 최신 버전과 동기화되지 않을 수 있습니다.

1
나는이 삭제 할까, 두 번째 단계 다음과 같은 오류가 무엇입니까 javadocs? .IT도 설치하는 나 한테 물어의 디렉토리를 android sdk 14하는 것이 내가 표적으로하고 있지만 장치를 지원android sdk 15
로맨틱 전자

1
@RomanticElectron 링크 sourceforge.net/projects/opencvlibrary/files/opencv-android/… 에서 OpenCV4Android 2.4.10을 다운로드했지만 Java 데스크탑 버전이 아닌가?
Kiran

2
알았어, .Ok sdk와 함께 제공되는 디렉토리에 대해 이야기하는 동안 내 시스템 의 설치 디렉토리에 대해 이야기하고 있다고 생각했습니다 Android Open CV SDK. 6 단계를 완료했습니다 static{ System.loadLibrary("opencv_java"); }.
Romantic Electron

5
@RomanticElectron 어디에 static {System.loadLibrary ( "opencv_java"); }? 당신은 "감사합니다"라고 말하지만 사이에 메시지가없는 것 같습니다. 그런 다음 필요하지 않다고 말합니다. 좀 더 설명해 주시겠습니까? 감사.
puntofisso

8
가진 누군가를 위해 android-142 단계에서 모듈을 가져온 후 오류, 당신은 수동으로 편집해야 build.gradleOpenCV의 디렉토리에 프로젝트의 3 단계에서와 같이
paradite

144

OpenCV v3.1.0을 Android Studio v1.4.1에 통합 하여 추가 세부 정보가 포함 된 지침과이 스크린 샷 유형을 제공합니다.

대부분의 크레딧은 Kiran, Kool, 1 "및 SteveLiles에게 설명을 위해 opencv.org를 통해 제공됩니다. Android Studio의 인터페이스가 이제 이러한 유형의 통합 항목에 대해 작업하기에 충분히 안정적이라고 믿기 때문에이 답변을 추가하고 있습니다 또한 나는 우리 프로젝트를 위해 어쨌든이 지시 사항을 작성해야합니다.

경험이 풍부한 AS 개발자는이 pedantic 중 일부를 찾을 수 있습니다. 이 답변은 Android Studio에서 경험이 부족한 사람들을 대상으로합니다.

  1. 프로젝트 마법사 (메뉴 : / 파일 / 새 프로젝트)를 사용하여 새 Android Studio 프로젝트를 만듭니다.

    • " cvtest1 " 이라고 부릅니다 .
    • 폼 팩터 : API 19, Android 4.4 (KitKat)
    • 이름이 MainActivity 인 빈 활동

      이 프로젝트가 저장된 cvtest1 디렉토리 가 있어야합니다 . (Android 스튜디오의 제목 표시 줄은 프로젝트를 열 때 cvtest1의 위치를 ​​보여줍니다)

  2. 앱이 올바르게 실행되는지 확인하십시오. "Hello World"텍스트와 같은 것을 변경하여 빌드 / 테스트주기가 올바른지 확인하십시오. (API 19 장치의 에뮬레이터로 테스트하고 있습니다).

  3. Android v3.1.0 용 OpenCV 패키지를 다운로드하여 임시 디렉토리에 압축을 푸십시오. (확인은 Java 패키지에 딱 OpenCV의 특별히 안드로이드를위한 패키지입니다하지.) 나는이 디렉토리는 "전화 할게 압축 해제 - 디렉토리 아래" 압축 해제-DIR 당신이해야 SDK / 기본 / libs가 시작 하위 디렉토리와 디렉토리를 같은 것들을 ..., MIPS ... 그리고 86 (의 "구조"안드로이드 실행의 종류마다 1 개의)

  4. Android Studio에서 OpenCV를 프로젝트로 모듈로 가져옵니다. Menu : / File / New / Import_Module :

    • 소스 디렉토리 : {unzip-dir} / sdk / java
    • 모듈 이름 : Android Studio는 자동으로이 필드를 openCVLibrary310 으로 채 웁니다 (정확한 이름은 중요하지 않지만이 이름 을 사용함 ).
    • 다음을 클릭하십시오 . jar, 라이브러리 및 가져 오기 옵션에 대한 세 개의 확인란과 질문이있는 화면이 나타납니다. 세 가지를 모두 확인해야합니다. Finish를 클릭하십시오 .

      Android Studio가 모듈 가져 오기를 시작하면 가져 오지 않은 항목 (대부분 javadoc 파일) 및 기타 정보 목록이있는 import-summary.txt 파일 이 표시 됩니다. 여기에 이미지 설명을 입력하십시오

      그러나 해시 문자열 'android-14'...로 대상을 찾을 수 없다는 오류 메시지가 표시 됩니다. 다운로드 한 OpenCV zip 파일의 build.gradle 파일이 Android API 버전 14 (기본적으로 Android Studio v1.4.1에는 없음)를 사용하여 컴파일하라고 말했기 때문에 발생합니다. 여기에 이미지 설명을 입력하십시오

  5. 프로젝트 구조 대화 상자를여십시오 ( Menu : / File / Project_Structure ). "앱"모듈을 선택하고 종속성 탭을 클릭 한 후 : openCVLibrary310 을 모듈 종속성으로 추가 하십시오 . Add / Module_Dependency 를 선택하면 추가 할 수있는 모듈 목록에 나타납니다. 이제 종속 항목으로 표시되지만 이벤트 로그에 몇 가지 더 많은 find-find-android-14 오류가 발생합니다.

  6. 앱 모듈 의 build.gradle 파일을 확인하십시오. Android 프로젝트에는 여러 build.gradle 파일이 있습니다. 원하는 것은 cvtest1 / app 디렉토리에 있으며 프로젝트 뷰에서는 build.gradle (Module : app)과 같습니다 . 이 네 가지 필드의 값에 유의하십시오.

    • compileSDKVersion (내 말은 23)
    • buildToolsVersion (내 말은 23.0.2)
    • minSdkVersion (내 말은 19)
    • targetSdkVersion (내 말은 23)
  7. 프로젝트에 cvtest1 / OpenCVLibrary310 디렉토리가 있지만 프로젝트보기에서 볼 수 없습니다.

여기에 이미지 설명을 입력하십시오

파일 관리자와 같은 다른 도구를 사용하여이 디렉토리로 이동하십시오. 프로젝트 뷰를 Android 에서 Project Files 로 전환 할 수 있으며이 스크린 샷과 같이이 디렉토리를 찾을 수 있습니다. 여기에 이미지 설명을 입력하십시오

내부에는 또 다른 build.gradle 파일이 있습니다 (위 스크린 샷에서 강조 표시됨). 6 단계의 4 가지 값으로이 파일을 업데이트하십시오.

  1. 프로젝트를 다시 동기화 한 다음 정리 / 재 구축하십시오. (메뉴 : / Build / Clean_Project ) 오류없이 정리하고 빌드해야 하며 0 : 메시지 화면 에 : openCVLibrary310 에 대한 많은 참조가 표시됩니다.

    여기에 이미지 설명을 입력하십시오

    이 시점에서 모듈은 app 과 마찬가지로 프로젝트 계층 구조에서 openCVLibrary310 으로 나타나야 합니다 . (작은 드롭 다운 메뉴에서 Project View 에서 Android View 로 다시 전환했습니다 .) 또한 추가 build.gradle이 표시됩니다"Gradle Scripts"아래에 파일 되지만 Android Studio 인터페이스가 약간 결함이 있고 때로는이 작업을 수행하지 않는 경우가 있습니다. 따라서 Android Studio를 다시 동기화, 정리 및 다시 시작하십시오.

    이 스크린 샷과 같이 java에서 모든 OpenCV 기능이있는 openCVLibrary310 모듈이 표시되어야합니다.

    여기에 이미지 설명을 입력하십시오

  2. 복사 {압축 해제-DIR} / SDK / 기본 / libs가 에, 당신의 안드로이드 프로젝트에 (그 아래에 모든 것을) 디렉토리를 cvtest1 / OpenCVLibrary310 / SRC / 메인 / 다음에서 복사본의 이름을 변경 libs가jniLibs . 이제 cvtest1 / OpenCVLibrary310 / src / main / jniLibs 디렉토리가 있어야 합니다. 프로젝트를 다시 동기화하면이 디렉토리가 프로젝트보기의 openCVLibrary310 아래에 나타납니다 .

    여기에 이미지 설명을 입력하십시오

  3. MainActivity.java 의 onCreate 메소드로 이동하여 다음 코드를 추가하십시오.

    if (!OpenCVLoader.initDebug()) {
        Log.e(this.getClass().getSimpleName(), "  OpenCVLoader.initDebug(), not working.");
    } else {
        Log.d(this.getClass().getSimpleName(), "  OpenCVLoader.initDebug(), working.");
    }

    그런 다음 응용 프로그램을 실행하십시오. Android 모니터에 다음과 같은 줄이 표시되어야 여기에 이미지 설명을 입력하십시오 합니다 (오류 메시지가있는 줄이 왜 있는지 모르겠습니다)

  4. 이제 실제로 openCV 코드를 사용하십시오. 아래 예에서 .jpg 파일을 android 에뮬레이터의 cvtest1 응용 프로그램의 캐시 디렉토리에 복사했습니다. 아래 코드는이 이미지를로드하고 캐니 가장자리 감지 알고리즘을 실행 한 다음 결과를 동일한 디렉토리의 .png 파일에 다시 씁니다.

    이 코드를 이전 단계의 코드 바로 아래에 놓고 자신의 파일 / 디렉토리와 일치하도록 변경하십시오.

    String inputFileName="simm_01";
    String inputExtension = "jpg";
    String inputDir = getCacheDir().getAbsolutePath();  // use the cache directory for i/o
    String outputDir = getCacheDir().getAbsolutePath();
    String outputExtension = "png";
    String inputFilePath = inputDir + File.separator + inputFileName + "." + inputExtension;
    
    
    Log.d (this.getClass().getSimpleName(), "loading " + inputFilePath + "...");
    Mat image = Imgcodecs.imread(inputFilePath);  
    Log.d (this.getClass().getSimpleName(), "width of " + inputFileName + ": " + image.width());
    // if width is 0 then it did not read your image.
    
    
    // for the canny edge detection algorithm, play with these to see different results
    int threshold1 = 70;
    int threshold2 = 100;
    
    Mat im_canny = new Mat();  // you have to initialize output image before giving it to the Canny method
    Imgproc.Canny(image, im_canny, threshold1, threshold2);
    String cannyFilename = outputDir + File.separator + inputFileName + "_canny-" + threshold1 + "-" + threshold2 + "." + outputExtension;
    Log.d (this.getClass().getSimpleName(), "Writing " + cannyFilename);
    Imgcodecs.imwrite(cannyFilename, im_canny);
  5. 응용 프로그램을 실행하십시오. 에뮬레이터는 흑백 "가장자리"이미지를 만들어야합니다. Android 디바이스 모니터를 사용하여 출력을 검색하거나 표시 할 활동을 작성할 수 있습니다.

둘점 :

  • 대상 플랫폼을 KitKat 아래로 낮추면 일부 OpenCV 라이브러리가 더 이상 작동하지 않습니다. 특히 org.opencv.android.Camera2Renderer 관련 클래스 및 기타 관련 클래스와 관련된 클래스 . 적절한 OpenCV .java 파일을 간단히 제거하면이 문제를 해결할 수 있습니다.
  • 대상 플랫폼을 Lollipop 이상으로 올리면 절대 파일 경로 사용이 찌그러져 파일을로드하는 예제가 작동하지 않을 수 있습니다. 따라서 갤러리 또는 다른 곳에서 파일을로드하기 위해 예제를 변경해야 할 수도 있습니다. 떠 다니는 수많은 예가 있습니다.

2
16-Feb 편집 : jniLibs는 이제 기본 앱 디렉토리가 아닌 openCVLibrary310 디렉토리에 있습니다. 어느 쪽이든 효과가 있지만 opencv 부분에 보관하는 것이 더 깨끗해 보입니다. 게다가 많은 스크린 샷과 "둘점"부분.
ssimm

일부 수입 명세서가 누락되었다고 생각합니다. +1
Allan Nørgaard

1
나는 당신의 대답을 따랐지만 실패했습니다. 1 오류가 발생했습니다. OpenCV error: Cannot load info library for OpenCV 2 java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/www.deven.com.opencv-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libopencv_java3.so 작성한 오류가 단계적으로 수행되었습니다.
Devendra Singh

2
@DevendraSingh 나는 당신과 같은 오류가 있지만 9 단계를 놓쳤다는 것을 깨달았습니다.
aasu

2
안드로이드 스튜디오에서 opencv를 위해 C ++로 코딩하려면 어떻게해야합니까?
user8663682

38

위의 (위대한!) 답변에 대한 모든 단계와 스크린 샷으로 도망 가고 싶다고 생각하는 모든 사람들에게 이것은 다음과 같이 작동했습니다 android studio 2.2.1.

  1. 새 프로젝트를 작성하고 원하는대로 이름을 지정하고 기본값을 사용하십시오 (minSdkVersion 15가 좋습니다).
  2. 여기에서 zip 파일을 다운로드하십시오 : https://sourceforge.net/projects/opencvlibrary/files/opencv-android/ (3.1.0 버전을 다운로드했지만 최신 버전이있을 수 있습니다).
  3. zip 파일의 압축을 푸십시오. 가장 좋은 위치는 작업 공간 폴더에 있지만 실제로는 중요하지 않습니다.
  4. 내부 Android Studio 클릭 File->New-> Import Module하고 이동하여 확인을 \path_to_your_unzipped_file\OpenCV-android-sdk\sdk\java누른 다음 모든 기본 대화 상자를 그대로 사용하십시오.
  5. 에서 gradle당신의 파일 app 모듈, 종속성 블록이 추가 :

    dependencies {
        compile project(':openCVLibraryXYZ')
        //rest of code
    }

XYZ는 다운로드 한 정확한 버전입니다 (예 : 제 경우).

    dependencies {
        compile project(':openCVLibrary320')
        //rest of code
    }

1
좋고 간단하며 thnx ;-) 버전 3.2.0에서도 작동합니다.
blacharnia

2
감사합니다. 실제로 더 쉬운 솔루션입니다. 나에게서 한 점. 새로운 OpenCV 모듈을 컴파일 할 수 없습니다. 이 답변은이 문제를 해결하는 데 도움이되었습니다. stackoverflow.com/a/40302788/408780
Tima

@blacharnia가 말한 것에 추가하려면 310 대신 크래들 종속성 섹션에서 'compile project (': openCVLibrary320 ')'를 사용하십시오.
Abraham Philip

더 일반적으로, 위의 주석에 추가하려면 "compile project ( ': openCVLibraryXYZ')"를 사용하십시오. 여기서 XYZ는 '도트'가없는 openCV Android SDK의 버전 번호입니다. 이는 버전 3.4.0에서도 작동합니다. "compile project ( ': openCVLibrary340')"사용
Mick

@Mick 감사합니다, 귀하의 제안에 따라 답변을 편집했습니다.
yshahak

9

Android Studio 3.4 + OpenCV 4.1

  1. 여기 에서 최신 OpenCV zip 파일을 다운로드하고 (현재 최신 버전은 4.1.0 임) 작업 공간이나 다른 폴더에서 압축을 푸십시오.

  2. 정상적으로 새 Android Studio 프로젝트를 작성하십시오. 을 클릭 File->New->Import Module하고으로 이동하여 /path_to_unzipped_files/OpenCV-android-sdk/sdk/java모듈 이름을으로 설정 하고 화면에서 모든 옵션을 opencv클릭 Next및 선택 취소 하십시오 .

  3. Project파일보기 모드를 활성화 합니다 (기본 모드는 Android). 에서 opencv/build.gradle파일 변경 apply plugin: 'com.android.application'apply plugin: 'com.android.library'및 교체 application ID "org.opencv"와 함께

    minSdkVersion 21
    targetSdkVersion 28

    (의 값에 따라 app/build.gradle). Gradle 파일과 프로젝트를 동기화하십시오.

  4. 이 문자열을 app/build.gradle파일 의 dependencies 블록에 추가 하십시오

    dependencies {
        ...
        implementation project(path: ':opencv')
        ...
    }
  5. Android파일보기 모드를 다시 선택하십시오 . app모듈을 마우스 오른쪽 버튼으로 클릭하고로 이동하십시오 New->Folder->JNI Folder. 폴더 위치 변경을 선택하고를 설정하십시오 src/main/jniLibs/.

  6. Project파일보기 모드를 다시 선택 하고에서 모든 폴더를에서 (으) /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/libs로 복사하십시오 app/src/main/jniLibs.

  7. 다시 Android파일보기 모드에서 app모듈을 마우스 오른쪽 버튼으로 클릭 하고을 선택하십시오 Link C++ Project with Gradle. 시스템 빌드 ndk-buildOpenCV.mk파일 경로를 선택하십시오 /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk.

    path_to_unzipped_files 공백이 없어야합니다. 그렇지 않으면 오류가 발생합니다!

OpenCV 초기화를 확인하려면 MainActivity onCreate()메소드 에서 토스트 메시지를 추가하십시오 .

Toast.makeText(MainActivity.this, String.valueOf(OpenCVLoader.initDebug()), Toast.LENGTH_LONG).show();

초기화에 성공하면 true토스트 메시지에 표시되고 그렇지 않으면 표시 false됩니다.


위에서 "애플리케이션 ID"org.opencv "를 ....."로 바꾸십시오. "with"뒤에는 아무 것도 없습니다. 당신은 명확히 할 수 있습니까? "applicationId 항목을 제거하고 다음과 같이 두 개의 항목을 추가하십시오."
Dale

@Dale 예, application ID "org.opencv"문자열을 두 개의 문자열로 바꿔야 합니다 : minSdkVersion 21and targetSdkVersion 28(app / build.gradle 파일의 값에 따라)
Plo_Koon

나는 당신이 묘사 한대로 모든 단계를 따랐다. 그러나 오류 E / art : dlopen ( "/ data / app / com.example.objectsegmentation-1 / lib / arm64 / libopencv_java4.so", RTLD_LAZY) 실패 : dlopen 실패 : 라이브러리 "libc ++ _ shared.so"를 찾을 수 없음
Masthan

0

jniLibs cpp를 생성하는 동안 문제가 발생하면 누구나 ndk를 추가하십시오.


0

이것은 나를 위해 일했고 gradle 의존성을 추가하는 것만 큼 쉽습니다.

https://bintray.com/seesaa/maven/opencv#

https://github.com/seesaa/opencv-android

암 에뮬레이터가 나에게 너무 느리게 (AVD Manager가 말했듯이) 하드웨어 디버깅 장치를 사용해야한다는 한 가지주의 사항은 repo README에 설명 된 것처럼이 버전에는 x86 또는 x86_64 지원이 포함되어 있지 않습니다.

빌드되고 제안 된 테스트 인 것 같습니다.

static {
    OpenCVLoader.initDebug();
}

나에게 맞는 출력물을 뱉어냅니다.


이것은 안드로이드 스튜디오의 신선한 프로젝트에서 나온 것입니다. 나는 아무것도 가져 오지 않았고 아무것도 다운로드하지 않았습니다. gradle 의존성을 추가하고 동기화하십시오.
Naumdev

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.