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.
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.
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. 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.
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
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.
[** 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.
Nur für den Fall, ich werde das grundlegende Einstellungsverfahren von der Installation von IntelliJ verlassen.
Wählen Sie das Betriebssystem auf der Installationsseite aus und laden Sie die Community Edition herunter (Schüler können auch lizenzierte Dateien herunterladen).
(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 (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.
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).
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
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.
Wenn Sie versuchen, dieselbe Testdatei wie oben auszuführen und das richtige Ergebnis zu erhalten, haben Sie sie richtig eingestellt. Apropos,
static{ System.loadLibrary(Core.NATIVE_LIBRARY_NAME); }
Wenn Sie eine Fehlermeldung erhalten, bedeutet dies, dass "* Native Library Locations *" nicht richtig eingestellt wurde. Dies bedeutet, dass die Einstellungen zum Zeitpunkt des zweiten Fotos nicht richtig eingestellt wurden.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