Tinjauan Panoramik
Proyeksi gambar terjadi setiap kali gambar bidang dipetakan ke permukaan melengkung, dan sebaliknya, yang sangat umum dalam fotografi panoramik. Misalnya, bola bumi dapat dipetakan ke selembar kertas yang datar. Karena seluruh bidang pandang di sekitar kita dapat dianggap sebagai permukaan bola (untuk semua sudut pengamatan), kita memerlukan metode yang dapat memproyeksikan bola ke bidang 2-D untuk pencetakan foto.
Perspektif kecil relatif mudah dideformasi dan diproyeksikan ke kertas datar. Namun, beberapa deformasi tidak bisa dihindari ketika mencoba memetakan gambar bola ke pesawat. Oleh karena itu, setiap jenis proyeksi berusaha untuk menghindari satu jenis distorsi dengan mengorbankan jenis distorsi lainnya. Ketika bidang pandang meningkat, busur tontonan menjadi lebih melengkung, sehingga perbedaan antara jenis -jenis proyeksi panorama menjadi lebih signifikan. Kapan menggunakan proyeksi mana yang sangat tergantung pada setiap aplikasi proyeksi. Di sini, kami fokus pada beberapa yang paling umum digunakan.
Kata pengantar
Karena kebutuhan proyek, saya membuat demo sendiri dan belajar banyak darinya. Jadi saya membagikannya. Saya berharap bahwa mereka yang memiliki kebutuhan ini akan menghindari jalan memutar. Ada banyak tutorial online tentang cara menginstal OpenCV. Saya tidak akan menjelaskan secara rinci di sini. Saya menginstal OpenCV-3.3.0
Seperti yang ditunjukkan pada gambar di atas, temukan paket JAR yang sesuai. Di sini kita akan berbicara tentang cara mengimpor toples ini ke repositori Maven
Instal MVN: install -file -dfile = d: /Opencv-3.0.0/opencv/build/java/opencv-300.jar -dgroupid = com.suibian -dartifactid = opencv -300
<GroupId> com.suibian </groupid> <ArTifactId> OPENCV-300 </artifactid> <version> 3.3.0 </version>
Oke, jadi Java dapat mengoperasikan opencv melalui toples ini. Mari kita lihat. Tentu saja, Anda dapat berpikir seperti ini, yang berarti Anda sangat sederhana. Mari kita lihat perbandingan antara jalur incledt in opencv dan paket dalam jar
Haha, tidak ada jahitan kunci untuk peta panorama, dan Java yang berorientasi pada 2015 belum diperbarui sejak itu. Tidak ada kelas kunci untuk mensintesis peta panoramik (orang bodoh) seperti yang ditunjukkan pada gambar berikut, tetapi C ++ memberi saya
Jadi apa yang harus dilakukan? Cara menggunakan Java untuk memanggil kode C ++. Kita tahu bahwa ketika berhadapan dengan sistem operasi, C/C ++ tidak diragukan lagi lebih cocok daripada Java. Sebagian besar aplikasi pemrosesan grafik OPECV dikembangkan dalam C ++. Semua orang akrab dengan kata kunci asli, tetapi kami ingin mengklik dan melihat bagaimana itu diimplementasikan, tetapi kami tidak dapat mengklik karena tidak ditulis dalam Java. Mungkin C/C ++. Asli sesuai dengan file xxx.dll di direktori bin di bawah JRE di Java. Jadi kami dapat mengemas kode C ++ yang ingin kami gunakan ke dalam file format DLL dan memasukkannya ke dalam direktori bin. Tentu saja, ini melibatkan parameter dan nilai pengembalian metode. Tanpa banyak bicara, instal Visual Studio 2017, instal tutorial dan banyak tutorial online
Klik File-> Baru-> Proyek ---> Windows Desktop-> Dynamic Link Library (DLL), sehingga proyek akan berhasil dibuat. Selanjutnya, tambahkan kode
Ini adalah kode C ++ untuk sintesis gambar panoramik
#include "stdafx.h"#include <iostream>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/opencv.hpp>#include <opencv2/opencv.hpp>using namespace std; menggunakan namespace cv; bool try_use_gpu = false; vektor <mat> imgs; string result_name = "d: /result1.jpg"; int _tmain (int argc, char * argv []) {matg1 = iMread ("d:/quanjingtu []) {matg1 = iMread (" D:/quanjingtu []) {matg1 = iMread ("D:/quanjingtu []) {matg1 = iMread (" D:/QUanjtU Matmg2 = 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 << "Tidak dapat membaca gambar" << endl; kembali -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 :: createDefault (try_use_gpu); // Gunakan fungsi jahitan untuk menyambungkan matras pano; Stitcher :: status status = stitcher.stitch (imgs, pano); imwrite (result_name, pano); Mat pano2 = pano.clone (); // Tampilkan gambar sumber dan gambar hasil // imshow ("gambar panomik", pano); if (waitKey () == 27) kembali 0; // imwrite (result_name, pano);}Jadi bagaimana Java berinteraksi dengan C ++? Melalui teknologi JNI di Java
Mari kita pahami JNI di Java
Java Native Interface (JNI singkatnya), Java adalah bahasa lintas platform, dan kadang-kadang kode lokal perlu dipanggil. Sun menyediakan antarmuka JNI, yang saling memanggil kode lokal sistem operasi. Gambar berikut menunjukkan prinsip panggilan asli di java
Para meridian semuanya jelas, jadi mari kita mulai
OpenCvutil kelas publik {static {// System.load di sini digunakan untuk memuat pustaka tautan dinamis yang dihasilkan oleh C ++. Bahkan, Anda dapat memutuskan bahwa itu tidak harus statis. System.LoadLibrary ("Opencvutil"); } public Static Native String ChangeArrValue (String str); public static void main (string [] args) melempar UnsupportedencodingException {String base = "d:/quanjingtu/gg"+"/"; panjang int = 5; String url = ""; untuk (int i = 1; i <= panjang; i ++) {if (i == 1) {url = url+basis+i+". jpg"; } else {url = url+","+base+i+". jpg"; }} //System.out.println(url); String temp = string baru (changeArrValue (url) .getbytes (), "gbk"); System.out.println (temp); ; }}Tentukan metode asli dan kompilasi file java ke dalam file .class
Masukkan Jendela Perintah CMD, buka direktori file kelas kompilasi yang sesuai dan jalankan perintah javah
Menghasilkan file com_lianxi_securitytest_opencv_opencvutil.h yang sesuai
#include <jni.h>/ * header untuk kelas com_lianxi_securitytest_opencv_opencvutil */#ifndef _included_com_lianxi_securitytest_opencv_opencvutil#Define _included_com_com_lianxi_security __cplusplusExtern "c" {#endif/ * * class: com_lianxi_securitytest_opencv_opencvutil * Metode: changearrvalue * tanda tangan: (ljava/lang/string;) ljava/lang/string; */Jniexport jString jnicall java_com_lianxi_securitytest_opencv_opencvutil_changearrvalue (jnienv *, jclass, jString);#ifdef __cplusplus}#endif#endif);Hanya metode asli yang diproses, salin file ke lokasi proyek VS 2017
#include "stdafx.h" #include "com_lianxi_securitytest_opencv_opencvutil.h" #include <ioStream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp.hpp.hpp> <opencv2/opencv.hpp> #include <vector> #include <string> menggunakan namespace std; menggunakan namespace cv; bool try_use_gpu = false; vektor <mat> imgs; string hancur_name = "d: /result.jpg"; jniexport jstring Jnicall Jnicall Jnicall Jnicall Jnicall Jnicall Jnicall Jnicall Java_com_lianxi_securitytest_opencv_opencvutil_changearrvalue (jnienv * env, jclass obj, jString prompt) {// Ini adalah string yang diterima, beberapa jalur const char * str; //........ Stitcher stitcher = stitcher :: createDefault (try_use_gpu); // Gunakan fungsi jahitan untuk menyambungkan tikar pano; Stitcher :: status status = stitcher.stitch (imgs, pano); imwrite (result_name, pano); Mat pano2 = pano.clone (); // Tampilkan gambar sumber dan gambar hasil // imshow ("gambar panogue", pano); if (waitkey () == 27) if (status! = stitcher :: ok) {return env-> newstringutf ("Gagal gambar !!!"); } // return env-> newstringutf (result_name.c_str); String newsstr = "Picture Success !!! url =" + result_name; return env-> newstringutf (const_cast <char*> (newstr.c_str ()));}Di atas adalah kode C ++ yang sesuai
Klik Generate ---> Regenerate Solution untuk menghasilkan file DLL yang sesuai, dan kemudian letakkan di direktori JDK JRE/BIN
Jalankan program Java, hasilnya adalah sebagai berikut
Lihatlah tampilan panorama sintetis
Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini memiliki nilai referensi tertentu untuk studi atau pekerjaan semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Terima kasih atas dukungan Anda ke wulin.com.