パノラマの概要
画像投影は、平面画像が湾曲した表面にマッピングされるたびに発生し、その逆も同様です。これは、パノラマ写真で特に一般的です。たとえば、地球の球体は平らな紙にマッピングできます。私たちの周りの視野全体は球体の表面と見なすことができるため(すべての観測角度に対して)、写真印刷のために球を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 -dversion = 3.3.0 -dpackaging = jar -dgenerepom = true -dcreatechecksum = true
<GroupId> com.suibian </groupId> <Artifactid> opencv-300 </artifactid> <バージョン> 3.3.0 </version>
さて、Javaはこのjarを介してOpenCVを操作できます。見てみましょう。もちろん、あなたはこのように考えることができます。つまり、あなたは非常に単純です。 OpenCVに含まれるパスとJARのパッケージの比較を見てみましょう
ははは、パノラママップの重要なステッチはありません。それ以来、Java指向の2015年は更新されていません。次の図に示すように、パノラママップ(愚か者)を合成するための重要なクラスはありませんが、C ++は私に提供します
では、何をすべきか? Javaを使用してC ++コードを呼び出す方法。オペレーティングシステムを扱うとき、C/C ++は間違いなくJavaよりも適切であることを知っています。 OPENCVグラフィックス処理のアプリケーションのほとんどは、C ++で開発されています。誰もがネイティブキーワードに精通していますが、クリックして実装方法を確認したいのですが、Javaで書かれていないためクリックできません。 C/C ++である可能性があります。ネイティブは、JavaのJREの下のBinディレクトリのxxx.dllファイルに対応しています。したがって、使用するC ++コードをDLL形式ファイルにパッケージ化し、BINディレクトリに配置できます。もちろん、これにはメソッドのパラメーターと戻り値が含まれます。あまり言わずに、Visual Studio 2017をインストールし、チュートリアルや多くのオンラインチュートリアルをインストールします
[ファイル - > [new]]をクリックします - > [プロジェクト] - > Windowsデスクトップ - > 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.hpp> namespace std; namespace cvを使用して、bool try_use_gpu = false; vector <mat> imgs; string result_name = "d:/result1.jpg"; int _tmain(int argc、char * argv []){mat impg1 = img1 = dimread( " 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 << "image" << endl; return -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); //スプライシングマットパノにステッチ関数を使用します。ステッチャー::ステータスステータス= stitcher.stitch(imgs、パノ); imwrite(result_name、パノ); MAT PANO2 = PANO.CLONE(); //ソース画像と結果画像を表示// imshow( "Panomic Image"、Pano); if(waitkey()== 27)0を返します。 // imwrite(result_name、pano);}では、JavaはC ++とどのように相互作用しますか? JavaのJNIテクノロジーを通じて
JavaのJNIを理解しましょう
Javaネイティブインターフェイス(略してJNI)、Javaはクロスプラットフォーム言語であり、ローカルコードを呼び出す必要がある場合があります。 SunはJNIインターフェイスを提供します。これは、オペレーティングシステムのローカルコードを互いに呼び出します。次の図は、Javaのネイティブの呼び出し原則を示しています
子午線はすべて明確ですので、始めましょう
public class opencvutil {static {// System.loadは、C ++で生成された動的リンクライブラリをロードするために使用されます。実際、必ずしも静的ではないと判断できます。 System.LoadLibrary( "OpenCVutil"); } public static native string changearrvalue(string str); public static void main(string [] args)throws unsupportedencodingexception {string base = "d:/quanjingtu/gg"+"/"; int length = 5;文字列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_securitytest_opentv_opentvutvutvutvutvutvutvutvutvutvutimediededecvutil "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}ネイティブメソッドのみが処理され、ファイルをVS 2017プロジェクトの場所にコピーします
#include "stdafx.h" #include "com_lianxi_securitytest_opencv_opencvutil.h" #include <iostream> #include <opencv2/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/opencv> #include <vector> #include <string> namespace std;を使用してnamepace cv; bool_use_use_use_gpu = false; vector <mat> imgs; string result.jpport.jpgg "; java_com_lianxi_securitytest_opencv_opencvutil_changearrvalue(jnienv * env、jclass obj、jstring prompt){//これは受信した文字列、char * str; //.................................................................................. stitcher stitcher = stitcher :: createdefault(try_use_gpu); //ステッチ関数を使用してマットパノをスプライスします。ステッチャー::ステータスステータス= stitcher.stitch(imgs、パノ); imwrite(result_name、パノ); MAT PANO2 = PANO.CLONE(); //ソース画像と結果画像を表示// imshow( "Panogue Image"、Pano); if(waitkey()== 27)if(status!= stitcher :: ok){return env-> newstringutf( "picture fails !!!"); } // return env-> newstringutf(result_name.c_str); string newsstr = "picture success !!! url =" + result_name; return env-> newstringutf(const_cast <char*>(newtr.c_str());}上記は、対応するC ++コードです
[生成]をクリックします--->ソリューションを再生して対応するDLLファイルを生成し、JDK JRE/BINディレクトリに配置します
Javaプログラムを実行すると、結果は次のとおりです
合成パノラマビューをご覧ください
要約します
上記は、この記事のコンテンツ全体です。この記事の内容には、すべての人の研究や仕事に特定の参照値があることを願っています。ご質問がある場合は、メッセージを残してコミュニケーションをとることができます。 wulin.comへのご支援ありがとうございます。