Panoramakauf
Bildprojektion tritt immer dann auf, wenn ein Ebenenbild auf eine gekrümmte Oberfläche abgebildet wird, und umgekehrt, was bei Panoramic Photography besonders häufig ist. Zum Beispiel kann der Bereich der Erde auf ein flaches Stück Papier zugeordnet werden. Da das gesamte Sichtfeld um uns herum als die Oberfläche der Kugel betrachtet werden kann (für alle Beobachtungswinkel), benötigen wir eine Methode, die die Kugel zum Fotolruck in die 2-D-Ebene projizieren kann.
Kleine Perspektiven sind relativ einfach zu verformen und auf flaches Papier zu projizieren. Eine gewisse Verformung ist jedoch unvermeidlich, wenn Sie versuchen, ein kugelförmiges Bild einer Ebene abzubilden. Daher versucht jede Art von Projektion, eine Art von Verzerrung auf Kosten anderer Arten von Verzerrungen zu vermeiden. Mit zunehmendem Sichtfeld wird der Betrachtungsbogen besser gekrümmt, sodass die Unterschiede zwischen den Arten von Panoramaprojektionen signifikanter werden. Wann zu verwenden, welche Projektion weitgehend von jeder Projektionsanwendung abhängt. Hier konzentrieren wir uns auf einige der am häufigsten verwendeten.
Vorwort
Aufgrund der Projektbedürfnisse habe ich meine eigene Demo gemacht und viel daraus gelernt. Also habe ich es geteilt. Ich hoffe, dass diejenigen, die diesen Bedarf haben, Umwege vermeiden. Es gibt viele Online -Tutorials zur Installation von OpenCV. Ich werde hier nicht ausführlich erklären. Ich habe OpenCV-3.3.0 installiert
Wie in der obigen Abbildung gezeigt, finden Sie das entsprechende JAR -Paket. Hier sprechen wir darüber, wie dieses Glas in das Maven -Repository importiert werden kann
MVN Installation: Installation -Datei -dfile = d: /opencv-3.0.0/opencv/build/java/opencv-300.jar -dgroupid = com.suibian -dartifactid = opencv -300 -dversion = 3.3.0 -dpackaging = jar -DGeneratpom = True -Dreatckkkkkkkkkkkksumum = True, True, True -true -Dreatckkkkksumum = true, truecv -300 -Dreatum = true, true -dreatckkkksumum.
<gruppe> com.suibian </Groupid> <artifactId> opencv-300 </artifactId> <version> 3.3.0 </Version>
Ok, Java kann OpenCV über dieses Glas bedienen. Schauen wir uns an. Natürlich können Sie so denken, was bedeutet, dass Sie sehr einfach sind. Schauen wir uns den Vergleich zwischen dem Pfad in OpenCV und dem Paket in Jar an
Haha, es gibt keine wichtigen Nähte für Panorama-Karten, und seitdem wurde das Java-orientierte Jahr 2015 nicht aktualisiert. Es gibt keine Schlüsselklasse für die Synthese von Panorama -Karten (Narren), wie in der folgenden Abbildung gezeigt, aber C ++ bietet mir mit
Also was tun? So verwenden Sie Java, um C ++ - Code aufzurufen. Wir wissen, dass C/C ++ beim Umgang mit dem Betriebssystem zweifellos besser geeignet ist als Java. Die meisten Anwendungen der OpenCV -Grafikverarbeitung werden in C ++ entwickelt. Jeder ist mit dem nativen Schlüsselwort vertraut, aber wir möchten klicken und sehen, wie es implementiert wird, aber wir können nicht einklicken, da es nicht in Java geschrieben ist. Es kann C/C ++ sein. Native entspricht xxx.dll -Dateien im Bin -Verzeichnis unter JRE in Java. So können wir den C ++ - Code, den wir verwenden möchten, in eine DLL -Formatdatei verpacken und in das Bin -Verzeichnis einfügen. Dies beinhaltet natürlich die Parameter und Rückgabewerte der Methode. Installieren Sie ohne viel zu sagen, Visual Studio 2017, installieren Sie Tutorials und viele Online -Tutorials
Klicken Sie auf Datei-> Neu-> Projekt ---> Windows Desktop-> Dynamic Link Library (DLL), damit das Projekt erfolgreich erstellt wird. Fügen Sie als nächstes den Code hinzu
Dies ist der C ++ - Code für die Panorama -Bildsynthese
#include "stdafx.h" #include <IoStream> #include <opencv2/core.hpp> #include <opencv2/HighGui/HighGui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/opencpp> #include #include/opencv2/opencv. Namespace std; Verwendung von Namespace cv; bool try_use_gpu = false; vector <mat> imgs; String result_name = "d: /result1.jpg"; int _tmain (int argc, char * argv []) {mat img1 = imread ("d: /quanjingu/hhhh/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 << "Im Bild kann nicht lesen" << endl; Return -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); Stitcher stitcher = stitcher :: createfault (try_use_gpu); // Verwenden Sie die Stichfunktion zum Spleißen von MAT Pano. Stitcher :: Status Status = Stitcher.stitch (IMGS, Pano); imwrite (result_name, pano); Mat pano2 = pano.clone (); // Zeigen Sie das Quellbild und das Ergebnisbild an // IMshow ("Panomic Image", Pano); if (WaitKey () == 27) return 0; // imwrite (result_name, pano);}Wie interagiert Java mit C ++? Durch JNI -Technologie in Java
Lassen Sie uns JNI in Java verstehen
Java Native Interface (kurz JNI), Java ist eine plattformübergreifende Sprache, und manchmal muss lokaler Code aufgerufen werden. Sun bietet eine JNI -Schnittstelle, die sich mit dem lokalen Code des Betriebssystems aufruft. Die folgende Abbildung zeigt das Anrufprinzip der Einheimischen in Java
Die Meridianer sind alle klar, also fangen wir an
öffentliche Klasse OpenCVUTIL {static {// Das System.load hier wird verwendet, um die von C ++ generierte dynamische Linkbibliothek zu laden. Tatsächlich können Sie entscheiden, dass es nicht unbedingt statisch ist. System.loadlibrary ("opencvutil"); } public statische native String -String -Veränderung (String Str); public static void main (String [] args) löst nicht supportedenCodingException aus {String base = "d:/quanjingtu/gg"+"/"; int länge = 5; String url = ""; für (int i = 1; i <= Länge; i ++) {if (i == 1) {url = url+base+i+". JPG"; } else {url = url+","+base+i+". jpg"; }} //System.out.println(url); String temp = new String (echzenearRValue (url) .getBytes (), "gbk"); System.out.println (temp); ; }}Definieren Sie die native Methode und kompilieren Sie die Java -Datei in .Class -Datei
Geben Sie das CMD -Befehlsfenster ein, öffnen Sie das entsprechende kompilierte Klassendateiverzeichnis und führen Sie den Befehl javah aus
Generieren Sie die entsprechende com_lianxi_securityest_opencv_opencvutil.h -Datei
#include <jni.h>/ * Header für die Klasse com_lianxi_securityest_opencv_opencvutil */#ifndef _included_com_lianxi_securityest_opencv_opencvutil #included_lianxi_lianxi_Securitytest_opencvutil #ddscuritytest_opencvutil #ddscurtest_opencvutil #ddscuritytest_opencvutil #ddscurtest_opencvutil #ddscurtest_opencvutil #ddscurtest_opencvutil #ddscurtest_opencvutil #ddscuritytest_opencvutil #ddscurtest_opencvutil #dds __cplusplusextern "c" {#endif/ * * class: com_lianxi_securityest_opencv_opencvutil * methode: echzenearRValue * Signatur: (ljava/lang/string;) ljava/lang/string; */Jniexport jstring jnicall java_com_lianxi_securitytest_opencv_opencvutil_changearrvalue (Jnienv *, jclass, jstring);#ifdef __cplusplus}#endif#endif#endif#endifNur die native Methode wird verarbeitet. Kopieren Sie die Datei in den Speicherort des VS 2017 -Projekts
#include "stdafx.h"#include "com_lianxi_securitytest_opencv_OpenCVUtil.h"#include<iostream>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/opencv.hpp> #include <Vector> #include <string> Verwenden von Namespace std; Verwendung von Namespace cv; bool try_use_gpu = false; vector <Mat> imgs; String result_name = "d: /result.jpg"; Java_com_lianxi_securitytest_opencv_opencvutil_changearrvalue (jnienv * env, jclass obj, jstring prompt) {// Dies ist die empfangene Zeichenfolge, mehrere Pfade const char * st. Stitcher stitcher = stitcher :: createfault (try_use_gpu); // Verwenden Sie die Stichfunktion, um mat pano zu spleißen. Stitcher :: Status Status = Stitcher.stitch (IMGS, Pano); imwrite (result_name, pano); Mat pano2 = pano.clone (); // Zeigen Sie das Quellbild und das Ergebnisbild an // IMshow ("Panogue Image", Pano); if (WaitKey () == 27) if (Status! = Stitcher :: OK) {return env-> newStringUtf ("Bildfehler !!!"); } // return env-> newStingUtf (result_name.c_str); String Newsstr = "Bilderfolg !!! url =" + result_name; return env-> newStingUtf (const_cast <char *> (newstr.c_str ()));};Das obige ist der entsprechende C ++ - Code
Klicken
Führen Sie das Java -Programm aus, das Ergebnis ist wie folgt
Schauen Sie sich die synthetische Panoramabelle an
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Referenzwert für das Studium oder die Arbeit eines jeden hat. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen. Vielen Dank für Ihre Unterstützung bei Wulin.com.