Verwenden Sie OpenCV mit Java

Einführung

Ich wollte die OpenCV-Bibliothek in Java verwenden, aber es war unerwartet schwierig, deshalb werde ich die Prozedur aufschreiben. Um das periphere Wissen zu organisieren, führte es auch zu einem Verständnis grundlegender Dinge wie der Verwendung von Java-Bibliotheken und -Paketen, daher werde ich auch darauf eingehen. Sowohl (1) beim Kompilieren im Terminal als auch (2) beim Kompilieren mit der IDE (insbesondere IntelliJ) werden beschrieben.

Umgebung

Java-Installation

Für alle Fälle werde ich die Java-Installationsmethode (macOS) verlassen. Ich habe es mit Homebrew installiert.

# install Homebrew (if needed)
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
# update packages, install cask, and allow cask to look up versions
brew update
brew tap homebrew/cask
brew tap homebrew/cask-versions
# install Java
brew cask install java #Sie können installieren, indem Sie die Version angeben, wenn Sie Java13 usw. verwenden.

Dadurch wird Java in / Library / installiert. Die hierarchische Struktur sollte wie folgt sein.

/Library/Java
          |-- Extensions/ #Java-Erweiterungsordner
          `-- JavaVirtualMachine/
               `-- openjdk-13.0.2.jdk/ #Installiertes JDK
                    `-- Contents/
                         |-- Home/ #JDK-Ausgangsverzeichnis
                         |    |--
                         |     ...
                         |-- MacOS/
                         `-- Info.plist

Übrigens wie immer

java --version

Dann können Sie die Version überprüfen.

OpenCV Sie können OpenCV Java unter macOS installieren, indem Sie der ersten Site unten folgen. Ab Juni 2020 ist das neueste Java 4.3.0. Wenn Sie es also ohne Angabe der Version installieren, wird es installiert. Die Installation selbst dauert unerwartet lange.

Hoffentlich wird die Bibliothek in / usr / local / Cellar / opencv / 4.3.0_4 / share / java / mit der folgenden hierarchischen Struktur installiert. Dies sollte je nach Maschine und Softwareversion variieren.

/java/
  `-- opencv4/
       |-- opencv-430.jar #Statische Bibliothek
       `-- libopencv_java430.dylib* #Dynamische Bibliothek
            |--
             ...

Übrigens ist die .jar-Datei eine statische Bibliothek, die .dylib-Datei ist eine dynamische Bibliothek (Abkürzung für dynamische Bibliothek) und die dynamische Bibliothek ist eine Bibliothek, auf die zur Laufzeit und nicht zur Kompilierungszeit verwiesen wird [^ 1]. Die JAR-Datei ist übrigens eine komprimierte Datei, die die durch Kompilierung erstellten Klassendateien in einer [^ 2] sammelt.

Kompilieren und ausführen

Test.java


import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.CvType;
import org.opencv.core.Scalar;

public class Test {
    // Compulsory
    static{ System.loadLibrary(Core.NATIVE_LIBRARY_NAME); }

    public static void main(String[] args) {
        System.out.println("Welcome to OpenCV " + Core.VERSION);
        Mat m = new Mat(5, 10, CvType.CV_8UC1, new Scalar(0));
        System.out.println("OpenCV Mat: " + m);
        Mat mr1 = m.row(1);
        mr1.setTo(new Scalar(1));
        Mat mc5 = m.col(5);
        mc5.setTo(new Scalar(5));
        System.out.println("OpenCV Mat data:\n" + m.dump());
    }
}

Lassen Sie uns eine Datei wie diese erstellen und kompilieren. In dem Verzeichnis, in dem sich die Datei befindet, genau wie beim normalen Kompilieren einer Java-Datei

javac Test.java

Wenn ich es als kompiliere, erhalte ich viele Fehler wie unten. Screen Shot 2020-06-08 at 20.16.11.png Dies bedeutet, dass die OpenCV-Bibliothek nicht gefunden werden kann, da dort steht, dass das Paket org.opencv.core nicht vorhanden ist. Mit anderen Worten, obwohl OpenCV installiert war, konnte javac die Bibliothek beim Kompilieren nicht finden. Um dies zu lösen, ist es notwendig, es wie folgt durch ** Klassenpfad ** zu geben. Durch Hinzufügen der Option "-classpath" oder "-cp" zur Kompilierungszeit wird javac dort suchen.

javac -classpath /usr/local/Cellar/opencv/4.3.0_4/share/java/opencv4/opencv-430.jar Test.java

Sie müssen zur Laufzeit auch den Pfad der dynamischen Bibliothek angeben.

java -Djava.library.path="/usr/local/Cellar/opencv/4.3.0_4/share/java/opencv4" -classpath /usr/local/Cellar/opencv/4.3.0_4/share/java/opencv4/opencv-430.jar: Test

Übrigens müssen Sie zum Zeitpunkt der Ausführung (macOS) nach dem Klassenpfad einen Doppelpunkt : setzen. Im Fall von Windows ist es ein Semikolon ;. Wenn richtig gemacht

Ausführungsergebnis


Welcome to OpenCV 4.3.0
OpenCV Mat: Mat [ 5*10*CV_8UC1, isCont=true, isSubmat=false, nativeObj=0x7fd0f2e3f230, dataAddr=0x7fd0f2e3f0c0 ]
OpenCV Mat data:
[  0,   0,   0,   0,   0,   5,   0,   0,   0,   0;
   1,   1,   1,   1,   1,   5,   1,   1,   1,   1;
   0,   0,   0,   0,   0,   5,   0,   0,   0,   0;
   0,   0,   0,   0,   0,   5,   0,   0,   0,   0;
   0,   0,   0,   0,   0,   5,   0,   0,   0,   0]

Wird angezeigt.

Richtiger

Verwenden Sie "import" oder "package", um eine Klasse in Java in einer separaten Datei zu erstellen und diese Klasse in einer anderen Java-Datei zu verwenden. Das obige Beispiel ist eine einzelne Datei, aber beim Erstellen eines Programms hängen die Dateien häufig auf diese Weise voneinander ab. Darüber hinaus möchten wir diesmal auf OpenCV verweisen, dh auf eine externe Bibliothek. In einem solchen Fall wie zuvor

javac -classpath /usr/local/Cellar/opencv/4.3.0_4/share/java/opencv4/opencv-430.jar Test.java

Als ich versuchte, als zu kompilieren, bekam ich diesmal einen Fehler mit dem Paket und dem Import.

Dies bedeutet, dass javac durch Angabe des Klassenpfads diesen nicht finden konnte, da nach einem Paket gesucht oder von diesem Pfad importiert wurde. Java drückt die hierarchische Struktur von Paketen und Importen mit Punkten . anstelle von Schrägstrichen / aus, wird jedoch mit einem relativen Pfad aus dem aktuellen Verzeichnis geschrieben, in dem die Kompilierung zuerst ausgeführt wird ([Referenzsite](Referenzsite https://www.sejuku.net/blog/63008)). Mit anderen Worten, ** der Klassenpfad war standardmäßig das aktuelle Verzeichnis **, aber da er durch die Option -classpath überschrieben wurde, kann er nicht mehr gefunden werden.

Eine mögliche Lösung besteht darin, den Paket- oder Importpfad in (1) einen absoluten Pfad oder (2) einen relativen Pfad aus der zur Kompilierungszeit angegebenen Option -classpath zu ändern. Der absolute Pfad ist jedoch lang und muss jedes Mal neu geschrieben werden, wenn Sie das Programm auf einen anderen PC verschieben. Es ist auch Unsinn, den Inhalt der Datei unter Berücksichtigung der Kompilierungsoptionen zu ändern, und da der Speicherort der externen Bibliothek je nach PC unterschiedlich ist, muss sie jedes Mal neu geschrieben werden. Schließlich ist es normalerweise ein relativer Pfad von der Hauptdatei.

Anstatt den Klassenpfad neu zu schreiben, möchte ich ihn daher so angeben, dass er hinzugefügt wird (einschließlich des Pfads für die OpenCV-Bibliothek). Wenn Sie ihn jedoch mit einem Doppelpunkt : verbinden, können Sie mehrere Klassenpfade angeben. Verwenden Sie diesen. .. Es bedeutet, es als -class path.: (OpenCV path) einschließlich . des aktuellen Verzeichnisses anzugeben. Auf diese Weise wird unter Beibehaltung der ursprünglichen Paketabhängigkeiten usw. auch ein neuer Klassenpfad für die OpenCV-Bibliothek hinzugefügt.

javac -classpath .:/usr/local/Cellar/opencv/4.3.0_4/share/java/opencv4/opencv-430.jar Test.java #kompilieren
java -Djava.library.path="/usr/local/Cellar/opencv/4.3.0_4/share/java/opencv4" -classpath .:/usr/local/Cellar/opencv/4.3.0_4/share/java/opencv4/opencv-430.jar: Test #Lauf

Jetzt können Sie kompilieren und korrekt ausführen. (Referenzseite) Java Programming: Package and Classpath

Ein anderer Weg

Diese Methode ist eine Methode, um den Klassenpfad zum Zeitpunkt der Kompilierung oder Ausführung vorübergehend anzugeben. Da / Library / Extensions / jedoch ein Java-Erweiterungsordner ist, wird der Pfad durch Einfügen der JAR-Datei und der Dylib-Datei hier übergeben. Es scheint eine Methode zu geben. In diesem Fall muss die Option -classpath nicht jedes Mal angegeben werden.

Einstellmethode in IntelliJ

[** IntelliJ **](https://www.jetbrains.com/idea/promo/ultimate/?gclid=Cj0KCQjwoPL2BRDxARIsAEMm9y-AFlyJ1PpLvFySDiJJ-ABoUi0xzY9fdK4FnQLvO4dX-6Pt Umgebung). Früher habe ich OpenCV bei der Entwicklung mit einem Editor und einem Terminal verwendet, aber ich werde auch die Einstellungsmethode aufschreiben, wenn ich IntelliJ verwende. Das Tutorial von IntelliJ selbst finden Sie übrigens weiter unten.

Grundlegende Konfiguration

Nur für den Fall, ich werde das grundlegende Einstellungsverfahren von der Installation von IntelliJ verlassen.

Installation

Wählen Sie das Betriebssystem auf der Installationsseite aus und laden Sie die Community Edition herunter (Schüler können auch lizenzierte Dateien herunterladen).

Plugin

(Falls erforderlich) * Willkommen bei IntelliJ IDEA * Im Fenster * Konfigurieren-> Plugins * zum Einfügen des Plugins ("Java Visualizer" usw. ist praktisch). Wenn Sie das Plug-In installieren, müssen Sie IntelliJ neu starten.

SDK-Einstellungen

SDK (Software Development Kit) ist ein Softwareentwicklungstool, das für die Softwareentwicklung benötigt wird. Das SDK für Java heißt JDK (Java Development Kit) und ist bereits im Betriebssystem installiert. Daher ist es gut für die Entwicklung auf dem Terminal geeignet. IntelliJ muss dies jedoch auch wissen, dh es muss den Pfad durchlaufen. es gibt. Screen Shot 2020-06-08 at 12.16.39.png

Stellen Sie das SDK (Software Development Kit) unter "* Konfigurieren-> Struktur für neue Projekte *" ein. Sie können dies tun, indem Sie [diesem Dokument] folgen (https://www.jetbrains.com/help/idea/sdk.html).

OpenCV-Bibliothekseinstellungen

Sie können ein Basisprogramm mit den oben genannten Einstellungen entwickeln. Wenn Sie jedoch eine externe Bibliothek wie diese verwenden, müssen Sie diese festlegen. IntelliJ ist eine IDE, die darin kompiliert und ausgeführt wird. Daher muss beim Kompilieren und Ausführen im Terminal im Voraus festgelegt werden, dass der Klassenpfad angegeben werden soll. Am Beispiel dieses OpenCV wird der Ablauf erläutert.

Wählen Sie "* Datei-> Projektstruktur ", um das Fenster zu öffnen, und wählen Sie " Module " auf der Registerkarte links. Wählen Sie dann das Feld " Abhängigkeiten " aus, wählen Sie " JARs oder Verzeichnisse *" über die Schaltfläche "Hinzufügen" (+ Schaltfläche unten links) und fügen Sie die JAR-Datei in das installierte OpenCV ein. In meinem Fall befand es sich am Speicherort "/ usr / local / Cellar / opencv / 4.3.0_4 / share / java / opencv4 / opencv-430.jar". Wählen Sie diese Datei aus und sie wird wie folgt hinzugefügt Screen Shot 2020-06-08 at 13.09.35.png

Doppelklicken Sie anschließend auf das Feld der hinzugefügten JAR-Datei, um das Fenster "* Modulbibliothek konfigurieren " zu öffnen. Über die Schaltfläche "Hinzufügen" unten links befindet es sich diesmal im selben Verzeichnis wie die JAR-Datei. /usr/local/Cellar/opencv/4.3.0_4/share/java/opencv4/libopencv_java430.dylib Wählen Sie die Datei aus. Dann wird eine Spalte mit dem Namen " Native Library Locations *" hinzugefügt, wie im Bild gezeigt, und dies ist das Ende. Screen Shot 2020-06-08 at 12.57.18.png

Wenn Sie versuchen, dieselbe Testdatei wie oben auszuführen und das richtige Ergebnis zu erhalten, haben Sie sie richtig eingestellt. Apropos,

Für dieses Verfahren habe ich auf das auf der folgenden Seite sorgfältig geschriebene verwiesen. Abhängig von der OpenCV-Version sind möglicherweise einige Änderungen erforderlich.

Recommended Posts

Verwenden Sie OpenCV mit Java
Verwenden Sie PreparedStatement in Java
[Java] Verwenden Sie nicht "+" im Anhang!
Verwenden Sie zusammengesetzte Schlüssel in Java Maps.
Wie verwende ich Klassen in Java?
Java + OpenCV 3.X mit IntelliJ IDEA
Verwenden Sie Stream in Java?
Partisierung in Java
Janken in Java
[Java] Verwenden Sie Collectors.collectingAndThen
Umfangsrate in Java
FizzBuzz in Java
Mehrsprachige Unterstützung für Java Verwendung des Gebietsschemas
Verwenden Sie OpenCV_Contrib (ArUco) mit Java! (Teil 2-Programmierung)
[Java] Verwenden Sie kryptografische Technologie mit Standardbibliotheken
Verwenden Sie "Rhino", das JavaScript in Java ausführt
Ich habe die OpenCV-Kamerakalibrierung in Java durchgeführt
Lesen Sie JSON in Java
Interpreter-Implementierung durch Java
Machen Sie einen Blackjack mit Java
Janken App in Java
Einschränkungsprogrammierung in Java
Setzen Sie Java8 in Centos7
Erkennen Sie ähnliche Videos in Java und OpenCV Version 2
NVL-artiger Typ in Java
Verbinden Sie Arrays in Java
"Hallo Welt" in Java
Aufrufbare Schnittstelle in Java
Verwenden Sie java.time mit Jackson
Azure funktioniert in Java
Einfache HTML-Spezialchars in Java
Boyer-Moore-Implementierung in Java
Verwenden Sie Interceptor im Frühjahr
Hallo Welt in Java
WebApi-Memorandum mit Java
Erkennen Sie ähnliche Videos in Java und OpenCV Version 3
Typbestimmung in Java
Befehle in Java ausführen (Ping)
Verschiedene Threads in Java
Implementierung der Heap-Sortierung (in Java)
Zabbix API in Java
ASCII-Kunst in Java
Listen in Java vergleichen
POST JSON in Java
Verwenden Sie MouseListener für die Verarbeitung
Verwenden Sie Bilder mit Schienen
Fehler in Java ausdrücken
Verwenden Sie PostgreSQL in Scala
Erstellen Sie JSON in Java
[JAVA] [Spring] [MyBatis] Verwenden Sie IN () mit SQL Builder
Datumsmanipulation in Java 8
Was ist neu in Java 8?
Erkennen Sie ähnliche Videos in Java und OpenCV Version 1
Was ist neu in Java 9,10,11
Parallele Ausführung in Java
Ich möchte ES2015 auch in Java verwenden! → (´ ・ ω ・ `)
[JAVA] [Spring] [MyBatis] Verwenden Sie GROUP BY in SQL Builder