Aperçu panoramique
La projection d'image se produit chaque fois qu'une image plane est cartographiée sur une surface incurvée, et vice versa, ce qui est particulièrement courant dans la photographie panoramique. Par exemple, la sphère de la terre peut être cartographiée sur un morceau de papier plat. Étant donné que l'ensemble du champ de vision autour de nous peut être considéré comme la surface de la sphère (pour tous les angles d'observation), nous avons besoin d'une méthode qui peut projeter la sphère dans le plan 2D pour l'impression photo.
Les petites perspectives sont relativement faciles à déformer et à projeter sur du papier plat. Cependant, une certaine déformation est inévitable lorsque vous essayez de cartographier une image sphérique à un plan. Par conséquent, chaque type de projection tente d'éviter un type de distorsion au détriment d'autres types de distorsions. À mesure que le champ de vision augmente, l'arc de visualisation devient plus incurvé, de sorte que les différences entre les types de projections panoramiques deviennent plus significatives. Quand utiliser quelle projection dépend en grande partie de chaque application de projection. Ici, nous nous concentrons sur plusieurs des plus couramment utilisés.
Préface
En raison des besoins du projet, j'ai fait ma propre démo et j'ai beaucoup appris. Alors je l'ai partagé. J'espère que ceux qui ont ce besoin éviteront les détours. Il existe de nombreux tutoriels en ligne sur la façon d'installer OpenCV. Je n'expliquerai pas en détail ici. J'ai installé OpenCV-3.3.0
Comme indiqué dans la figure ci-dessus, trouvez le package JAR correspondant. Ici, nous parlerons de la façon d'importer ce pot dans le référentiel Maven
Mvn Install: install-file -dfile = d: /opencv-3.0.0/opencv/build/java/opencv-300.jar -dgroupid = com.suibian -dartifactid = opencv-300 -dversion = 3.3.0 -dpackaging = jar -degereatepom = true -dversion
<GroupId> com.suibian </rom grouped> <ArtefactId> OpenCV-300 </letefactId> <DERNÉRATION> 3.3.0 </ Version>
OK, donc Java peut faire fonctionner OpenCV via ce pot. Jetons un coup d'œil. Bien sûr, vous pouvez penser comme ça, ce qui signifie que vous êtes très simple. Jetons un coup d'œil à la comparaison entre le chemin dans Inclure dans OpenCV et le package en pot
Haha, il n'y a pas de couture clé pour les cartes panoramiques, et Java-oriented 2015 n'a pas été mise à jour depuis. Il n'y a pas de classe clé pour synthétiser les cartes panoramiques (imbéciles) comme indiqué dans la figure suivante, mais C ++ me fournit
Alors que faire? Comment utiliser Java pour appeler le code C ++. Nous savons que lorsque vous traitez avec le système d'exploitation, C / C ++ est sans aucun doute plus approprié que Java. La plupart des applications du traitement graphique OpenCV sont développées en C ++. Tout le monde connaît le mot clé natif, mais nous voulons cliquer et voir comment il est implémenté, mais nous ne pouvons pas cliquer car il n'est pas écrit en Java. Il peut s'agir de C / C ++. Native correspond aux fichiers xxx.dll dans le répertoire bin sous JRE en Java. Nous pouvons donc emballer le code C ++ que nous souhaitons utiliser dans un fichier de format DLL et le mettre dans le répertoire bac. Bien sûr, cela implique les paramètres et les valeurs de retour de la méthode. Sans dire beaucoup, installez Visual Studio 2017, installez des tutoriels et de nombreux tutoriels en ligne
Cliquez sur Fichier -> Nouveau -> Projet ---> Windows Desktop -> Dynamic Link Library (DLL), afin que le projet soit créé avec succès. Ensuite, ajoutez le code
Ceci est le code C ++ pour la synthèse de l'image panoramique
#include "stdafx.h" #include <ioStream> #include <opencv2 / core / core.hpp> #include <opencv2 / highgui / highgui.hpp> #include <openccv2 / imgproc / imgproc.hpp> #include <openccv2 / opencv.hpp> #include <opencvv2 / opencv.hpp> usingpace sDdpace ;include <opencvv2 / opencv.hpp> usingpacepace std; espace de noms cv; bool try_use_gpu = false; vector <at> imgs; string result_name = "d: /result1.jpg"; int _tmain (int argc, char * argv []) {mat img1 = imread ("d: /quanjingtu/hh/1.jpg"); Mat img2 = imread ("d: /quanjingtu/hh/2.jpg"); Mat img3 = imread ("d: /quanjingtu/hh/3.jpg"); Mat img4 = imread ("d: /quanjingtu/hh/4.jpg"); Mat img5 = imread ("d: /quanjingtu/hh/5.jpg"); Mat img6 = imread ("d: /quanjingtu/hh/6.jpg"); Mat img7 = imread ("d: /quanjingtu/hh/7.jpg"); Mat img8 = imread ("d: /quanjingtu/hh/8.jpg"); Mat img9 = imread ("d: /quanjingtu/hh/9.jpg"); Mat img10 = imread ("d: /quanjingtu/hh/10.jpg"); // mat img6 = imread ("6.jpg"); if (img1.empty () || img2.empty ()) {cout << "Impossible de lire l'image" << endl; retour -1; } imgs.push_back (img1); imgs.push_back (img2); imgs.push_back (img3); imgs.push_back (img4); imgs.push_back (img5); imgs.push_back (img6); imgs.push_back (img7); imgs.push_back (img8); imgs.push_back (img9); imgs.push_back (img10); //imgs.push_back(img6); STTITHER STTTICHER = STTICHER :: CREATEDEFAULT (try_use_gpu); // Utilisez la fonction de point pour l'épissage du tapis Pano; STTITHER :: Status Status = STTITHER.STICT (IMGS, PANO); imwrite (result_name, pano); Mat pano2 = pano.clone (); // Affichez l'image source et l'image du résultat // imshow ("image panomique", pano); if (waitKey () == 27) return 0; // imwrite (result_name, pano);}Alors, comment Java interagit-il avec C ++? Grâce à la technologie JNI à Java
Comprenons Jni dans Java
Interface native Java (JNI pour faire court), Java est un langage multiplateforme, et parfois le code local doit être appelé. Sun fournit une interface JNI, qui s'appelle avec le code local du système d'exploitation. La figure suivante montre le principe d'appel de Native en Java
Les méridiens sont tous clairs, alors commençons
classe publique OpenCvVutil {static {// Le système.load ici est utilisé pour charger la bibliothèque de liens dynamiques générée par C ++. En fait, vous pouvez décider que ce n'est pas nécessairement statique. System.LoadLibrary ("OpenCVVutil"); } public static String ChangleArRValue (String Str); public static void main (String [] args) lève unportdencodingException {String base = "d: / quanjingtu / gg" + "/"; int le long = 5; String url = ""; pour (int i = 1; i <= longueur; i ++) {if (i == 1) {url = url + base + i + ". jpg"; } else {url = url + "," + base + i + ". jpg"; }} //System.out.println(url); String temp = new String (ChangEArrValue (url) .getBytes (), "gbk"); System.out.println (temp); ; }}Définissez la méthode native et compilez le fichier java dans le fichier .class
Entrez la fenêtre de commande CMD, ouvrez le répertoire de fichiers de classe compilé correspondant et exécutez la commande javah
Générer le fichier COM_LIANXI_SECURYTEST_OPCVV_OPCVUTIL.h
#include <jni.h> / * En-tête pour la classe com_lianxi_securitytest_opencv_openvutil * / # ifndef _included_com_lianxi_securitytest_opecv_opecvutil # define _included_com_lianxi_securitytest_opecv_openvvutil # ifdef __c "C" {# endif / * * class: com_lianxi_securitytest_opeccv_opecvvutil * Méthode: changarrvalue * signature: (ljava / lang / string;) ljava / lang / string; NotreSeule la méthode native est traitée, copiez le fichier à l'emplacement du projet VS 2017
#include "stdafx.h" #include "com_lianxi_securitytest_opencv_opecvvutil.h" #include <iostream> #include <opencv2 / core / core.hpp> #include <opencv2 / highgui / highgui.hpp> #include <opencv2 / imgproc / imgpric.hpp> #include <opencv2 / iMGProc / IMGPROC. <openccv2 / openccv.hpp> #include <vector> #include <string> Utilisation de namespace std; Utilisation de l'espace de nom Java_com_lianxi_securitytest_opencv_opecvvutil_changearrvalue (jnienv * Env, jclass obj, jstring invite) {// c'est la chaîne reçue, plusieurs chemins const char * str; ///14); STTITHER STTTICHER = STTICHER :: CREATEDEFAULT (try_use_gpu); // Utilisez la fonction de point pour épisser Pano MAT; STTITHER :: Status Status = STTITHER.STICT (IMGS, PANO); imwrite (result_name, pano); Mat pano2 = pano.clone (); // Affichez l'image source et l'image du résultat // imshow ("Panogue Image", Pano); if (waitKey () == 27) if (status! = stitcher :: ok) {return env-> NewstringUtf ("Image Failure !!!"); } // return env-> NewstringUtf (result_name.c_str); String newstr = "Picture Success !!! url =" + result_name; return Env-> NewstringUtf (const_cast <char *> (newrtr.c_str ()));}Ce qui précède est le code C ++ correspondant
Cliquez sur Générer ---> Régénérer la solution pour générer le fichier DLL correspondant, puis le mettre dans le répertoire JDK JRE / bin
Exécutez le programme Java, le résultat est le suivant
Jetez un œil à la vue panoramique synthétique
Résumer
Ce qui précède est l'intégralité du contenu de cet article. J'espère que le contenu de cet article a une certaine valeur de référence pour l'étude ou le travail de chacun. Si vous avez des questions, vous pouvez laisser un message pour communiquer. Merci pour votre soutien à wulin.com.