Sobel-Filter mit OpenCV unter Android (Java)

Einführung

Ich habe einen Sobel-Filter mit OpenCV 3.2 unter Android implementiert. Beachten Sie, dass es einige Teile gab, die mit Javas OpenCV nicht zu erwarten waren.

Ausführungsumgebung usw.

Software

Windows 10 Home 64bit Android Studio 2.2.3 OpenCV 3.2

Debug-Terminal

Nexus 5x (Android 7.1.1)

Vorbereitung für OpenCV

Siehe unten Hinweis zur Einführung von OpenCV für Android in Android Studio

Punkt

Da es langweilig ist, wenn es sich nur um ein Einweg-Sobel-Filter handelt, wird es nach der Konvertierung in Graustufen absichtlich in RGB-Komponenten unterteilt und für jede Farbe in X- und Y-Richtung gefiltert, um die quadratische durchschnittliche Quadratwurzel zu erhalten. Danach wurde der Maximalwert unter den Werten der drei Komponenten als endgültiger Pixelwert verwendet.

Memo

Mit C ++ OpenCV

matC = matA +matB;

Sie können so schreiben, aber mit Javas OpenCV nicht

Code

    private Bitmap sobel(Bitmap bitmap) {
        bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
        Mat mat = new Mat();
        Mat matR = new Mat();
        Mat matG = new Mat();
        Mat matB = new Mat();
        Utils.bitmapToMat(bitmap, mat);

        Core.extractChannel(mat, matR, 0);
        myFiltering(matR);

        Core.extractChannel(mat, matG, 1);
        myFiltering(matG);

        Core.extractChannel(mat, matB, 2);
        myFiltering(matB);

        matMax3(matB, matG, matR, matB);

        Utils.matToBitmap(matB, bitmap);
        return bitmap;
    }

    private void myFiltering(Mat src){
        Mat matX = new Mat();
        Mat matY = new Mat();

        Imgproc.GaussianBlur(src, src, new Size(3, 3), 0, 0);
        Imgproc.Sobel(src, matX, src.depth(), 0, 1);
        Imgproc.Sobel(src, matY, src.depth(), 1, 0);
        matRMS(matX, matY, src);
    }

    private void matRMS(Mat src1, Mat src2, Mat dst) {

        int size = (int) (src1.total() * src1.channels());
        byte[] temp1 = new byte[size];
        byte[] temp2 = new byte[size];
        byte[] temp3 = new byte[size];
        src1.get(0, 0, temp1);
        src2.get(0, 0, temp2);

        for (int i = 0; i < size; i++) {
            temp3[i] = (byte)Math.sqrt((temp1[i] * temp1[i] + temp2[i] * temp2[i]) / 2);
        }

        dst.put(0, 0, temp3);
    }

    private void matMax3(Mat src1, Mat src2, Mat src3, Mat dst) {

        int size = (int) (src1.total() * src1.channels());
        byte[] temp1 = new byte[size];
        byte[] temp2 = new byte[size];
        byte[] temp3 = new byte[size];
        byte[] temp4 = new byte[size];
        src1.get(0, 0, temp1);
        src2.get(0, 0, temp2);
        src3.get(0, 0, temp3);

        for (int i = 0; i < size; i++) {
            temp4[i] = chooseBig(chooseBig(temp1[i], temp2[i]), temp3[i]);
        }

        dst.put(0, 0, temp4);
    }

    private byte chooseBig(byte a, byte b) {
        if(b > a) {
            return b;
        }else {
            return a;
        }
    }

Ausführungsergebnis auf der eigentlichen Maschine

Screenshot_20170216-223854-1.jpg

GitHub-Link

Implementiert mit AsyncTask für die Bequemlichkeit der GUI. Hier

apk Link der gebauten apk Hier

Referenz

Bildverarbeitung und Erkennung durch OpenCV und Visual C ++ (7) ----- Verwenden Sie verschiedene Kantenerkennungsfilter -----

Recommended Posts

Sobel-Filter mit OpenCV unter Android (Java)
Desktop: OpenCV Sobel Filter2
Desktop: OpenCV Sobel Filter
Versuchen Sie, Firebase Cloud-Funktionen unter Android (Java) zu verwenden.
Versuchen Sie die Kommunikation mit gRPC auf einem Android + Java-Server
Versuchen Sie die Bildklassifizierung mit TensorFlow Lite unter Android (JAVA).
OSX 10.15 (Catalina) Verwenden von Java mit β
Speichern Sie ArrayList mit GSON unter Android
Versuchen Sie, den Dienst auf Android Oreo zu verwenden
Verwenden von JupyterLab + Java mit WSL unter Windows 10
Rufen Sie Java von C ++ auf Android NDK auf
Hinweise zu Operatoren, die Java ~ String type ~ verwenden
Ich habe versucht, OpenCV mit Java + Tomcat zu verwenden
Erstellen Sie OpenCV mit Java Wrapper unter Ubuntu 18.04
[Java] Servlet-Filter
Installieren Sie Java und Android-SDK auf dem Mac mit Homebrew
[Android] [Java] Laden Sie Bilder auf GCS (Google Cloud Storage) mit Stream mit Glide herunter
Übersetzen Sie mit der Microsoft Translator Text API unter Android ~ Implementierung ~
Geschichte der Testautomatisierung mit Appium [Android / Java]
Verwenden von Java 8 mit Bluemix (auf Liberty Runtime & DevOps Service)
Erstellen Sie eine Java-Entwicklungsumgebung mit jenv auf Ihrem Mac
Installieren Sie Java und Maven mit Brew auf einem neuen Mac
Ich habe versucht, Log4j2 auf einem Java EE-Server zu verwenden
Desktop: OpenCV Kirsch Filter
Desktop: OpenCV Laplace Filter 2
Sortieren mit Java-Komparator
[Java] Filterstapelspuren
Installieren Sie Java auf dem Mac
Desktop: OpenCV Freichennel Filter
[Java] Erstellen Sie einen Filter
Desktop: OpenCV-Mittelwertfilter
[Android] Hinweise zu XML
Desktop: OpenCV Java Repository
Führen Sie PostgreSQL unter Java aus
Verwenden Sie JDBC unter Linux
Schrottpraxis mit Java ②
Desktop: OpenCV pyrMeanShift Filter
Desktop: OpenCV Scharr Filter
Verwenden Sie OpenCV mit Java
Desktop: OpenCV-Laplace-Filter
Desktop: OpenCV Robinson Filter
Schrottpraxis mit Java ①
Desktop: OpenCV SqrBox Filter
Desktop: OpenCV Prewitt Filter
Desktop: OpenCV-angepasster Filter
So verwenden Sie OpenCV 4 unter Android und zeigen die Kamera live an
Verwenden mehrerer Java-Versionen mit Brew auf Mac + jEnv
[Anfänger] Android App, die Bälle mit Sensoren rollt [Java]
Sie verwenden derzeit Java 6. Lösung in Android Studio Gradle
Versuchen Sie Hello World mit einfachem Java im Docker-Container
Ich habe versucht, die CameraX-Bibliothek mit Android Java Fragment zu verwenden
Verwenden Sie die serielle Kommunikation unter Android
Versuchen Sie die Kommunikation mit gRPC auf einem Android + Java-Server
[Android] Hinweise zu XML