ภาพรวมแบบพาโนรามา
การฉายภาพเกิดขึ้นเมื่อใดก็ตามที่ภาพระนาบถูกแมปกับพื้นผิวโค้งและในทางกลับกันซึ่งเป็นเรื่องธรรมดาโดยเฉพาะอย่างยิ่งในการถ่ายภาพแบบพาโนรามา ตัวอย่างเช่นทรงกลมของโลกสามารถแมปกับกระดาษแบน เนื่องจากมุมมองทั้งหมดรอบตัวเราถือได้ว่าเป็นพื้นผิวของทรงกลม (สำหรับมุมสังเกตทั้งหมด) เราจำเป็นต้องมีวิธีการที่สามารถฉายทรงกลมลงในระนาบ 2 มิติสำหรับการพิมพ์ภาพถ่าย
มุมมองขนาดเล็กค่อนข้างง่ายต่อการเปลี่ยนรูปและฉายลงบนกระดาษแบน อย่างไรก็ตามการเสียรูปบางอย่างเป็นสิ่งที่หลีกเลี่ยงไม่ได้เมื่อพยายามทำแผนที่ภาพทรงกลมกับระนาบ ดังนั้นการคาดการณ์แต่ละประเภทจึงพยายามหลีกเลี่ยงการบิดเบือนประเภทหนึ่งที่ค่าใช้จ่ายของการบิดเบือนประเภทอื่น เมื่อมุมมองเพิ่มขึ้นส่วนโค้งการดูจะโค้งขึ้นมากขึ้นเพื่อให้ความแตกต่างระหว่างประเภทของการคาดการณ์แบบพาโนรามามีความสำคัญมากขึ้น เมื่อใดที่ควรใช้การฉายภาพขึ้นอยู่กับแอปพลิเคชันการฉายแต่ละครั้ง ที่นี่เรามุ่งเน้นไปที่หลายคนที่ใช้กันมากที่สุด
คำนำ
เนื่องจากความต้องการของโครงการฉันได้ทำการสาธิตของตัวเองและเรียนรู้มากมายจากมัน ดังนั้นฉันจึงแบ่งปัน ฉันหวังว่าผู้ที่มีความต้องการนี้จะหลีกเลี่ยงการหยุดหาย มีบทเรียนออนไลน์มากมายเกี่ยวกับวิธีการติดตั้ง OpenCV ฉันจะไม่อธิบายรายละเอียดที่นี่ ฉันติดตั้ง opencv-3.3.0
ดังที่แสดงในรูปด้านบนค้นหาแพ็คเกจ JAR ที่เกี่ยวข้อง ที่นี่เราจะพูดคุยเกี่ยวกับวิธีการนำเข้าขวดนี้ไปยังที่เก็บ Maven
MVN ติดตั้ง: ติดตั้งไฟล์ -dfile = d: /opencv-3.0.0/opencv/build/java/opencv-300.jar -dgroupid = com.suibian -dartifactid = OpenCv -300 -dversion = 3.3.0 -dpackaging = jar
<RoupID> com.suibian </roupId> <ratifactId> OpenCV-300 </ArtIfactId> <Sersion> 3.3.0 </Sersion>
ตกลงดังนั้น Java สามารถใช้งาน OpenCV ผ่านขวดนี้ มาดูกันเถอะ แน่นอนคุณสามารถคิดแบบนี้ซึ่งหมายความว่าคุณง่ายมาก ลองมาดูการเปรียบเทียบระหว่างเส้นทางที่รวมอยู่ใน OpenCV และแพ็คเกจใน JAR
ฮ่าฮ่าไม่มีการเย็บที่สำคัญสำหรับแผนที่พาโนรามาและยังไม่ได้รับการปรับปรุง Java ที่มุ่งเน้นตั้งแต่นั้นมา ไม่มีคลาสคีย์สำหรับการสังเคราะห์แผนที่พาโนรามา (คนโง่) ดังแสดงในรูปต่อไปนี้ แต่ C ++ ให้ฉันด้วย
แล้วจะทำอย่างไร? วิธีใช้ Java เพื่อเรียกรหัส C ++ เรารู้ว่าเมื่อจัดการกับระบบปฏิบัติการ C/C ++ นั้นเหมาะสมกว่า Java อย่างไม่ต้องสงสัย แอปพลิเคชันส่วนใหญ่ของการประมวลผลกราฟิก OpenCV ได้รับการพัฒนาใน C ++ ทุกคนคุ้นเคยกับคำหลักดั้งเดิม แต่เราต้องการคลิกและดูว่ามันถูกนำไปใช้อย่างไร แต่เราไม่สามารถคลิกได้เพราะมันไม่ได้เขียนใน Java อาจเป็น C/C ++ เนทีฟสอดคล้องกับไฟล์ xxx.dll ในไดเรกทอรี bin ภายใต้ JRE ใน Java ดังนั้นเราสามารถบรรจุรหัส C ++ ที่เราต้องการใช้ในไฟล์รูปแบบ DLL และใส่ไว้ในไดเรกทอรี BIN แน่นอนว่าสิ่งนี้เกี่ยวข้องกับพารามิเตอร์และค่าส่งคืนของวิธีการ ติดตั้ง Visual Studio 2017 ติดตั้งแบบฝึกหัดและแบบฝึกหัดออนไลน์มากมาย
คลิกไฟล์-> ใหม่-> โครงการ ---> Windows Desktop-> Dynamic Link Library (DLL) เพื่อให้โครงการถูกสร้างขึ้นสำเร็จ ถัดไปเพิ่มรหัส
นี่คือรหัส C ++ สำหรับการสังเคราะห์ภาพพาโนรามา
#include "stdafx.h" #include <Iostream> #include <OpenCv2/core/core.hpp> #include <OpenCv2/highgui/highgui.hpp> #include <Pencv2/imgProc/imgProc.hpp> #include Namespace std; การใช้ 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 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 << "ไม่สามารถอ่านภาพ" << endl; กลับ -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); // ใช้ฟังก์ชั่นตะเข็บสำหรับการประกบ MAT PANO; Stitcher :: สถานะสถานะ = Stitcher.stitch (IMGS, PANO); iMwrite (result_name, pano); mat pano2 = pano.clone (); // แสดงภาพต้นฉบับและภาพผลลัพธ์ // imshow ("panomic image", pano); ถ้า (waitkey () == 27) กลับ 0; // imwrite (result_name, pano);}แล้ว Java โต้ตอบกับ C ++ ได้อย่างไร? ผ่านเทคโนโลยี JNI ใน Java
มาเข้าใจ JNI ใน Java กันเถอะ
Java Native Interface (JNI สั้น ๆ ), Java เป็นภาษาข้ามแพลตฟอร์มและบางครั้งจำเป็นต้องเรียกรหัสท้องถิ่น Sun จัดเตรียมอินเทอร์เฟซ JNI ซึ่งเรียกซึ่งกันและกันด้วยรหัสท้องถิ่นระบบปฏิบัติการ รูปต่อไปนี้แสดงหลักการโทรของชาวพื้นเมืองในชวา
เส้นเมอริเดียนมีความชัดเจนดังนั้นเริ่มต้นกันเถอะ
คลาสสาธารณะ OpenCvutil {Static {// The System.Load ที่นี่ใช้เพื่อโหลดไลบรารีลิงก์แบบไดนามิกที่สร้างโดย C ++ ในความเป็นจริงคุณสามารถตัดสินใจได้ว่าไม่จำเป็นต้องคงที่ System.loadLibrary ("OpenCvutil"); } public String String ChangearRvalue (String Str); โมฆะคงที่สาธารณะหลัก (สตริง [] args) พ่น unsupportencodexception {String base = "d:/quanjingtu/gg"+"/"; ความยาว int = 5; สตริง url = ""; สำหรับ (int i = 1; i <= ความยาว; i ++) {ถ้า (i == 1) {url = url+base+i+". jpg"; } else {url = url+","+base+i+". jpg"; }} //system.out.println(url); String temp = สตริงใหม่ (changearrvalue (url) .getBytes (), "GBK"); System.out.println (อุณหภูมิ); - -กำหนดวิธีดั้งเดิมและรวบรวมไฟล์ Java ลงในไฟล์. class
ป้อนหน้าต่างคำสั่ง cmd เปิดไดเรกทอรีไฟล์คลาสที่รวบรวมที่สอดคล้องกันและดำเนินการคำสั่ง Javah
สร้างไฟล์ com_lianxi_securitytest_opencv_opencvutil.h ที่เกี่ยวข้อง
#include <jni.h>/ * ส่วนหัวสำหรับคลาส com_lianxi_securitytest_opencv_opencvutil */#ifndef _included_com_lianxi_securitytest_opencv_opencvutil#define __CPlusPlusextern "C" {#endif/ * * คลาส: com_lianxi_securitytest_opencv_opencvutil * วิธี: changearrvalue * ลายเซ็น: (ljava/lang/string;) ljava/lang/string; */jniexport JString jnicall java_com_lianxi_securitytest_opencv_opencvutil_changearrvalue (jnienv *, jclass, jstring);#ifdef __cplusplus}#endif#endif#endif#endif#endif#endifมีการประมวลผลวิธีดั้งเดิมเท่านั้นคัดลอกไฟล์ไปยังตำแหน่งของโครงการ VS 2017
#include "stdafx.h" #include "com_lianxi_securitytest_opencv_opencvutil.h" #include <Iostream> #include <OpenCv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp># <pencv2/opencv.hpp> #include <Vector> #include <String> การใช้ namespace std; การใช้ namespace cv; bool try_use_gpu = false; เวกเตอร์ <mat> imgs; string refules_name = "d:/result.jpg" jniexport java_com_lianxi_securitytest_opencv_opencvutil_changearrvalue (jnienv * env, jclass obj, jstring prompt) {// นี่คือสตริงที่ได้รับ Stitcher Stitcher = Stitcher :: createDefault (try_use_gpu); // ใช้ฟังก์ชั่นตะเข็บเพื่อประกบเสื่อ Pano; Stitcher :: สถานะสถานะ = Stitcher.stitch (IMGS, PANO); iMwrite (result_name, pano); mat pano2 = pano.clone (); // แสดงภาพต้นทางและภาพผลลัพธ์ // imshow ("Panogue Image", Pano); if (waitkey () == 27) ถ้า (สถานะ! = Stitcher :: ตกลง) {return env-> newStringutf ("ภาพล้มเหลว !!!"); } // return env-> newStringUtf (result_name.c_str); String Newsstr = "ความสำเร็จของรูปภาพ !!! url =" + result_name; return env-> newstringutf (const_cast <char*> (newstr.c_str ()));}ข้างต้นคือรหัส C ++ ที่สอดคล้องกัน
คลิกสร้าง ---> สร้างโซลูชันใหม่เพื่อสร้างไฟล์ DLL ที่เกี่ยวข้องแล้วใส่ไว้ในไดเรกทอรี JDK JRE/BIN
เรียกใช้โปรแกรม Java ผลลัพธ์มีดังนี้
ดูมุมมองแบบพาโนรามาสังเคราะห์
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com