نظرة عامة بانورامية
يحدث إسقاط الصورة عندما يتم تعيين صورة الطائرة على سطح منحني ، والعكس صحيح ، وهو أمر شائع بشكل خاص في التصوير الفوتوغرافي البانورامي. على سبيل المثال ، يمكن تعيين مجال الأرض إلى قطعة مسطحة من الورق. نظرًا لأن مجال الرؤية بأكمله من حولنا يمكن اعتباره سطح الكرة (لجميع زوايا المراقبة) ، نحتاج إلى طريقة يمكنها عرض الكرة في المستوى ثنائي الأبعاد لطباعة الصور.
من السهل نسبيًا للمنظورات الصغيرة تشويه الورق المسطح. ومع ذلك ، فإن بعض التشوه أمر لا مفر منه عند محاولة تعيين صورة كروية إلى طائرة. لذلك ، يحاول كل نوع من أنواع الإسقاط تجنب نوع واحد من التشويه على حساب أنواع أخرى من التشوهات. مع زيادة مجال الرؤية ، يصبح قوس المشاهدة أكثر منحنيًا ، بحيث تصبح الاختلافات بين أنواع الإسقاطات البانورامية أكثر أهمية. متى تستخدم أي الإسقاط يعتمد إلى حد كبير على كل تطبيق إسقاط. هنا ، نركز على العديد من أكثرها استخدامًا.
مقدمة
نظرًا لاحتياجات المشروع ، قمت بعمل العرض التوضيحي الخاص بي وتعلمت الكثير منه. لذلك شاركته. آمل أن يتجنب أولئك الذين لديهم هذه الحاجة التفاف. هناك العديد من البرامج التعليمية عبر الإنترنت حول كيفية تثبيت OpenCV. لن أشرح بالتفصيل هنا. لقد قمت بتثبيت OpenCV-3.3.0
كما هو موضح في الشكل أعلاه ، ابحث عن حزمة الجرة المقابلة. سنتحدث هنا عن كيفية استيراد هذه الجرة في مستودع Maven
MVN تثبيت: التثبيت file -dfile = d: /opencv -33
<roupl> com.suibian </rougiD> <StifactId> opencv-300 </shintifactid> <الإصدار> 3.3.0 </version>
حسنًا ، حتى تتمكن Java من تشغيل OpenCV من خلال هذه الجرة. دعونا نلقي نظرة. بالطبع ، يمكنك أن تفكر على هذا النحو ، مما يعني أنك بسيط للغاية. دعونا نلقي نظرة على المقارنة بين المسار في التضمين في OpenCV والحزمة في جرة
هاها ، لا يوجد خياطة رئيسية للخرائط البانورامية ، ولم يتم تحديث 2015 الموجهة نحو جاوة منذ ذلك الحين. لا يوجد فئة رئيسية لتوليف الخرائط البانورامية (الحمقى) كما هو موضح في الشكل التالي ، لكن C ++ يوفر لي مع
إذن ماذا تفعل؟ كيفية استخدام Java للاتصال رمز C ++. نحن نعلم أنه عند التعامل مع نظام التشغيل ، يكون C/C ++ أكثر ملاءمة من Java. يتم تطوير معظم تطبيقات معالجة رسومات OpenCV في C ++. الجميع على دراية بالكلمة الرئيسية الأصلية ، لكننا نريد النقر ونرى كيف يتم تنفيذها ، لكن لا يمكننا النقر فوقها لأنه غير مكتوب في Java. قد يكون C/C ++. يتوافق الأم مع ملفات xxx.dll في دليل BIN تحت JRE في Java. حتى نتمكن من حزم رمز C ++ الذي نريد استخدامه في ملف تنسيق DLL ووضعه في دليل BIN. بالطبع ، يتضمن هذا المعلمات وقيم الإرجاع للطريقة. دون أن يقول الكثير ، قم بتثبيت Visual Studio 2017 ، وتثبيت البرامج التعليمية والعديد من البرامج التعليمية عبر الإنترنت
انقر فوق ملف-> جديد-> Project ---> سطح مكتب Windows-> مكتبة الارتباط الديناميكي (DLL) ، بحيث سيتم إنشاء المشروع بنجاح. بعد ذلك ، أضف الرمز
هذا هو رمز C ++ لتوليف الصور البانورامي
#include "stdafx.h" #include <IoStream> #include <openCv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <pencv2/imgproc/imgproc.hpp> #Include <pencv2/opencv.hp> مساحة الاسم STD ؛ باستخدام مساحة الاسم CV ؛ BOOL TRAW_USE_GPU = FALSE ؛ متجه <TAS> IMGS ؛ string result_name = "d: /result1.jpg" ؛ int _tmain (int argc ، char * argv []) MAT IMG2 = IMREAD ("D: /quanjingtu/hh/2.jpg") ؛ MAT IMG3 = IMREAD ("D: /Qanjingtu/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: /Qanjingtu/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 :: createFault (try_use_gpu) ؛ // استخدم وظيفة الغرز لربط حصيرة بانو ؛ Stitcher :: حالة الحالة = Stitcher.stitch (IMGS ، Pano) ؛ imwrite (result_name ، pano) ؛ MAT pano2 = pano.clone () ؛ // عرض الصورة المصدر وصورة النتيجة // imshow ("صورة panomic" ، pano) ؛ if (waitKey () == 27) return 0 ؛ // imwrite (result_name ، pano) ؛}فكيف تتفاعل جافا مع C ++؟ من خلال تقنية JNI في Java
دعونا نفهم Jni في Java
واجهة Java الأصلية (JNI for Short) ، Java هي لغة منصة منصة ، وأحيانًا يجب استدعاء التعليمات البرمجية المحلية. يوفر Sun واجهة JNI ، والتي تستدعي بعضها البعض بالرمز المحلي لنظام التشغيل. يوضح الشكل التالي مبدأ الاتصال في جافا
كل شيء واضح ، لذلك لنبدأ
فئة عامة OpenCvutil {static {// system.load هنا يتم استخدامها لتحميل مكتبة الارتباط الديناميكية التي تم إنشاؤها بواسطة C ++. في الواقع ، يمكنك أن تقرر أنها ليست ثابتة بالضرورة. System.LoadLibrary ("OpenCvutil") ؛ } السلسلة الأصلية الثابتة العامة changearrvalue (سلسلة str) ؛ يرمي الفراغ الثابت العام (سلسلة [] args) UnsupportedEncodingException {String base = "d:/quanjingtu/gg"+"/" ؛ طول int = 5 ؛ url url = "" ؛ لـ (int i = 1 ؛ i <= length ؛ i ++) {if (i == 1) {url = url+base+i+". jpg" ؛ } آخر {url = url+"،"+base+i+". jpg" ؛ }} //system.out.println(url) ؛ سلسلة temp = سلسلة جديدة (changearrvalue (url) .getBytes () ، "GBK") ؛ System.out.println (temp) ؛ ؛ }}تحديد الطريقة الأصلية وتجميع ملف Java في ملف .class
أدخل نافذة الأمر cmd ، افتح دليل ملف الفئة المترجمة المقابل وقم بتنفيذ أمر Javah
إنشاء ملف com_lianxi_securitytest_opencv_opencvutil.h المقابل
#include <jni.h>/ * header للفئة com_lianxi_securitytest_opencv_opencvutil */#ifndef _included_com_lianxi_securitytest_opencv_opencvutil#define _included_com_lianxi_securitytest_opencvutile __cplusplusextern "c" {#endif/ * * class: 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#تتم معالجة الطريقة الأصلية فقط ، انسخ الملف إلى موقع مشروع VS 2017
#include "stdafx.h" #include "com_lianxi_securitytest_opencv_opencvutil.h" #include <ioStream> #Includ <pencv2/opencv.hpp> #include <vector> #include <string> باستخدام مساحة الاسم std ؛ باستخدام مساحة الاسم Cv ؛ bool try_gpu = false ؛ متجه <tric> imgs ؛ string result_name = "d:/result.jpg" java_com_lianxi_securitytest_opencv_opencvutil_changearrvalue (jnienv * env ، jclass obj ، jstring) {// هذه هي السلسلة المستلمة ، مسارات متعددة const char * str ؛ Stitcher Stitcher = Stitcher :: createFault (try_use_gpu) ؛ // استخدم وظيفة الغرز لصياد حصيرة بانو ؛ Stitcher :: حالة الحالة = Stitcher.stitch (IMGS ، Pano) ؛ imwrite (result_name ، pano) ؛ MAT pano2 = pano.clone () ؛ // عرض صورة المصدر وصورة النتيجة // imshow ("Panogue Image" ، Pano) ؛ if (waitKey () == 27) if (الحالة! = Stitcher :: OK) {return env-> newstringutf ("فشل الصورة !!!") ؛ } // return env-> newstringutf (result_name.c_str) ؛ String NewsStr = "Picture Success !!! url =" + result_name ؛ return env-> newstringutf (const_cast <char*> (newstr.c_str ())) ؛}ما سبق هو رمز C ++ المقابل
انقر فوق إنشاء ---> تجديد الحل لإنشاء ملف DLL المقابل ، ثم وضعه في دليل JDK JRE/BIN
تشغيل برنامج Java ، والنتيجة هي كما يلي
ألق نظرة على المنظر البانورامي الاصطناعي
لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.