Android
Integrera OpenCV i Android Studio
Sök…
Anmärkningar
Open CV-biblioteken kan hittas på webben med hjälp av en sökmotor.
Gotchas :
- Om du sänker din målplattform under KitKat kommer några av OpenCV-biblioteken inte längre att fungera, specifikt klasserna relaterade till org.opencv.android.Camera2Renderer och andra relaterade klasser. Du kan förmodligen komma runt detta genom att helt enkelt ta bort apprpriate OpenCV .java-filerna.
- Om du höjer din målplattform till Lollipop eller över mitt exempel på att ladda en fil kanske inte fungerar eftersom användningen av absoluta filvägar är rynkade på. Så du kanske måste ändra exemplet för att ladda en fil från galleriet eller någon annanstans. Det finns många exempel som flyter runt.
Instruktioner
Testat med AS v1.4.1 men bör också fungera med nyare versioner.
Skapa ett nytt Android Studio-projekt med hjälp av projektguiden (Meny: / File / New Project):
- Kall det " cvtest1 "
- Formfaktor: API 19, Android 4.4 (KitKat)
- Tom aktivitet med namnet MainActivity
Du bör ha en cvtest1- katalog där projektet är lagrat. (titelfältet i Android-studio visar dig var cvtest1 är när du öppnar projektet)
Kontrollera att din app körs korrekt. Försök att ändra något som texten "Hello World" för att bekräfta att bygg / testcykeln är OK för dig. (Jag testar med en emulator för en API 19-enhet).
Ladda ner OpenCV-paketet för Android v3.1.0 och packa upp det i någon tillfällig katalog någonstans. (Se till att det är paketet specifikt för Android och inte bara OpenCV för Java-paketet.) Jag kallar den här katalogen " unzip-dir ". Nedan unzip-dir bör du ha en sdk / native / libs- katalog med underkataloger som börjar med saker som arm ..., mips ... och x86 ... (en för varje typ av "arkitektur" Android körs på)
Importera OpenCV från Android Studio till ditt projekt som en modul: Meny: / File / New / Import_Module :
- Källkatalog : {unzip-dir} / sdk / java
- Modulnamn: Android-studio fyller automatiskt i det här fältet med openCVLibrary310 (det exakta namnet spelar förmodligen ingen roll men vi går med det här).
- Klicka på nästa . Du får en skärm med tre kryssrutor och frågor om burkar, bibliotek och importalternativ. Alla tre bör kontrolleras. Klicka på Slutför.
Android Studio börjar importera modulen och du visas en import-Summary.txt- fil som har en lista över vad som inte importerades (mestadels javadoc-filer) och annan information.
Men du får också ett felmeddelande som säger att det inte gick att hitta mål med hashsträngen 'android-14' .... Detta händer eftersom build.gradle-filen i den öppna zip-filen OpenCV som du laddat ner säger att kompilera med Android API-version 14, som du inte har med Android Studio v1.4.1 som standard.
Öppna projektstrukturdialogen ( Meny: / File / Project_Structure ). Välj "app" -modul, klicka på fliken Beroende och lägg till : openCVLibrary310 som modulberoende . När du väljer Lägg till / modulberoende bör det visas i listan över moduler du kan lägga till. Det kommer nu att visas som ett beroende, men du kommer att få några fler inte-hitta-android-14- fel i händelseloggen.
Titta i build.gradle- filen för din appmodul. Det finns flera build.gradle-filer i ett Android-projekt. Den du vill ha är i cvtest1 / app- katalogen och från projektvyn ser det ut som build.gradle (Module: app) . Notera värdena för dessa fyra fält:
- compileSDKVersion (min säger 23)
- buildToolsVersion (min säger 23.0.2)
- minSdkVersion (min säger 19)
- targetSdkVersion (min säger 23)
Ditt projekt har nu en cvtest1 / OpenCVLibrary310- katalog men det är inte synligt från projektvyn:
Använd något annat verktyg, t.ex. vilken filhanterare som helst, och gå till den här katalogen. Du kan också byta projektvy från Android till Projektfiler och du kan hitta den här katalogen som visas på den här skärmdumpen:
Inuti finns en annan build.gradle- fil (den markeras i skärmdumpen ovan). Uppdatera den här filen med de fyra värdena från steg 6.
Åtsynkronisera ditt projekt och rengör / bygg det sedan igen. ( Meny: / Build / Clean_Project ) Det ska rengöras och byggas utan fel och du bör se många referenser till : openCVLibrary310 på skärmen 0: Meddelanden .
Vid denna punkt bör modulen visas i projekthierarkin som openCVLibrary310 , precis som app . (Observera att i den lilla listrutan bytte jag tillbaka från Project View till Android View ). Du borde också se en extra build.gradle- fil under "Gradle Scripts" men jag tycker att Android Studio-gränssnittet är lite glitchy och ibland gör det inte direkt. Så försök att synkronisera, rengöra, även starta om Android Studio.
Du bör se openCVLibrary310-modulen med alla OpenCV-funktioner under java som i den här skärmdumpen:
Kopiera katalogen {unzip-dir} / sdk / native / libs (och allt under den) till ditt Android-projekt, till cvtest1 / OpenCVLibrary310 / src / main / , och byt namn på din kopia från libs till jniLibs . Du bör nu ha en cvtest1 / OpenCVLibrary310 / src / main / jniLibs- katalog. Åtsynkronisera ditt projekt och den här katalogen ska nu visas i projektvyn under openCVLibrary310 .
Gå till metoden onCreate i MainActivity.java och bifoga den här koden:
if (!OpenCVLoader.initDebug()) {
Log.e(this.getClass().getSimpleName(), " OpenCVLoader.initDebug(), not working.");
} else {
Log.d(this.getClass().getSimpleName(), " OpenCVLoader.initDebug(), working.");
}
Kör sedan din ansökan. Du bör se rader som detta i Android Monitor:
(Jag vet inte varför den raden med felmeddelandet finns)
- Försök nu att faktiskt använda någon openCV-kod. I exemplet nedan kopierade jag en .jpg-fil till cachekatalogen i cvtest1-applikationen på Android-emulatorn. Koden nedan laddar den här bilden, kör algoritmen för detektering av kanikanter och skriver sedan resultaten tillbaka till en .png-fil i samma katalog.
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);
- Kör din ansökan. Din emulator ska skapa en svartvit "kant" -bild. Du kan använda Android Device Monitor för att hämta utdata eller skriva en aktivitet för att visa den.