Utiliser OpenCV avec Java

introduction

Je voulais utiliser la bibliothèque OpenCV en Java, mais c'était étonnamment difficile, donc je vais écrire la procédure. En tant que moyen d'organiser les connaissances périphériques, cela a également conduit à une compréhension de choses de base telles que la façon d'utiliser les bibliothèques et les packages Java, je vais donc en parler également. Les deux (1) lors de la compilation dans le terminal et (2) lors de la compilation à l'aide de l'EDI (en particulier IntelliJ) sont décrits.

environnement

Installation de Java

Au cas où, je quitterai la méthode d'installation Java (macOS). Je l'ai installé en utilisant Homebrew.

# 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 #Vous pouvez installer en spécifiant la version si vous utilisez java13 etc.

Cela installera Java dans / Library /. La structure hiérarchique devrait être la suivante.

/Library/Java
          |-- Extensions/ #Dossier d'extension Java
          `-- JavaVirtualMachine/
               `-- openjdk-13.0.2.jdk/ #JDK installé
                    `-- Contents/
                         |-- Home/ #Répertoire de base JDK
                         |    |--
                         |     ...
                         |-- MacOS/
                         `-- Info.plist

Au fait, comme d'habitude

java --version

Ensuite, vous pouvez vérifier la version.

OpenCV Vous pouvez installer OpenCV Java sur macOS en suivant le premier site ci-dessous. À partir de juin 2020, la dernière version de Java est la version 4.3.0, donc si vous l'installez sans spécifier la version, elle sera installée. L'installation elle-même prend un temps inattendu.

Espérons que la bibliothèque sera installée dans / usr / local / Cellar / opencv / 4.3.0_4 / share / java / avec la structure hiérarchique suivante. Cela devrait varier en fonction de la machine et de la version du logiciel.

/java/
  `-- opencv4/
       |-- opencv-430.jar #Bibliothèque statique
       `-- libopencv_java430.dylib* #Bibliothèque dynamique
            |--
             ...

Au fait, le fichier .jar est une bibliothèque statique, le fichier .dylib est une bibliothèque dynamique (abréviation de bibliothèque dynamique) et la bibliothèque dynamique est une bibliothèque qui est référencée à l'exécution, pas à la compilation [^ 1]. Au fait, le fichier jar est un fichier compressé qui rassemble les fichiers de classe créés par compilation en un seul [^ 2].

Compiler et exécuter

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

Créez un fichier comme celui-ci et compilez-le. Dans le répertoire où se trouve le fichier, tout comme la compilation d'un fichier .java normalement

javac Test.java

Lorsque je le compile en tant que, j'obtiens beaucoup d'erreurs comme ci-dessous. Screen Shot 2020-06-08 at 20.16.11.png Cela signifie que la bibliothèque OpenCV est introuvable car elle indique que "le package org.opencv.core n'existe pas". En d'autres termes, bien qu'OpenCV ait été installé, javac n'a pas pu trouver la bibliothèque lors de la compilation. Pour résoudre cela, il est nécessaire de le donner via ** chemin de classe ** comme suit. En ajoutant l'option -classpath ou -cp au moment de la compilation, javac y cherchera.

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

Vous devez également spécifier le chemin de la bibliothèque dynamique au moment de l'exécution.

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

Au fait, vous devez mettre deux points : après le chemin de classe au moment de l'exécution (macOS). Dans le cas de Windows, il s'agit d'un point-virgule «;». Si fait correctement

Résultat d'exécution


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]

Est affiché.

Plus correctement

Utilisez ʻimport ou package` pour créer une classe en Java dans un fichier séparé et utiliser cette classe dans un autre fichier Java. L'exemple ci-dessus est un fichier unique, mais lors de la construction d'un programme, les fichiers dépendent souvent les uns des autres de cette manière. En plus de cela, nous voulons cette fois faire référence à OpenCV, c'est-à-dire à une bibliothèque externe. Dans un tel cas, comme avant

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

Lorsque j'ai essayé de compiler en tant que, j'ai eu une erreur avec le package et l'importation cette fois.

Cela signifie qu'en spécifiant le chemin de la classe, javac n'a pas pu le trouver car il a recherché des packages et des importations à partir de ce chemin. Java exprime la structure hiérarchique des packages et des importations par des points . au lieu de barres obliques /, mais il est écrit par le chemin relatif depuis le répertoire courant où la compilation est exécutée en premier lieu ([Site de référence]([Site de référence] https://www.sejuku.net/blog/63008)). En d'autres termes, ** le chemin de classe était le répertoire courant par défaut **, mais comme il a été écrasé par l'option -classpath, il ne peut plus être trouvé.

Une solution possible est de changer le package ou le chemin d'importation en (1) un chemin absolu ou (2) un chemin relatif à partir de l'option -classpath spécifiée au moment de la compilation. Cependant, le chemin absolu est long et vous devez le réécrire chaque fois que vous déplacez le programme vers un autre PC. En outre, il est absurde de modifier le contenu du fichier en tenant compte des options de compilation, et comme l'emplacement de la bibliothèque externe diffère selon chaque PC, il doit être réécrit à chaque fois. Après tout, il s'agit généralement d'un chemin relatif depuis le fichier principal.

Par conséquent, au lieu de réécrire le chemin de classe, je voudrais le spécifier pour qu'il soit ajouté (y compris le chemin de la bibliothèque OpenCV), mais si vous le connectez avec un deux-points :, vous pouvez spécifier plusieurs chemins de classe, alors utilisez ceci. .. Cela signifie le spécifier comme -class path .: (chemin OpenCV) y compris . du répertoire courant. En faisant cela, tout en préservant les dépendances d'origine du package, etc., un nouveau chemin de classe pour la bibliothèque OpenCV est également ajouté.

javac -classpath .:/usr/local/Cellar/opencv/4.3.0_4/share/java/opencv4/opencv-430.jar Test.java #compiler
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 #Courir

Vous pouvez maintenant compiler et exécuter correctement. (Site de référence) Java Programming: Package and Classpath

Autrement

Cette méthode est une méthode pour spécifier temporairement le chemin de la classe au moment de la compilation ou de l'exécution, mais comme / Library / Extensions / est un dossier d'extension Java, il est dit que le chemin sera passé en insérant le fichier jar et le fichier dylib ici. Il semble y avoir une méthode. Dans ce cas, il n'est pas nécessaire de spécifier l'option -classpath à chaque fois.

Méthode de réglage dans IntelliJ

[** IntelliJ **](https://www.jetbrains.com/idea/promo/ultimate/?gclid=Cj0KCQjwoPL2BRDxARIsAEMm9y-AFlyJ1PpLvFySDiJJ-ABoUi0xzY9fdK4FnQLvO4dX-6 Environnement). Auparavant, j'utilisais OpenCV lors du développement avec un éditeur et un terminal, mais j'écrirai également la méthode de paramétrage lors de l'utilisation d'IntelliJ. À propos, le tutoriel d'IntelliJ lui-même est ci-dessous.

configuration de base

Au cas où, je quitterai la procédure de configuration de base de l'installation d'IntelliJ.

Installation

Sélectionnez le système d'exploitation sur la page d'installation et téléchargez l'édition communautaire (les étudiants peuvent également télécharger une licence).

Brancher

(Si nécessaire) * Bienvenue dans IntelliJ IDEA * Dans la fenêtre, * Configurer-> Plugins * pour insérer le plugin ("Java Visualizer" etc. est pratique). Si vous installez le plug-in, vous devez redémarrer IntelliJ.

Paramètres du SDK

SDK (Software Development Kit) est un outil de développement logiciel nécessaire au développement logiciel. Le SDK pour Java s'appelle JDK (Java Development Kit), qui est déjà installé dans le système d'exploitation, il est donc utile lors du développement sur le terminal, mais IntelliJ doit également le savoir, c'est-à-dire le transmettre par le chemin. il y a. Screen Shot 2020-06-08 at 12.16.39.png

Définissez le SDK (Kit de développement logiciel) à partir de "* Configurer-> Structure pour les nouveaux projets *". Vous pouvez le faire en suivant ce document.

Paramètres de la bibliothèque OpenCV

Vous pouvez développer un programme de base avec les paramètres ci-dessus, mais lorsque vous utilisez une bibliothèque externe comme celle-ci, vous devez le définir. IntelliJ est un IDE qui compile et s'exécute dans celui-ci, il est donc nécessaire de définir à l'avance quelque chose comme la spécification du chemin de classe lors de la compilation et de l'exécution dans le terminal. Prenant cet OpenCV comme exemple, le flux sera expliqué.

Sélectionnez "* Fichier-> Structure du projet " pour ouvrir la fenêtre et sélectionnez " Modules " dans l'onglet de gauche. Sélectionnez ensuite le champ " Dépendances ", sélectionnez " JARs ou répertoires *" à partir du bouton d'ajout (bouton + en bas à gauche), et ajoutez le fichier .jar dans l'OpenCV installé. Dans mon cas, c'était à l'emplacement / usr / local / Cellar / opencv / 4.3.0_4 / share / java / opencv4 / opencv-430.jar. Sélectionnez ce fichier et il sera ajouté comme ceci Screen Shot 2020-06-08 at 13.09.35.png

Ensuite, double-cliquez sur le champ du fichier jar ajouté pour ouvrir la fenêtre "* Configurer la bibliothèque de modules ". Depuis le bouton Ajouter en bas à gauche, cette fois, il se trouve dans le même répertoire que le fichier jar. /usr/local/Cellar/opencv/4.3.0_4/share/java/opencv4/libopencv_java430.dylib Sélectionnez le fichier. Ensuite, une colonne appelée « Native Library Locations *» sera ajoutée comme indiqué dans l'image, et c'est la fin. Screen Shot 2020-06-08 at 12.57.18.png

Si vous essayez d'exécuter le même fichier de test que ci-dessus et d'obtenir le résultat correct, vous l'avez défini correctement. Au fait,

Pour cette procédure, je me suis référé à celle soigneusement écrite sur le site suivant. Certaines modifications peuvent être nécessaires selon la version d'OpenCV.

Recommended Posts

Utiliser OpenCV avec Java
Utiliser PreparedStatement en Java
[Java] N'utilisez pas "+" dans append!
Utilisez des clés composites dans Java Maps.
Comment utiliser les classes en Java?
Java + OpenCV 3.X avec IntelliJ IDEA
Utilisez-vous Stream en Java?
Partition en Java
Janken à Java
[Java] Utilisez Collectors.collectingAndThen
Taux circonférentiel à Java
FizzBuzz en Java
Prise en charge multilingue de Java Comment utiliser les paramètres régionaux
Utilisez OpenCV_Contrib (ArUco) avec Java! (Partie 2-Programmation)
[Java] Utiliser la technologie cryptographique avec les bibliothèques standard
Utilisez "Rhino" qui exécute JavaScript en Java
J'ai fait l'étalonnage de la caméra OpenCV en Java
Lire JSON en Java
Implémentation de l'interpréteur par Java
Faites un blackjack avec Java
Application Janken en Java
Programmation par contraintes en Java
Mettez java8 dans centos7
Détecter des vidéos similaires dans Java et OpenCV rev.2
NVL-ish guy en Java
Joindre des tableaux en Java
"Hello World" en Java
Interface appelable en Java
Utilisez java.time avec Jackson
Fonctions Azure en Java
Simple htmlspecialchars en Java
Implémentation Boyer-Moore en Java
Utilisez Interceptor au printemps
Hello World en Java
Mémorandum WebApi avec Java
Détecter des vidéos similaires dans Java et OpenCV rev.3
Détermination de type en Java
Exécuter des commandes en Java (ping)
Divers threads en java
Implémentation du tri de tas (en java)
API Zabbix en Java
Art ASCII à Java
Comparer des listes en Java
POST JSON en Java
Utiliser MouseListener avec le traitement
Utiliser des images avec des rails
Exprimer l'échec en Java
Utiliser PostgreSQL dans Scala
Créer JSON en Java
[JAVA] [Spring] [MyBatis] Utiliser IN () avec SQL Builder
Manipulation de la date dans Java 8
Nouveautés de Java 8
Détecter des vidéos similaires dans Java et OpenCV rev.1
Nouveautés de Java 9,10,11
Exécution parallèle en Java
Je veux aussi utiliser ES2015 avec Java! → (´ ・ ω ・ `)
[JAVA] [Spring] [MyBatis] Utiliser GROUP BY dans SQL Builder