파노라마 개요
이미지 투영은 평면 이미지가 곡선 표면에 매핑 될 때마다 발생하며, 그 반대도마다 파노라마 사진에서 일반적입니다. 예를 들어, 지구의 구는 평평한 종이에 매핑 될 수 있습니다. 우리 주변의 전체 시야는 구의 표면 (모든 관찰 각도에 대해)으로 간주 될 수 있으므로, 구체를 2D 평면으로 투사 할 수있는 방법이 필요합니다.
작은 관점은 평평한 종이에 변형되고 투사하기가 비교적 쉽습니다. 그러나 구형 이미지를 평면에 매핑하려고 할 때 일부 변형이 불가피합니다. 따라서, 각 유형의 투영은 다른 유형의 왜곡을 희생시키면서 한 가지 유형의 왜곡을 피하려고 시도합니다. 시야의 필드가 증가함에 따라 시야 아크가 더욱 구부러져서 파노라마 투영 유형의 차이가 더욱 중요 해집니다. 어떤 투영을 사용 해야하는지 각 프로젝션 응용 프로그램에 크게 의존합니다. 여기서 우리는 가장 일반적으로 사용되는 몇 가지에 중점을 둡니다.
머리말
프로젝트 요구로 인해 나는 나만의 데모를 만들고 많은 것을 배웠습니다. 그래서 나는 그것을 공유했다. 이 필요가있는 사람들이 우회를 피할 수 있기를 바랍니다. 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 -dgeneratepom = true -dcreateChececcsum = true
<groupid> com.suibian </groupid> <artifactid> opencv-300 </artifactid> <bersion> 3.3.0 </version>
자, 자바는이 항아리를 통해 OpenCV를 작동시킬 수 있습니다. 봅시다. 물론, 당신은 이렇게 생각할 수 있습니다. 이것은 당신이 매우 간단하다는 것을 의미합니다. OpenCV에 포함 된 경로와 JAR의 패키지 간의 비교를 살펴 보겠습니다.
하하, 파노라마 맵에 대한 키 스티치는 없으며 Java 지향 2015는 그 이후로 업데이트되지 않았습니다. 다음 그림과 같이 파노라마 맵 (Fools)을 합성하기위한 주요 클래스는 없지만 C ++는 나에게 제공합니다.
그래서 무엇을해야합니까? Java를 사용하여 C ++ 코드를 호출하는 방법. 우리는 운영 체제를 다룰 때 C/C ++가 의심 할 여지없이 Java보다 더 적합하다는 것을 알고 있습니다. OpenCV 그래픽 처리의 대부분의 응용 프로그램은 C ++로 개발되었습니다. 모든 사람은 기본 키워드에 익숙하지만 클릭하여 구현 방법을보고 싶습니다. 그러나 Java로 작성되지 않기 때문에 클릭 할 수 없습니다. C/C ++ 일 수 있습니다. Native는 JVA의 JRE 아래에 빈 디렉토리의 xxx.dll 파일에 해당합니다. 따라서 사용하려는 C ++ 코드를 DLL 형식 파일로 패키지하여 BIN 디렉토리에 넣을 수 있습니다. 물론 여기에는 메소드의 매개 변수와 리턴 값이 포함됩니다. 많은 말을하지 않고 Visual Studio 2017을 설치하고 자습서 및 많은 온라인 자습서를 설치하십시오.
파일-> new-> project ---> Windows Desktop-> Dynamic Link Library (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.hp> #incp> #includ <opencv2/opencv.hpp> 네임 스페이스 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.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 << "이미지를 읽을 수 없음"<< 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); // 스 플라이 싱 MAT PANO에 스티치 함수를 사용합니다. 스티치 :: 상태 상태 = 스티치 (Stitcher.stitch) (IMGS, PANO); imwrite (result_name, pano); mat pano2 = pano.clone (); // 소스 이미지와 결과 이미지 표시 // Imshow ( "Panomic Image", Pano); if (waitkey () == 27) 반환 0; // imwrite (result_name, pano);}그렇다면 Java는 C ++와 어떻게 상호 작용합니까? Java의 JNI 기술을 통해
Java의 JNI를 이해합시다
Java Native Interface (JNI), Java는 크로스 플랫폼 언어이며 때로는 로컬 코드를 호출해야합니다. Sun은 운영 체제 로컬 코드로 서로 호출하는 JNI 인터페이스를 제공합니다. 다음 그림은 자바에서 원주민의 부름 원리를 보여줍니다.
자오선은 모두 분명하므로 시작하겠습니다
공개 클래스 opencvutil {static {// System.Load는 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; 문자열 url = ""; for (int i = 1; i <= 길이; 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 (임시); ; }}기본 메소드 정의 및 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_lianxi_sectest_opencv_opencv_opentil#ifdef#ifdef#opencvutil __cplusplusextern "c"{#endif/ * * 클래스 : com_lianxi_securitytest_opencv_opencvutil * method : 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.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/opencv.hpp> #include <vector> #include <string> 네임 스페이스 std 사용; 네임 스페이스 cv; bool try_use_gpu = false; vector <mat> imgs; String result_name = "d : /result. java_com_lianxi_securitytest_opencv_opencvutil_changearrvalue (jnienv * env, jclass obj, jstring 프롬프트) {// 이것은 수신 된 문자열, 여러 경로 const char * str; // imgs.push_back (img6); Stitcher Stitcher = Stitcher :: createFault (try_use_gpu); // 스티치 함수를 사용하여 매트 파노를 스플 라이스; 스티치 :: 상태 상태 = 스티치 (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); 문자열 newsstr = "사진 성공 !!! url =" + result_name; return env-> newstringutf (const_cast <char*> (Newstr.c_str ());}위는 해당 C ++ 코드입니다
생성 ---> 솔루션을 재생하여 해당 DLL 파일을 생성 한 다음 JDK JRE/BIN 디렉토리에 넣습니다.
Java 프로그램을 실행하면 결과는 다음과 같습니다
합성 파노라마보기를 살펴보십시오
요약
위는이 기사의 전체 내용입니다. 이 기사의 내용에 모든 사람의 연구 나 작업에 대한 특정 참조 가치가 있기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다. Wulin.com을 지원 해주셔서 감사합니다.