Filtre Sobel utilisant OpenCV sur Android (Java)

introduction

J'ai implémenté un filtre Sobel en utilisant OpenCV 3.2 sur Android. Notez que certaines parties ne pouvaient pas être attendues avec OpenCV de Java.

Environnement d'exécution, etc.

Logiciel

Windows 10 Home 64bit Android Studio 2.2.3 OpenCV 3.2

Terminal de débogage

Nexus 5x (Android 7.1.1)

Préparation à OpenCV

Voir ci-dessous Remarque sur l'introduction d'OpenCV pour Android dans Android Studio

point

Comme il est ennuyeux s'il ne s'agit que d'un filtre Sobel unidirectionnel, après l'avoir converti en échelle de gris, il est intentionnellement divisé en composants RVB et filtré dans les directions X et y pour chaque couleur pour obtenir la racine carrée moyenne carrée. Après cela, la valeur maximale parmi les valeurs des trois composants a été utilisée comme valeur de pixel finale.

Note

Avec C ++ OpenCV

matC = matA +matB;

Vous pouvez écrire comme ça, mais vous ne pouvez pas le faire avec OpenCV de Java

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;
        }
    }

Résultat d'exécution sur la machine réelle

Screenshot_20170216-223854-1.jpg

Lien GitHub

Implémenté en utilisant AsyncTask pour la commodité de l'interface graphique. Ici

apk Lien de l'apk construit Ici

référence

Traitement et reconnaissance d'image par OpenCV et Visual C ++ (7) ----- Utilisez divers filtres de détection de bord -----

Recommended Posts

Filtre Sobel utilisant OpenCV sur Android (Java)
Bureau: OpenCV Sobel Filter2
Bureau: OpenCV Sobel Filter
Essayez d'utiliser Firebase Cloud Functions sur Android (Java)
Essayez la communication en utilisant gRPC sur un serveur Android + Java
Essayez la classification d'image à l'aide de TensorFlow Lite sur Android (JAVA)
OSX 10.15 (Catalina) Utilisation de Java avec β
Enregistrer ArrayList à l'aide de GSON sur Android
Remarques sur le traitement des threads Android (java)
Essayez d'utiliser le service sur Android Oreo
Utilisation de JupyterLab + Java avec WSL sous Windows 10
Appeler java depuis C ++ sur Android NDK
Remarques sur les opérateurs utilisant Java ~ Type chaîne ~
J'ai essayé d'utiliser OpenCV avec Java + Tomcat
Construire OpenCV avec Java Wrapper sur Ubuntu 18.04
[Java] Filtre de servlet
Installez java et android-sdk sur Mac en utilisant homebrew
[Android] [Java] Télécharger des images sur GCS (Google Cloud Storage) avec Stream à l'aide de Glide
Traduire à l'aide de l'API Microsoft Translator Text sur Android ~ Implémentation ~
Histoire de l'automatisation des tests avec Appium [Android / java]
Utilisation de Java 8 avec Bluemix (sur Liberty Runtime & DevOps Service)
Créez un environnement de développement Java à l'aide de jenv sur votre Mac
Installez java et maven sur un nouveau mac en utilisant brew
J'ai essayé d'utiliser Log4j2 sur un serveur Java EE
Bureau: Filtre OpenCV Kirsch
Bureau: Filtre laplacien OpenCV 2
Tri à l'aide du comparateur java
[Java] Filtrer les traces de pile
Installez Java sur Mac
Bureau: Filtre Freichennel OpenCV
[Java] Créer un filtre
Bureau: OpenCV Mean Filter
[Android] Notes sur xml
Bureau: référentiel Java OpenCV
Exécutez PostgreSQL sur Java
Utiliser JDBC sous Linux
Pratique de grattage avec Java ②
Bureau: OpenCV pyrMeanShift Filter
Bureau: Filtre OpenCV Scharr
Utiliser OpenCV avec Java
Bureau: Filtre laplacien OpenCV
Bureau: OpenCV Robinson Filter
Pratique du grattage avec Java ①
Bureau: Filtre OpenCV SqrBox
Bureau: Filtre OpenCV Prewitt
Bureau: Filtre personnalisé OpenCV
Comment utiliser OpenCV 4 sur Android et afficher la vue en direct de la caméra
Utilisation de plusieurs versions de Java avec Brew sur Mac + jEnv
[Débutant] Application Android qui fait rouler des balles à l'aide de capteurs [Java]
Vous utilisez actuellement Java 6. Solution dans Android Studio Gradle
Essayez Hello World en utilisant Java brut sur le conteneur Docker
J'ai essayé d'utiliser la bibliothèque CameraX avec Android Java Fragment
Utiliser la communication série sur Android
Essayez la communication en utilisant gRPC sur un serveur Android + Java
[Android] Notes sur xml