Descripción general panorámica
La proyección de la imagen ocurre cada vez que una imagen plana se asigna a una superficie curva, y viceversa, que es particularmente común en la fotografía panorámica. Por ejemplo, la esfera de la tierra se puede asignar a un pedazo de papel plano. Dado que todo el campo de visión a nuestro alrededor puede considerarse como la superficie de la esfera (para todos los ángulos de observación), necesitamos un método que pueda proyectar la esfera en el plano 2-D para la impresión fotográfica.
Las pequeñas perspectivas son relativamente fáciles de deformar y proyectarse en papel plano. Sin embargo, cierta deformación es inevitable cuando se trata de asignar una imagen esférica a un avión. Por lo tanto, cada tipo de proyección intenta evitar un tipo de distorsión a expensas de otros tipos de distorsiones. A medida que aumenta el campo de visión, el arco de visualización se vuelve más curvado, de modo que las diferencias entre los tipos de proyecciones panorámicas se vuelven más significativas. Cuándo usar qué proyección depende en gran medida de cada aplicación de proyección. Aquí, nos centramos en varios de los más utilizados.
Prefacio
Debido a las necesidades del proyecto, hice mi propia demostración y aprendí mucho de ella. Entonces lo compartí. Espero que aquellos que tienen esta necesidad eviten los desvíos. Hay muchos tutoriales en línea sobre cómo instalar OpenCV. No explicaré en detalle aquí. Instalé OpenCV-3.3.0
Como se muestra en la figura anterior, encuentre el paquete JAR correspondiente. Aquí hablaremos sobre cómo importar este frasco al repositorio de Maven
MVN Instalar: Install -File -DFile = D: /Opencv-3.0.0/opencv/build/java/opencv-300.jar -dgroupid = com.suibian -Dartifactid = opencv -300 -dversion = 3.3.0 -dpackaging = jAR -dgeneratepom = true -dcreateSum = verdadero verdadero
<MoupRid> com.suibian </groupid> <artifactid> opencv-300 </artifactid> <versión> 3.3.0 </versión>
Ok, entonces Java puede operar OpenCV a través de este frasco. Echemos un vistazo. Por supuesto, puedes pensar así, lo que significa que eres muy simple. Echemos un vistazo a la comparación entre la ruta incluido en OpenCV y el paquete en JAR
Jaja, no hay costuras clave para mapas panorámicos, y el 2015 orientado a Java no se ha actualizado desde entonces. No hay una clase clave para sintetizar mapas panorámicos (tontos) como se muestra en la siguiente figura, pero C ++ me proporciona con
Entonces, ¿qué hacer? Cómo usar Java para llamar al código C ++. Sabemos que al tratar con el sistema operativo, C/C ++ es indudablemente más adecuado que Java. La mayoría de las aplicaciones del procesamiento de gráficos OpenCV se desarrollan en C ++. Todos están familiarizados con la palabra clave nativa, pero queremos hacer clic y ver cómo se implementa, pero no podemos hacer clic porque no está escrito en Java. Puede ser C/C ++. Native corresponde a archivos xxx.dll en el directorio bin en JRE en Java. Por lo tanto, podemos empaquetar el código C ++ que queremos usar en un archivo de formato DLL y ponerlo en el directorio bin. Por supuesto, esto implica los parámetros y los valores de retorno del método. Sin decir mucho, instale Visual Studio 2017, instale tutoriales y muchos tutoriales en línea
Haga clic en Archivo-> Nuevo-> Proyecto ---> Desktop de Windows-> Biblioteca de enlaces dinámicos (DLL), para que el proyecto se cree con éxito. A continuación, agregue el código
Este es el código C ++ para la síntesis de imágenes panorámicas
#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; usando Namespace cv; bool try_use_gpu = false; vector <at> imgs; string result_name = "d: /Result1.jpg"; int _tmain (int argc, char * argv []) {mat img1 = imead ("d: /quanjingtu/hh/1.jpg"); Mat img2 = imecado ("d: /quanjingtu/hh/2.jpg"); Mat img3 = iMread ("d: /quanjingtu/hh/3.jpg"); Mat img4 = imeR ("d: /quanjingtu/hh/4.jpg"); Mat img5 = imeR ("d: /quanjingtu/hh/5.jpg"); Mat img6 = iMread ("d: /quanjingtu/hh/6.jpg"); Mat img7 = imeR ("d: /quanjingtu/hh/7.jpg"); Mat img8 = iMread ("d: /quanjingtu/hh/8.jpg"); Mat img9 = imecado ("d: /quanjingtu/hh/9.jpg"); Mat img10 = imecado ("d: /quanjingtu/hh/10.jpg"); // Mat img6 = imecado ("6.jpg"); if (img1.empty () || img2.empty ()) {cout << "No se puede leer la imagen" << endl; regreso -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); // Use la función de puntada para empalmar Mat Pano; Stitcher :: status status = stitcher.stitch (imgs, pano); imwrite (resultado_name, pano); Mat Pano2 = pano.clone (); // Muestra la imagen de origen y la imagen de resultado // imshow ("imagen panomic", pano); if (waitkey () == 27) return 0; // imwrite (result_name, pano);}Entonces, ¿cómo interactúa Java con C ++? A través de la tecnología JNI en Java
Entendamos Jni en Java
Interfaz nativa de Java (JNI para abreviar), Java es un lenguaje multiplataforma y, a veces, es necesario llamar al código local. Sun proporciona una interfaz JNI, que se llama entre sí con el código local del sistema operativo. La siguiente figura muestra el principio de llamadas del nativo en Java
Los meridianos están claros, así que comencemos
Public Class OpenCVutil {static {// La carga System.Load aquí se usa para cargar la biblioteca de enlaces dinámicos generada por C ++. De hecho, puede decidir que no es necesariamente estático. System.LoadLibrary ("OpenCvutil"); } public static static native changearRValue (String Str); public static void main (string [] args) lanza UnsupportedEncodingException {String base = "d:/quanjingtu/gg"+"/"; int longitud = 5; Cadena url = ""; for (int i = 1; i <= longitud; i ++) {if (i == 1) {url = url+base+i+". jpg"; } else {url = url+","+base+i+". jpg"; }} //System.out.println(url); Cadena temp = new String (ChangEArrValue (url) .getBytes (), "gbk"); System.out.println (temp); ; }}Definir el método nativo y compilar el archivo Java en el archivo .class
Ingrese la ventana de comando CMD, abra el directorio de archivos de clase compilado correspondiente y ejecute el comando javah
Genere el archivo COM_LIANXI_SECURITYTEST_OPENCV_OPENCVUTIL.H
#include <jni.h>/ * encabezado para la clase com_lianxi_securitytest_opencv_opencvutil */#ifndef _included_com_lianxi_securityTest_opencv_opencvutil#define _included_com_lianxi_securitytest_opencvvutil __cplusplusExtern "C" {#endif/ * * class: com_lianxi_securityTest_opencv_opencvutil * Método: ChangearRvalue * firma: (ljava/lang/string;) ljava/lang/string; */Jniexport jString Jnicall java_com_lianxi_securitytest_opencv_opencvutil_changarrvalue (jnienv *, jclass, jString);#ifdef __cplusplus}#endif#endiff#endif#endifiFSolo se procesa el método nativo, copie el archivo a la ubicación del proyecto VS 2017
#include "stdafx.h" #include "com_lianxi_securityTest_opencv_opencvutil.h" #include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <openCV2PROCPROC/IMGCAPCAT <OpenCV2/opencv.hpp> #include <vector> #include <string> usando Namespace std; usando Namespace cv; bool try_use_gpu = false; vector <at> imgs; string result_name = "d: /result.jpg"; jniexport jstring jnicall Java_com_lianxi_securitytest_opencv_opencvutil_changarrvalue (jnienv * env, jclass obj, jString ind) {// Esta es la cadena recibida, múltiples rutas const char * str; //...............................................................// iMgs.push_back (img6); Stitcher stitcher = stitcher :: createFault (try_use_gpu); // Use la función de puntada para empalmar Mat Pano; Stitcher :: status status = stitcher.stitch (imgs, pano); imwrite (resultado_name, pano); Mat Pano2 = pano.clone (); // Muestra la imagen de origen y la imagen del resultado // imshow ("imagen de panogue", pano); if (waitkey () == 27) if (status! = stitcher :: ok) {return env-> newStringutf ("Falla de imagen !!!"); } // return env-> newStringutf (result_name.c_str); String Newsstr = "Imagen éxito !!! url =" + resultado_name; return env-> newStringUtf (const_cast <char*> (newstr.c_str ()));}Lo anterior es el código C ++ correspondiente
Haga clic en Generar ---> Regenerar la solución para generar el archivo DLL correspondiente, y luego colóquelo en el directorio JDK JRE/bin
Ejecutar el programa Java, el resultado es el siguiente
Echa un vistazo a la vista panorámica sintética
Resumir
Lo anterior es todo el contenido de este artículo. Espero que el contenido de este artículo tenga cierto valor de referencia para el estudio o el trabajo de todos. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse. Gracias por su apoyo a Wulin.com.