[JAVA] Comment utiliser OpenCV 4 sur Android et afficher la vue en direct de la caméra

À propos de cet article

Créez une application Android simple qui inverse simplement l'image de la caméra de manière négative et positive et la produit. OpenCV4 est utilisé pour l'entrée de la caméra. Il peut être utilisé comme projet de base pour créer une sorte d'application utilisant des images de caméra. Dans cet article, j'expliquerai comment inclure la bibliothèque OpenCV dans l'APK sans utiliser OpenCV Manager.

image.png

** Addendum (2020/07/18) ** Il semble que cette méthode ne puisse pas être utilisée avec Android Studio (ou SDK Android) récent. Il est préférable d'utiliser l'API Camera2 ou Camera X. Voici comment utiliser CameraX. https://qiita.com/iwatake2222/items/c0ebe6d84afdef57aab3

Environnement de développement

Préparation préalable

Installez Android Studio

https://developer.android.com/studio

Il peut être pratique de mettre le chemin dans le dossier avec adb. (Non utilisé dans cet article)

Télécharger OpenCV

https://github.com/opencv/opencv/releases Téléchargez ʻopencv-4.1.0-android-sdk.zip` et décompressez-le à un emplacement approprié. Veuillez choisir la version que vous aimez.

Ci-après, l'explication sera décrite avec le chemin de destination de l'extraction comme «{OpenCV-android-sdk}».

Incorporez OpenCV dans votre projet et apk

Créer un nouveau projet

--Ouvrez Android Studio --Cliquez sur Démarrer un nouveau projet Android Studio --Sélectionnez ʻEmpty Activity` et Next

01.png

Importer OpenCV

02.png

03.png

Chargement OpenCV

Le code de l'activité qui utilise OpenCV (si vous avez sélectionné Activité vide au moment de la génération du projet et n'avez modifié aucun paramètre, ʻapp \ src \ main \ java \ com \ example \ myapplication \ MainActivity.java`) comme suit Éditer

En pratique, l'un ou l'autre suffit. Dans un vrai produit, je n'utiliserais que System.loadLibrary.

MainActivity.java


public class MainActivity extends AppCompatActivity {

    static {
        System.loadLibrary("opencv_java4");     //ajouter à
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        OpenCVLoader.initDebug();	//ajouter à
    }
}

Exécutez dans cet état, et si Logcat affiche le journal suivant, c'est OK.

Sortie Logcat


2019-05-25 18:50:20.050 29439-29439/com.example.myapplication I/OpenCV/StaticHelper: General configuration for OpenCV 4.1.0 =====================================
2019-05-25 18:50:20.050 29439-29439/com.example.myapplication I/OpenCV/StaticHelper:   Version control:               4.1.0
2019-05-25 18:50:20.050 29439-29439/com.example.myapplication I/OpenCV/StaticHelper:   Platform:
2019-05-25 18:50:20.050 29439-29439/com.example.myapplication I/OpenCV/StaticHelper:     Timestamp:                   2019-04-07T19:03:43Z
2019-05-25 18:50:20.050 29439-29439/com.example.myapplication I/OpenCV/StaticHelper:     Host:                        Linux 4.15.0-47-generic x86_64
2019-05-25 18:50:20.050 29439-29439/com.example.myapplication I/OpenCV/StaticHelper:     Target:                      Android 1 aarch64
2019-05-25 18:50:20.050 29439-29439/com.example.myapplication I/OpenCV/StaticHelper:     CMake:                       3.6.0-rc2
2019-05-25 18:50:20.050 29439-29439/com.example.myapplication I/OpenCV/StaticHelper:     CMake generator:             Ninja
2019-05-25 18:50:20.050 29439-29439/com.example.myapplication I/OpenCV/StaticHelper:     CMake build tool:            /opt/android/android-sdk.gradle/cmake/3.6.4111459/bin/ninja
2019-05-25 18:50:20.050 29439-29439/com.example.myapplication I/OpenCV/StaticHelper:     Configuration:               Release

D'une manière ou d'une autre, quand j'ai regardé le haut de Logcat, ʻOpenCV / StaticHelper: Erreur OpenCV: Impossible de charger la bibliothèque d'informations pour OpenCV` J'ai eu cette erreur, mais cela n'a pas affecté l'opération.

Affichage de la vue en direct de la caméra

Maintenant que vous avez un projet qui intègre OpenCV, créons une application qui affiche la vue en direct de la caméra.

Définition des autorisations

Définissez les paramètres pour utiliser l'appareil photo

Paramètres du manifeste

Tout d'abord, vous devez déclarer que "cette application utilise une caméra".

Ajoutez les trois lignes suivantes à ʻapp / src / main / AndroidManifest.xml. Ajoutez-le directement sous . Ajoutez-le dans la même ligne que le 'existant.

AndroidManifest.xml


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication">

    <!--↓ Ajouter-->
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-feature android:name="android.hardware.camera" android:required="false"/>
    <uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>
    <!--↑ Ajouter-->

    <application
        android:allowBackup="true"
réduction
    </application>

</manifest>

Obtenir la permission

En fait, il suffit de définir le manifeste. Cependant, cela seul nécessite que l'utilisateur définisse les autorisations à partir de l'écran d'administration de l'application. Les utilisateurs normaux ne savent même pas où se trouve l'écran.

Par conséquent, l'application affichera volontairement un écran de demande demandant «Veuillez me donner la permission».

Avec le code suivant, si l'autorisation n'est pas définie, l'écran de demande d'autorisation s'affiche. Le code d'appel sera affiché plus tard.

MainActivity.java


    public static boolean getPermissionCamera(Activity activity) {
        if (ContextCompat.checkSelfPermission(
                activity,
                android.Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {
            String[] permissions = new String[]{Manifest.permission.CAMERA};
            ActivityCompat.requestPermissions(
                    activity,
                    permissions,
                    0);
            return false;
        } else {
            return true;
        }
    }

Placement CameraView

Ajoutez CameraView à la mise en page. Ouvrez layout / activity_main.xml et en mode texte, ajoutez ʻorg.opencv.android.JavaCameraView`.

activity_main.xml


<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <!--↓ Ajouter-->
    <org.opencv.android.JavaCameraView
        android:id="@+id/camera_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="visible"
        tools:layout_editor_absoluteX="0dp"
        tools:layout_editor_absoluteY="0dp"
        app:show_fps="true"/>
    <!--↑ Ajouter-->
</android.support.constraint.ConstraintLayout>

Code complet

Le code complet est indiqué ci-dessous.

--Hérite de l'interface CameraBridgeViewBase.CvCameraViewListener.

MainActivity.java


public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener {
    private CameraBridgeViewBase m_cameraView;

    static {
        System.loadLibrary("opencv_java4");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getPermissionCamera(this);
//        OpenCVLoader.initDebug();
        m_cameraView = findViewById(R.id.camera_view);
        m_cameraView.setCvCameraViewListener(this);
        m_cameraView.enableView();
    }

    public static boolean getPermissionCamera(Activity activity) {
        if (ContextCompat.checkSelfPermission(
                activity,
                android.Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {
            String[] permissions = new String[]{Manifest.permission.CAMERA};
            ActivityCompat.requestPermissions(
                    activity,
                    permissions,
                    0);
            return false;
        } else {
            return true;
        }
    }

    @Override
    public void onCameraViewStarted(int width, int height) {

    }

    @Override
    public void onCameraViewStopped() {

    }

    @Override
    public Mat onCameraFrame(Mat inputFrame) {
        //Faites un peu de traitement d'image ici
        //Essayez d'inverser le négatif et le positif
        Core.bitwise_not(inputFrame, inputFrame);
        return inputFrame;
    }
}

L'écran peut pivoter en fonction du modèle, de l'orientation de l'appareil et des paramètres. Ces ajustements compliquent le code et la description et sont omis. De même, la fin et le retour de onDestory et onResume sont également omis.

en conclusion

Recommended Posts

Comment utiliser OpenCV 4 sur Android et afficher la vue en direct de la caméra
Comment "évider" une vue sur Android
Comment utiliser EventBus3 et ThreadMode
Comment utiliser Ruby on Rails
Comment utiliser l'égalité et l'égalité (comment utiliser l'égalité)
Comment utiliser les bio-formats sur Ubuntu 20.04
Comment installer et utiliser Composer sur une instance ECS sur Ubuntu 16.04
Un mémorandum sur l'utilisation d'Eclipse
Comment utiliser binding.pry pour afficher le fichier
Comment utiliser Apache Derby sur Eclipse
Comment utiliser OrientJS et OrientDB ensemble
Comment détecter les conflits de microphone sur Android
Comment configurer et utiliser kapt
[Ruby on Rails] Comment utiliser redirect_to
Comment utiliser les méthodes substring et substr
Comment utiliser @Builder et @NoArgsConstructor ensemble
Comment utiliser ExpandableListView dans Android Studio
[Android] Comment activer / désactiver le panneau de notification à l'aide de StatusBarManager
Comment utiliser le module caméra OV7725 (ESP32-WROVER-B)
[Java] Comment utiliser la classe FileReader et la classe BufferedReader
[Ruby] Comment utiliser la méthode gsub et la sous-méthode
Notes sur l'utilisation de chaque règle de JUnit
Comment utiliser le contrôle segmenté et les points à noter
Comment utiliser la portée et le traitement des passes (servist)
[Java] Comment utiliser la classe Calendar et la classe Date
Comment utiliser Eclipse sur mon PC avec 32 bits et 2 Go de mémoire
Comment utiliser Map
Comment utiliser rbenv
Comment utiliser with_option
Comment utiliser fields_for
Comment utiliser java.util.logging
Comment utiliser la carte
Comment utiliser collection_select
Comment utiliser Twitter4J
Comment utiliser active_hash! !!
Comment utiliser MapStruct
Comment utiliser TreeSet
[Comment utiliser l'étiquette]
Comment utiliser l'identité
Comment utiliser le hachage
Comment utiliser Dozer.mapper
Comment utiliser Gradle
Comment utiliser org.immutables
Comment utiliser java.util.stream.Collector
Comment utiliser VisualVM
Comment utiliser Map
Comment utiliser la bibliothèque non standard Java sur IntelliJ IDEA
Comment utiliser Truth (bibliothèque d'assertions pour Java / Android)
[Android Studio] Je souhaite utiliser une bibliothèque Maven sur Android
[Rails] Comment modifier et personnaliser les vues et les contrôleurs de conception
(Ruby on Rails6) Comment créer un modèle et une table
Comment utiliser et appliquer la classe JFrame / Canvas de Java
Remarques sur l'utilisation des expressions régulières en Java