Панорамный обзор
Проекция изображения возникает всякий раз, когда плоское изображение отображается с изогнутой поверхностью, и наоборот, что особенно распространено в панорамной фотографии. Например, сфера Земли может быть нанесена на карту с плоским листом бумаги. Поскольку все поле зрения вокруг нас можно рассматривать как поверхность сферы (для всех углов наблюдения), нам нужен метод, который может проецировать сферу в 2-D плоскость для фото печать.
Небольшие перспективы относительно легко деформируются и проецируют на плоскую бумагу. Тем не менее, некоторая деформация неизбежна при попытке сопоставить сферическое изображение на плоскость. Следовательно, каждый тип проекции пытается избежать одного типа искажений за счет других типов искажений. По мере увеличения поля зрения дуга просмотра становится более изогнутой, так что различия между типами панорамных проекций становятся более значительными. Когда использовать, какая проекция в значительной степени зависит от каждого проекционного приложения. Здесь мы сосредоточены на нескольких наиболее часто используемых.
Предисловие
Из -за потребностей проекта я сделал свою собственную демонстрацию и многому научился. Итак, я поделился этим. Я надеюсь, что те, у кого есть такая необходимость, избежают обхода. Есть много онлайн -уроков о том, как установить OpenCV. Я не буду подробно объяснить здесь. Я установил OpenCV-3.3.0
Как показано на приведенном выше рисунке, найдите соответствующий пакет JAR. Здесь мы поговорим о том, как импортировать эту банку в репозиторий Maven
Установка MVN: install-file -dfile = d: /opencv-3.0.0/opencv/build/java/opencv-300.jar -dgroupid = com.suibian-dartifactid = opencv-300 -dervsion = 3.3.0 -dpackaging = jar -dgenerate = true -dcreatechsum = истин.
<groupId> com.suibian </GroupId> <StrifactId> openCV-300 </artifactId> <serse> 3.3.0 </version>
Хорошо, так что Java может управлять OpenCV через эту банку. Давайте посмотрим. Конечно, вы можете так думать, что означает, что вы очень просты. Давайте посмотрим на сравнение между путем, включенным в OpenCV и пакет в JAR
Ха-ха, нет ключевых швов для панорамных карт, и с тех пор, как 2015 год, ориентированный на Java. Нет ключевого класса для синтеза панорамных карт (дураков), как показано на следующем рисунке, но C ++ дает мне
Так что делать? Как использовать Java, чтобы вызвать C ++ код. Мы знаем, что при работе с операционной системой C/C ++, несомненно, более подходящий, чем Java. Большинство применений обработки графики OpenCV разработаны в C ++. Все знакомы с нативным ключевым словом, но мы хотим щелкнуть и посмотреть, как оно реализовано, но мы не можем щелкнуть, потому что оно не написано на Java. Это может быть C/C ++. Нативные соответствует файлам xxx.dll в каталоге Bin в JRE в Java. Таким образом, мы можем упаковать код C ++, который мы хотим использовать в файл формата DLL, и поместить его в каталог BIN. Конечно, это включает параметры и возвращаемые значения метода. Не говоря уже о том, что установите Visual Studio 2017, установите учебные пособия и многие онлайн -учебники
Нажмите File-> New-> Project ---> Windows Desktop-> Динамическая библиотека ссылок (DLL), чтобы проект был успешно создан. Далее добавьте код
Это код C ++ для синтеза панорамного изображения
#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> #include <openc. namespace std; использование пространства имен 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: /quanjingtu/hh/1. 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 :: CreateFault (try_use_gpu); // Использование функции стежка для сплайсинга мата Pano; Stitcher :: status = stitcher.stitch (imgs, pano); imwrite (result_name, pano); Mat pano2 = pano.clone (); // отображать исходное изображение и изображение результата // imshow («Panomic Image», Pano); if (watkey () == 27) вернуть 0; // imwrite (result_name, pano);}Итак, как Java взаимодействует с C ++? Через технологию JNI в Java
Давайте поймем JNI на Java
Нативный интерфейс Java (JNI для короткого), Java-это кроссплатформенный язык, и иногда необходимо вызвать локальный код. Sun предоставляет интерфейс JNI, который звонит друг другу с помощью локального кода операционной системы. На следующем рисунке показан принцип призывного урожая в Java
Меридианы все ясны, так что давайте начнем
Открытый класс opencvutil {static {// Система. Загрузка здесь используется для загрузки библиотеки динамических ссылок, сгенерированной C ++. На самом деле, вы можете решить, что это не обязательно статично. System.LoadLibrary ("OpenCvutil"); } public Static Native String Changearrvalue (String Str); public static void main (string [] args) бросает UnsupportedEncodingException {String base = "d:/Quanjingtu/gg"+"/"; int длина = 5; String url = ""; for (int i = 1; i <= length; 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); ; }}Определите собственный метод и составьте файл 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 _included_com_lianxi_securitytestest_opencV __cplusplusextern "c" {#endif/ * * class: com_lianxi_securitytest_opencv_opencvutil * Метод: Changearrvalue * signature: (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> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui. <opencv2/opencv.hpp> #include <vector> #include <string> с использованием пространства имен std; с использованием пространства имен cv; bool try_use_gpu = false; vector <mat> imgs; struction_name = "d: /result.jpg"; Java_com_lianxi_securitytest_opencv_opencvutil_changearrvalue (jnienv * env, jclass obj, jstring reffice) {// Это полученная строка, множественные пути const char * str; //.......................................................///mgs.push_back (img6); Stitcher Stitcher = Stitcher :: CreateFault (try_use_gpu); // Используйте функцию стежка для Splice Mat Pano; Stitcher :: status = stitcher.stitch (imgs, pano); imwrite (result_name, pano); Mat pano2 = pano.clone (); // отображать исходное изображение и изображение результата // imshow ("Panogue Image", Pano); if (waitkey () == 27) if (status! = stitcher :: ok) {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.