Android
Android Studio에 OpenCV 통합
수색…
비고
Open CV 라이브러리는 검색 엔진을 사용하여 웹에서 찾을 수 있습니다.
잡담 :
- 타겟 플랫폼을 KitKat 아래로 낮추면 OpenCV 라이브러리 중 일부가 더 이상 작동하지 않게됩니다. 구체적으로는 org.opencv.android.Camera2Renderer 및 기타 관련 클래스와 관련된 클래스입니다. 당신은 아마 적절한 OpenCV .java 파일을 제거함으로써이 문제를 해결할 수 있습니다.
- Lollipop 또는 위의로드 플랫폼에 대상 플랫폼을 올리면 절대 파일 경로 사용이 싫어서 파일이 작동하지 않을 수 있습니다. 갤러리 나 다른 곳에서 파일을로드하기 위해 예제를 변경해야 할 수도 있습니다. 주위에 수많은 예제가 있습니다.
명령
AS v1.4.1로 테스트되었지만 최신 버전에서도 작동해야합니다.
프로젝트 마법사 (메뉴 : / 파일 / 새 프로젝트)를 사용하여 새 Android Studio 프로젝트를 만듭니다.
- 그것을 " cvtest1 "이라고 부르십시오 .
- 폼 팩터 : API 19, Android 4.4 (KitKat)
- MainActivity 라는 이름의 공백 활동
이 프로젝트가 저장되어있는 cvtest1 디렉토리가 있어야합니다. (안드로이드 스튜디오의 제목 표시 줄은 프로젝트를 열 때 cvtest1이 어디에 있는지 보여줍니다)
앱이 올바르게 실행되는지 확인합니다. "Hello World"텍스트와 같은 것을 변경하여 빌드 / 테스트주기가 정상인지 확인하십시오. (API 19 장치의 에뮬레이터로 테스트하고 있습니다).
Android v3.1.0 용 OpenCV 패키지를 다운로드하고 어딘가에 임시 디렉토리에 압축을 풉니 다. (이것은 자바 패키지 특별히 안드로이드를위한 패키지뿐만 아니라 OpenCV의 있는지 확인합니다.) 나는 "압축 해제-DIR"압축 해제 - 디렉토리 아래의 디렉토리에 전화 할게 당신이 시작 하위 디렉토리와 SDK / 네이티브 / libs와 디렉토리를 가지고 있어야 arm ..., mips ... 및 x86 ... (Android가 실행하는 "아키텍처"유형별로 하나씩)
Android Studio에서 프로젝트로 OpenCV를 모듈로 가져 오기 : Menu : / File / New / Import_Module :
- 소스 디렉토리 : {unzip-dir} / sdk / java
- 모듈 이름 : 안드로이드 스튜디오는이 필드를 자동으로 openCVLibrary310 으로 채 웁니다. 정확한 이름은 별 상관 없지만 여기에 대해 설명하겠습니다.
- 다음을 클릭하십시오. 항아리, 라이브러리 및 가져 오기 옵션에 관한 세 가지 확인란 및 질문이있는 화면이 표시됩니다. 세 명 모두 검사해야합니다. 마침을 클릭하십시오 .
Android Studio에서 모듈 가져 오기가 시작되고 가져 오기되지 않은 항목 (주로 javadoc 파일) 및 기타 정보 목록이있는 import-summary.txt 파일이 표시됩니다.
그러나 해시 문자열 'android-14'로 목표를 찾지 못했다 는 오류 메시지가 나타납니다. 이것은 다운로드 한 OpenCV zip 파일의 build.gradle 파일이 기본적으로 Android Studio v1.4.1에없는 android API 버전 14를 사용하여 컴파일해야하기 때문에 발생합니다.
프로젝트 구조 대화 상자를 엽니 다 ( Menu : / File / Project_Structure ). "app"모듈을 선택하고, Dependencies 탭을 클릭하고 openCVLibrary310 을 모듈 종속성으로 추가 하십시오 . Add / Module_Dependency 를 선택하면 추가 할 수있는 모듈 목록에 나타납니다. 이제는 종속성으로 표시되지만 이벤트 로그에서 몇 가지 더 많은 -android-android-14 오류를 얻을 수 있습니다 .
앱 모듈의 build.gradle 파일을 확인합니다. Android 프로젝트에는 build.gradle 파일이 여러 개 있습니다. 원하는 파일은 cvtest1 / app 디렉토리에 있고 프로젝트보기에서는 build.gradle (Module : app) 처럼 보입니다. 이 네 필드의 값을 확인하십시오.
- compileSDKVersion (내 말은 23)
- buildToolsVersion (내 말은 23.0.2)
- minSdkVersion (내 말은 19)
- targetSdkVersion (내 말은 23)
이제 프로젝트에 cvtest1 / OpenCVLibrary310 디렉토리가 있지만 프로젝트보기에서 볼 수 없습니다.
파일 관리자와 같은 다른 도구를 사용하고이 디렉토리로 이동하십시오. Android 에서 Project 파일로 프로젝트보기를 전환 할 수도 있으며이 스크린 샷과 같이이 디렉토리를 찾을 수 있습니다.
내부에는 또 다른 build.gradle 파일 (위의 스크린 샷에 강조 표시되어 있음)이 있습니다. 이 파일을 6 단계의 4 가지 값으로 업데이트하십시오.
프로젝트를 다시 동기화 한 다음 정리 / 다시 빌드하십시오. ( Menu : / Build / Clean_Project ) 오류없이 정리하고 빌드해야하며 0 : Messages 화면에서 openCVLibrary310 에 대한 참조가 많이 있어야합니다.
이 시점에서 모듈은 응용 프로그램 과 마찬가지로 프로젝트 계층 구조에서 openCVLibrary310 으로 나타나야 합니다 . (그 작은 드롭 다운 메뉴에서 나는 Project View 에서 Android View 로 다시 전환했다. 또한 "Gradle Scripts"아래에 build.gradle 파일이 추가로 표시되어야하지만 Android Studio 인터페이스가 약간 이상하고 때로는 바로이 작업을 수행하지 않는 경우가 있습니다. 따라서 Android Studio를 다시 동기화, 정리, 다시 시작해보십시오.
이 스크린 샷과 같이 java 아래에있는 모든 OpenCV 함수가 포함 된 openCVLibrary310 모듈을보아야합니다.
{unzip-dir} / sdk / native / libs 디렉토리 (및 그 아래의 모든 항목)를 Android 프로젝트 ( cvtest1 / OpenCVLibrary310 / src / main / )로 복사 한 다음 복사본의 이름을 libs 에서 jniLibs 로 바꿉니다 . 이제 cvtest1 / OpenCVLibrary310 / src / main / jniLibs 디렉토리가 있어야 합니다. 프로젝트를 다시 동기화하면이 디렉토리가 openCVLibrary310 의 프로젝트 뷰에 나타납니다.
MainActivity.java 의 onCreate 메소드로 이동하여 다음 코드를 추가하십시오.
if (!OpenCVLoader.initDebug()) {
Log.e(this.getClass().getSimpleName(), " OpenCVLoader.initDebug(), not working.");
} else {
Log.d(this.getClass().getSimpleName(), " OpenCVLoader.initDebug(), working.");
}
그런 다음 응용 프로그램을 실행하십시오. 안드로이드 모니터에서 다음과 같은 줄을보아야합니다.
(나는 왜 그 줄이 오류 메시지와 함께 있는지 모른다)
- 이제 실제로 일부 openCV 코드를 사용해보십시오. 아래 예제에서 안드로이드 에뮬레이터의 cvtest1 애플리케이션의 캐시 디렉토리에 .jpg 파일을 복사했습니다. 아래의 코드는이 이미지를로드하고 가장자리 감지 알고리즘을 실행 한 다음 결과를 다시 같은 디렉토리의 .png 파일에 씁니다.
Put this code just below the code from the previous step and alter it to match your own files/directories.
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);
- 응용 프로그램을 실행하십시오. 에뮬레이터는 흑백 "가장자리"이미지를 만들어야합니다. Android Device Monitor를 사용하여 출력물을 검색하거나 활동을 작성하여 표시 할 수 있습니다.