Cet article est le deuxième jour de l'équipe Web Calendrier de l'Avent 2017. Hier était "Implémenter CRUD avec PlayFramework 2.6.7, play-slick 3.0.2 (Slick 3.2)" de @ kouares.
@Hahegawa sera en charge de la deuxième journée. Je vous remercie.
«Dans mon travail, j'ai eu l'opportunité de vouloir détecter un objet à partir d'une image, j'ai donc essayé OpenCV. --En ce qui concerne OpenCV, il existe de nombreux exemples d'implémentation et explications en Python et C ++ dans les rues, mais compte tenu de la maintenance pour un usage professionnel, j'ai pensé que ce serait bien si cela pouvait être fait en Java, alors je l'ai essayé en Java.
―― J'ai essayé la "détection de fonction" et la "correspondance de fonction".
C'est un peu vieux, mais je l'ai essayé dans l'environnement suivant. ・ Windows 10 ・ Oxygène Eclipse ・ OpenCV3.1 ・ Apache Tomcat 7.0
Télécharger la bibliothèque OpenCV À partir de la page suivante, téléchargez et décompressez la bibliothèque Ver que vous souhaitez utiliser dans un emplacement approprié https://opencv.org/releases.html
4. Faites un clic droit sur le projet Eclipse → Définir le chemin de construction dans Propriétés
6. Ajouter une configuration d'exécution Lors de l'exécution d'OpenCV en supposant une application Web, définissez 5 sur le chemin de classe de la configuration d'exécution. Ajouter la même bibliothèque utilisateur
(2)~(5)Code source
//Conversion de tapis de l'image envoyée depuis l'écran
Mat src = new Mat(bufImg.getHeight(), bufImg.getWidth(), CvType.CV_8UC3);
byte[] bufImgBinary = ((DataBufferByte)bufImg.getRaster().getDataBuffer()).getData();
src.put(0, 0, bufImgBinary);
//Conversion de tapis de l'image modèle utilisée pour la détection des caractéristiques
Mat tempSrc = new Mat(tmpImg.getHeight(), tmpImg.getWidth(), CvType.CV_8UC3);
byte[] tempImgBinary = ((DataBufferByte)tmpImg.getRaster().getDataBuffer()).getData();
tempSrc.put(0, 0, tempImgBinary);
//Conversion de l'échelle de gris pour la détection des caractéristiques
Mat srcGray = new Mat(bufImg.getHeight(), bufImg.getWidth(), CvType.CV_8UC1);
Imgproc.cvtColor(src, srcGray, Imgproc.COLOR_BGR2GRAY);
Core.normalize(srcGray, srcGray, 0, 255, Core.NORM_MINMAX);
Mat tempSrcGray = new Mat(tmpImg.getHeight(), tmpImg.getWidth(), CvType.CV_8UC1);
Imgproc.cvtColor(tempSrc, tempSrcGray, Imgproc.COLOR_BGR2GRAY);
Core.normalize(tempSrcGray, tempSrcGray, 0, 255, Core.NORM_MINMAX);
MatOfKeyPoint keyPointSrc = new MatOfKeyPoint();
MatOfKeyPoint keyPointTemp = new MatOfKeyPoint();
Mat descriptersSrc = new Mat(src.rows(), src.cols(), src.type());
Mat descriptersBase = new Mat(tempSrc.rows(), tempSrc.cols(), tempSrc.type());
//Détecteur de caractéristiques génération 1
FeatureDetector akazeDetector = FeatureDetector.create(FeatureDetector.AKAZE);
DescriptorExtractor akazeExtractor = DescriptorExtractor.create(DescriptorExtractor.AKAZE);
akazeDetector.detect(srcGray, keyPointSrc);
akazeDetector.detect(tempSrcGray, keyPointTemp);
akazeExtractor.compute(srcGray, keyPointSrc, descriptersSrc);
akazeExtractor.compute(tempSrcGray, keyPointTemp, descriptersBase);
//Détecteur de caractéristiques génération 2
DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE);
MatOfDMatch matche = new MatOfDMatch();
List<MatOfDMatch> matches = new ArrayList<MatOfDMatch>();
List<DMatch> dmatch = new ArrayList<DMatch>();
//Caractéristiques Vérification croisée disponible
if(CROSS_CHECK_FLG){
MatOfDMatch srcToBase = new MatOfDMatch();
MatOfDMatch baseToSrc = new MatOfDMatch();
matcher.match(descriptersSrc, descriptersBase, srcToBase);
matcher.match(descriptersBase, descriptersSrc, baseToSrc);
List<DMatch> ldm_srcToBase = srcToBase.toList();
List<DMatch> ldm_baseToSrc = baseToSrc.toList();
for(int i=0; i<ldm_srcToBase.size(); i++) {
DMatch forward = ldm_srcToBase.get(i);
DMatch backward = ldm_baseToSrc.get(forward.trainIdx);
if(backward.trainIdx == forward.queryIdx){
dmatch.add(forward);
}
}
matche.fromList(dmatch);
}
//Aucune vérification croisée
else{
System.out.println("Caractéristiques Exécution de contrôle normal");
matcher.match(descriptersSrc, descriptersBase, matche);
}
Mat matchResult = new Mat(src.rows()*2, src.cols()*2, src.type());
Features2d.drawMatches(src, keyPointSrc, tempSrc, keyPointTemp, matche, matchResult);
//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ Sortie d'image de vérification ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
BufferedImage image = ImageConverter.convertMToBI(matchResult);
File ouptut = new File("C:\\testlog\\sample_20171202.jpg ");
ImageIO.write(image, "jpg", ouptut);
Chargement de la bibliothèque OpenCV
static{
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
Bien qu'une mauvaise reconnaissance ait été constatée, les caractéristiques ont pu être détectées.
――Il m'a fallu beaucoup de temps pour écrire le code car il était lent, mais si vous êtes rapide à trouver ou à écrire le code, vous pouvez facilement traiter l'image si vous comprenez les bases et les explications des différentes méthodes décrites dans cet article. J'ai senti que je pouvais le faire. ――Lors de la planification de votre entreprise, ce que vous voulez vraiment utiliser est "ce qu'il faut faire avant la détection des fonctionnalités", alors lisez cet article et concentrez-vous sur le traitement que vous voulez vraiment mettre en œuvre sans effort supplémentaire. J'apprécierais si vous le pouviez.
Demain, c'est @wc_moriyama. Je vous remercie.
Recommended Posts