Android
Integreer OpenCV in Android Studio
Zoeken…
Opmerkingen
De Open CV-bibliotheken kunnen op internet worden gevonden met behulp van een zoekmachine.
The Gotchas :
- Als u uw doelplatform onder KitKat verlaagt, werken sommige OpenCV-bibliotheken niet meer, met name de klassen die zijn gerelateerd aan org.opencv.android.Camera2Renderer en andere gerelateerde klassen. U kunt dit waarschijnlijk omzeilen door eenvoudig de juiste OpenCV .java-bestanden te verwijderen.
- Als u uw doelplatform verhoogt naar Lollipop of hoger, werkt mijn voorbeeld van het laden van een bestand mogelijk niet omdat het gebruik van absolute bestandspaden wordt afgekeurd. Het is dus mogelijk dat u het voorbeeld moet wijzigen om een bestand uit de galerij of ergens anders te laden. Er zijn talloze voorbeelden rondzweven.
Instructions
Getest met AS v1.4.1 maar zou ook met nieuwere versies moeten werken.
Maak een nieuw Android Studio-project met behulp van de projectwizard (Menu: / Bestand / Nieuw project):
- Noem het " cvtest1 "
- Vormfactor: API 19, Android 4.4 (KitKat)
- Lege activiteit met de naam MainActivity
U moet een cvtest1- directory hebben waarin dit project is opgeslagen. (de titelbalk van Android studio laat zien waar cvtest1 is wanneer u het project opent)
Controleer of uw app correct wordt uitgevoerd. Probeer zoiets als de "Hallo wereld" -tekst te veranderen om te bevestigen dat de build / test-cyclus OK voor u is. (Ik test met een emulator van een API 19-apparaat).
Download het OpenCV-pakket voor Android v3.1.0 en pak het ergens uit in een tijdelijke map. (Zorg ervoor dat dit specifiek het Android-pakket is en niet alleen het OpenCV voor Java-pakket.) Ik zal deze map " unzip-dir " noemen. Onder unzip-dir zou je een map sdk / native / libs moeten hebben met subdirectories die beginnen met dingen zoals arm ..., mips ... en x86 ... (één voor elk type "architectuur" waarop Android draait)
Vanuit Android Studio importeer OpenCV in uw project als een module: Menu: / Bestand / Nieuw / Import_Module :
- Bronmap: {unzip-dir} / sdk / java
- Modulenaam: Android studio vult dit veld automatisch in met openCVLibrary310 (de exacte naam doet er waarschijnlijk niet toe, maar we gaan ermee akkoord ).
- Klik op volgende . U krijgt een scherm met drie selectievakjes en vragen over potten, bibliotheken en importopties. Alle drie moeten worden gecontroleerd. Klik op Voltooien.
Android Studio begint met het importeren van de module en u krijgt een import-summary.txt- bestand te zien met een lijst van wat niet is geïmporteerd (meestal javadoc-bestanden) en andere informatie.
Maar je krijgt ook een foutmelding dat het niet is gelukt om het doel te vinden met hash-string 'android-14' .... Dit gebeurt omdat het build.gradle-bestand in het OpenCV-zipbestand dat je hebt gedownload compileert met Android API-versie 14, wat je standaard niet hebt met Android Studio v1.4.1.
Open het projectstructuurdialoogvenster ( Menu: / Bestand / Project_Structuur ). Selecteer de "app" -module, klik op het tabblad Afhankelijkheden en voeg toe : openCVLibrary310 als module-afhankelijkheid. Wanneer u Add / Module_Dependency selecteert, moet dit verschijnen in de lijst met modules die u kunt toevoegen. Het zal nu verschijnen als een afhankelijkheid, maar je krijgt nog een paar niet-vind-android-14- fouten in het gebeurtenislogboek.
Kijk in het build.gradle- bestand voor uw app-module. Er zijn meerdere build.gradle-bestanden in een Android-project. Degene die u zoekt, bevindt zich in de map cvtest1 / app en vanuit de projectweergave lijkt het op build.gradle (Module: app) . Let op de waarden van deze vier velden:
- compileSDKVersion (de mijne zegt 23)
- buildToolsVersion (de mijne zegt 23.0.2)
- minSdkVersion (de mijne zegt 19)
- targetSdkVersion (de mijne zegt 23)
Uw project heeft nu een map cvtest1 / OpenCVLibrary310 maar het is niet zichtbaar vanuit de projectweergave:
Gebruik een ander hulpmiddel, zoals een bestandsbeheerder, en ga naar deze map. Je kunt ook de projectweergave omschakelen van Android naar Projectbestanden en je kunt deze map vinden zoals getoond in deze screenshot:
Binnenin bevindt zich nog een build.gradle- bestand (dit wordt gemarkeerd in de bovenstaande screenshot). Werk dit bestand bij met de vier waarden uit stap 6.
Synchroniseer uw project opnieuw en maak het vervolgens schoon / opnieuw. ( Menu: / Build / Clean_Project ) Het zou zonder fouten moeten opschonen en bouwen en je zou veel verwijzingen moeten zien naar : openCVLibrary310 in het 0: Berichten scherm.
Op dit punt zou de module in de projecthiërarchie moeten verschijnen als openCVLibrary310 , net als de app . (Merk op dat ik in dat kleine vervolgkeuzemenu teruggeschakeld ben van Project View naar Android View ). Je zou ook een extra build.gradle- bestand moeten zien onder "Gradle Scripts", maar ik vind de Android Studio-interface een beetje glitchy en soms doet dit dit niet meteen. Probeer dus opnieuw te synchroniseren, op te ruimen en zelfs Android Studio opnieuw te starten.
Je zou de openCVLibrary310-module met alle OpenCV-functies onder Java moeten zien, zoals in deze screenshot:
Kopieer de directory {unzip-dir} / sdk / native / libs (en alles eronder ) naar uw Android-project, naar cvtest1 / OpenCVLibrary310 / src / main / , en hernoem vervolgens uw exemplaar van libs naar jniLibs . U zou nu een cvtest1 / OpenCVLibrary310 / src / main / jniLibs directory moeten hebben. Synchroniseer uw project opnieuw en deze map zou nu in de projectweergave onder openCVLibrary310 moeten verschijnen.
Ga naar de onCreate-methode van MainActivity.java en voeg deze code toe:
if (!OpenCVLoader.initDebug()) {
Log.e(this.getClass().getSimpleName(), " OpenCVLoader.initDebug(), not working.");
} else {
Log.d(this.getClass().getSimpleName(), " OpenCVLoader.initDebug(), working.");
}
Voer vervolgens uw applicatie uit. Je zou dit soort regels in Android Monitor moeten zien:
(Ik weet niet waarom die regel met het foutbericht er is)
- Probeer nu wat openCV-code te gebruiken. In het onderstaande voorbeeld heb ik een .jpg-bestand gekopieerd naar de cachemap van de cvtest1-toepassing op de Android-emulator. De onderstaande code laadt deze afbeelding, voert het canny edge-detectiealgoritme uit en schrijft de resultaten vervolgens terug naar een .png-bestand in dezelfde map.
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);
- Voer uw applicatie uit. Uw emulator moet een zwart-wit "randbeeld" maken. U kunt de Android-apparaatmonitor gebruiken om de uitvoer op te halen of een activiteit schrijven om deze weer te geven.