[JAVA] So verwenden Sie OpenCV 4 unter Android und zeigen die Kamera live an

Über diesen Artikel

Erstellen Sie eine einfache Android-App, die das Kamerabild nur negativ und positiv invertiert und ausgibt. OpenCV4 wird für die Kameraeingabe verwendet. Es kann als Basisprojekt zum Erstellen einer Anwendung mit Kamerabildern verwendet werden. In diesem Artikel werde ich erklären, wie die OpenCV-Bibliothek in das APK aufgenommen wird, ohne OpenCV Manager zu verwenden.

image.png

** Nachtrag (18.07.2020) ** Diese Methode kann anscheinend nicht mit dem neuesten Android Studio (oder Android SDK) verwendet werden. Es ist besser, Camera2 API oder Camera X zu verwenden. Hier erfahren Sie, wie Sie CameraX verwenden. https://qiita.com/iwatake2222/items/c0ebe6d84afdef57aab3

Entwicklungsumgebung

Vorbereitungen

Installieren Sie Android Studio

https://developer.android.com/studio

Es kann zweckmäßig sein, den Pfad mit adb in den Ordner zu legen. (In diesem Artikel nicht verwendet)

Laden Sie OpenCV herunter

https://github.com/opencv/opencv/releases Laden Sie opencv-4.1.0-android-sdk.zip von herunter und extrahieren Sie es an einen geeigneten Ort. Bitte wählen Sie die Version, die Sie mögen.

Im Folgenden wird die Erklärung mit dem Extraktionszielpfad als "{OpenCV-android-sdk}" beschrieben.

Integrieren Sie OpenCV in Ihr Projekt und apk

Erstellen Sie ein neues Projekt

01.png

OpenCV importieren

02.png

03.png

OpenCV wird geladen

Der Code der Aktivität, die OpenCV verwendet (app \ src \ main \ java \ com \ example \ myapplication \ MainActivity.java, wenn Sie zum Zeitpunkt der Projekterstellung Leere Aktivität ausgewählt und keine Einstellungen geändert haben), lautet wie folgt Bearbeiten

In der Praxis ist beides ausreichend. In einem echten Produkt würde ich nur "System.loadLibrary" verwenden.

MainActivity.java


public class MainActivity extends AppCompatActivity {

    static {
        System.loadLibrary("opencv_java4");     //hinzufügen
    }

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

        OpenCVLoader.initDebug();	//hinzufügen
    }
}

Führen Sie es in diesem Status aus. Wenn Logcat das folgende Protokoll anzeigt, ist es in Ordnung.

Logcat-Ausgabe


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

Als ich mir die Oberseite von Logcat ansah, wurde ein Fehler wie "OpenCV / StaticHelper: OpenCV-Fehler: Infobibliothek für OpenCV kann nicht geladen werden" angezeigt, der sich jedoch nicht auf den Vorgang auswirkte.

Live-Ansicht der Kamera

Nachdem Sie ein Projekt mit OpenCV haben, erstellen wir eine Anwendung, die die Live-Ansicht der Kamera anzeigt.

Berechtigungen festlegen

Nehmen Sie Einstellungen vor, um die Kamera zu verwenden

Manifest-Einstellungen

Zunächst müssen Sie deklarieren, dass "diese Anwendung eine Kamera verwendet".

Fügen Sie die folgenden drei Zeilen zu "app / src / main / AndroidManifest.xml" hinzu. Fügen Sie es direkt unter "" hinzu. Fügen Sie es in derselben Zeile wie die vorhandene hinzu.

AndroidManifest.xml


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

    <!--↓ Hinzufügen-->
    <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"/>
    <!--↑ Hinzufügen-->

    <application
        android:allowBackup="true"
Kürzung
    </application>

</manifest>

Erlaubnis bekommen

Tatsächlich reicht es aus, nur das Manifest festzulegen. Dies allein erfordert jedoch, dass der Benutzer Berechtigungen auf dem Administrationsbildschirm der App festlegt. Normale Benutzer wissen nicht einmal, wo sich der Bildschirm befindet.

Daher zeigt die App freiwillig einen Anforderungsbildschirm mit der Frage "Bitte geben Sie mir die Erlaubnis" an.

Wenn mit dem folgenden Code keine Berechtigung festgelegt ist, wird der Berechtigungsanforderungsbildschirm angezeigt. Der aufrufende Code wird später angezeigt.

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

CameraView-Platzierung

Fügen Sie CameraView zum Layout hinzu. Öffnen Sie layout / activity_main.xml und fügen Sie im Textmodus org.opencv.android.JavaCameraView hinzu.

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" />

    <!--↓ Hinzufügen-->
    <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"/>
    <!--↑ Hinzufügen-->
</android.support.constraint.ConstraintLayout>

Vollständiger Code

Der vollständige Code wird unten angezeigt.

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) {
        //Führen Sie hier eine Bildverarbeitung durch
        //Versuchen Sie, das Negative und das Positive umzukehren
        Core.bitwise_not(inputFrame, inputFrame);
        return inputFrame;
    }
}

Der Bildschirm kann sich je nach Modell, Geräteorientierung und Einstellungen drehen. Diese Anpassungen erschweren den Code und die Beschreibung und werden weggelassen. Ebenso werden das Ende und die Rückgabe von onDestory und onResume weggelassen.

abschließend

Recommended Posts

So verwenden Sie OpenCV 4 unter Android und zeigen die Kamera live an
Wie man eine Ansicht auf Android "aushöhlt"
Verwendung von EventBus3 und ThreadMode
Verwendung von Ruby on Rails
Wie man Gleichheit und Gleichheit benutzt (wie man Gleichheit benutzt)
Verwendung von Bio-Formaten unter Ubuntu 20.04
So installieren und verwenden Sie Composer auf einer ECS-Instanz unter Ubuntu 16.04
Ein Memorandum zur Verwendung von Eclipse
Verwendung von binding.pry für die Ansichtsdatei
Verwendung von Apache Derby unter Eclipse
Verwendung von OrientJS und OrientDB zusammen
So erkennen Sie Mikrofonkonflikte unter Android
So richten Sie kapt ein und verwenden es
[Ruby on Rails] Verwendung von redirect_to
Verwendung von Teilzeichenfolgen und Substratmethoden
Verwendung von @Builder und @NoArgsConstructor zusammen
Verwendung von ExpandableListView in Android Studio
[Android] So aktivieren / deaktivieren Sie das Benachrichtigungsfeld mit StatusBarManager
Verwendung des Kameramoduls OV7725 (ESP32-WROVER-B)
[Java] Verwendung der FileReader-Klasse und der BufferedReader-Klasse
[Ruby] Verwendung der gsub-Methode und der sub-Methode
Hinweise zur Verwendung der einzelnen JUnit-Regeln
Verwendung von Segmented Control und zu notierenden Punkten
Verwendung der Scope- und Pass-Verarbeitung (Servist)
[Java] Verwendung der Kalenderklasse und der Datumsklasse
So verwenden Sie Eclipse auf meinem PC mit 32 Bit und 2 GB Speicher
Verwendung von Map
Wie benutzt man rbenv?
Verwendung mit_option
Verwendung von fields_for
Verwendung von java.util.logging
Verwendung der Karte
Verwendung von collection_select
Wie benutzt man Twitter4J
Wie benutzt man active_hash! !!
Verwendung von MapStruct
Verwendung von TreeSet
[Verwendung des Etiketts]
Wie man Identität benutzt
Wie man Hash benutzt
Verwendung von Dozer.mapper
Wie benutzt man Gradle?
Verwendung von org.immutables
Verwendung von java.util.stream.Collector
Verwendung von VisualVM
Verwendung von Map
Verwendung der nicht standardmäßigen Java-Bibliothek in IntelliJ IDEA
Verwendung von Truth (Assertion Library für Java / Android)
[Android Studio] Ich möchte eine Maven-Bibliothek unter Android verwenden
[Rails] Bearbeiten und Anpassen von Geräteansichten und Controllern
(Ruby on Rails6) So erstellen Sie ein Modell und eine Tabelle
Verwendung und Anwendung der JFrame / Canvas-Klasse von Java
Hinweise zur Verwendung regulärer Ausdrücke in Java