Visão geral panorâmica
A projeção de imagem ocorre sempre que uma imagem plana é mapeada para uma superfície curva e vice -versa, o que é particularmente comum na fotografia panorâmica. Por exemplo, a esfera da terra pode ser mapeada para um pedaço de papel plano. Como todo o campo de visão ao nosso redor pode ser considerado como a superfície da esfera (para todos os ângulos de observação), precisamos de um método que possa projetar a esfera no plano 2-D para impressão de fotos.
Pequenas perspectivas são relativamente fáceis de se deformar e projetar em papel plano. No entanto, alguma deformação é inevitável ao tentar mapear uma imagem esférica para um plano. Portanto, cada tipo de projeção tenta evitar um tipo de distorção às custas de outros tipos de distorções. À medida que o campo de visão aumenta, o arco de visualização se torna mais curvo, de modo que as diferenças entre os tipos de projeções panorâmicas se tornam mais significativas. Quando usar qual projeção depende em grande parte de cada aplicação de projeção. Aqui, nos concentramos em vários dos mais usados.
Prefácio
Devido às necessidades do projeto, fiz minha própria demonstração e aprendi muito com ele. Então eu compartilhei. Espero que aqueles que têm essa necessidade evitem desvios. Existem muitos tutoriais on -line sobre como instalar o OpenCV. Não vou explicar em detalhes aqui. Eu instalei OpenCV-3.3.0
Conforme mostrado na figura acima, encontre o pacote JAR correspondente. Aqui vamos falar sobre como importar esse frasco para o repositório Maven
mvn install: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 -DcreateChecksum=true
<PuerpId> com.suibian </foupiD> <TRAFACTID> OpenCV-300 </stifactId> <versão> 3.3.0 </versão>
Ok, para que o Java possa operar o OpenCV através deste frasco. Vamos dar uma olhada. Claro, você pode pensar assim, o que significa que você é muito simples. Vamos dar uma olhada na comparação entre o caminho em incluir no OpenCV e o pacote em jar
Haha, não há costura-chave para mapas panorâmicos, e o 2015 orientado a Java não foi atualizado desde então. Não há classe -chave para sintetizar mapas panorâmicos (tolos), como mostrado na figura a seguir, mas C ++ me fornece com
Então, o que fazer? Como usar o Java para chamar o código C ++. Sabemos que, ao lidar com o sistema operacional, o C/C ++ é sem dúvida mais adequado que o Java. A maioria das aplicações do processamento de gráficos OpenCV é desenvolvida em C ++. Todo mundo está familiarizado com a palavra -chave nativa, mas queremos clicar e ver como ela é implementada, mas não podemos clicar porque não está escrito em Java. Pode ser C/C ++. O nativo corresponde aos arquivos xxx.dll no diretório do bin no JRE em Java. Para que possamos embalar o código C ++ que queremos usar em um arquivo de formato DLL e colocá -lo no diretório do bin. Obviamente, isso envolve os parâmetros e os valores de retorno do método. Sem dizer muito, instale o Visual Studio 2017, instale tutoriais e muitos tutoriais on -line
Clique em Arquivo-> Novo-> Project ---> Windows Desktop-> Dynamic Link Library (DLL), para que o projeto seja criado com sucesso. Em seguida, adicione o código
Este é o código C ++ para síntese de imagem panorâmica
#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;using 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("D:/quanjingtu/hh/1.jpg"); 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 << "Não é possível ler a imagem" << endl; retornar -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); // Use a função de ponto para rejeitar o tapete de emenda; Stitcher :: status status = stitcher.stitch (imgs, pano); imwrite (resultado_name, pano); Mat pano2 = pano.clone (); // exibe a imagem de origem e a imagem do resultado // imshow ("imagem panomic", pano); if (waitKey () == 27) retornar 0; // imwrite (resultado_name, pano);}Então, como o Java interage com C ++? Através da tecnologia JNI em Java
Vamos entender JNI em Java
Interface nativa de Java (JNI para curta), o Java é um idioma de plataforma cruzada e, às vezes, o código local precisa ser chamado. A Sun fornece uma interface JNI, que se chama com o código local do sistema operacional. A figura a seguir mostra o princípio de chamada de nativo em Java
Os meridianos estão todos claros, então vamos começar
classe pública OpenEncvutil {static {// O System.load aqui é usado para carregar a biblioteca de links dinâmicos gerada por C ++. De fato, você pode decidir que não é necessariamente estático. System.LoadLibrary ("OpenCvutil"); } public static nativo string changearrValue (string str); public static void main (string [] args) lança UnsupportEdEncodingException {String base = "d:/quanjingtu/gg"+"/"; int length = 5; String url = ""; for (int i = 1; i <= comprimento; 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); ; }}Defina o método nativo e compilar o arquivo java no arquivo .class
Digite a janela de comando CMD, abra o diretório de arquivo de classe compilado correspondente e execute o comando javah
Gerar o correspondente com_lianxi_securitytest_opencv_opencvutil.h arquivo
#include <JNI.H>/ * Cabeçalho para classe com_lianxi_securitytest_opencv_opencvutil */#ifndef _included_com_lianxi_securityTest_opencv_opencvutil#Define _included_com_lianxi_s. __cplusplusextern "c" {#endif/ * * class: com_lianxi_securitytest_opencv_opencvutil * método: changearrvalue * assinatura: (ljava/lang/string;) ljava/lang/string; */Jniexport jString jnicall java_com_lianxi_securitytest_opencv_opencvutil_changearrvalue (jnienv *, jclass, jstring);#ifdef __cplusplus}#endif#endifSomente o método nativo é processado, copie o arquivo para a localização do projeto VS 2017
#include <tencv2/OpenCV.hpp> #include <Vector> #include <string> usando o namespace std; usando namespace cv; bool try_use_gpu = false; vector <mat> imgs; string result_name = "d: /result.jpg"; jniexport jstring jnnicll Java_com_lianxi_securitytest_opencv_opencvutil_changearrValue (jnienv * Env, jclass obj, jstring prompt) {// Esta é a string recebida, vários caminhos const char * str; ///500 Stitcher Stitcher = Stitcher :: CreateDefault (try_use_gpu); // use a função de ponto para unir o tapete de tapa; Stitcher :: status status = stitcher.stitch (imgs, pano); imwrite (resultado_name, pano); Mat pano2 = pano.clone (); // exibe a imagem de origem e a imagem do resultado // imShow ("Panogue Image", Pano); if (waitKey () == 27) if (status! = stitcher :: ok) {return Env-> Newstringutf ("Falha na imagem !!!"); } // return Env-> Newstringutf (resultado_name.c_str); String Newsstr = "Sucesso da imagem !!! url =" + resultado_name; Retornar EnvO acima é o código C ++ correspondente
Clique em Gerate ---> Regenerar a solução para gerar o arquivo DLL correspondente e depois colocá-lo no diretório JDK JRE/BIN
Execute o programa Java, o resultado é o seguinte
Dê uma olhada na visão panorâmica sintética
Resumir
O acima é o conteúdo inteiro deste artigo. Espero que o conteúdo deste artigo tenha certo valor de referência para o estudo ou trabalho de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar. Obrigado pelo seu apoio ao wulin.com.