2016-10-09 11 views
1

環境を構築するためにSLAMを使用しています。私はLidarセンサーでこれを行い、それは非常にクールな作業です。今、私は.tiff形式の環境のマップを持っています。ポイントAからポイントBまでの最短経路(Dijkstra)を探したいのですが、私の問題はこの.tiffマップをどのように変換できるのか分かりません。私はC++でコード化します。.tiffマップで最短パスを取得

私はこれをどのように行うことができるのでしょうか?

感謝:)

編集:

mapはこのようになります。黒いピクセルは障害物で、灰色のピクセルは移動するスペースです。

+0

正確にこのTIFF画像の内容は何ですか?あなたは例を投稿できますか? – qxz

+0

私の答えは、または他の人があなたの問題を整理しましたか?もしそうなら、それをあなたの答えとして受け入れることを検討してください - 投票数の横にある緑色のチェックマーク/チェックマークをクリックしてください。そうでない場合は、私が、または他の誰かがあなたをさらに助けることができるように、何がうまくいかないと言ってください。ありがとう。 http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 –

+0

ありがとうございます。申し訳ありませんが、私はこのコミュニティでは新しく、まだすべてのルールを知っていません。 –

答えて

0

、あなたがあなたのデータをディドルを許可されている場合「飛行前」、あなたは非常に簡単なPGMファイルにあなたのTIFFファイルを変換するために、ImageMagickのを使用することができます。 ImageMagickは、ほとんどのLinuxディストリビューションにインストールされ、OSXおよびWindowsで使用できます。

PGMフォーマットは非常に簡単で、hereと記載されています。あなたのイメージが400×300であるとして、それは次のようになります。

P5 
400 300 
255 
120,000 unsigned char bytes of image data - uncompressed, unpadded 

あなたはこのようなあなたのTIFFファイルに変換します:

convert map.tif -normalize -threshold 1 map.pgm 

をして、あなたは、ヘッダーの3行を読み取ることができ、その後、直接自分の120,000読みますバイトを配列に格納します。これにより、プラットフォーム上に余分なライブラリやソフトウェアが必要なくなります。

enter image description here

1

CImg - link hereをお勧めします。それは"ヘッダのみ"として実装されているので、C++で非常に軽量で使いやすいので、ただ一つのファイルCImg.hをダウンロードしてインクルードするだけです。

このコードは、あなたのTIFマップを読んで、あなたはピクセルにアクセスできるようになります:

#include <iostream> 
#include "CImg.h" 
using namespace std; 
using namespace cimg_library; 

int main(int argc, char** const argv) 
{ 
    // Load the map 
    CImg<unsigned char> map("map.tif"); 

    // Get and print its dimensions 
    int w = map.width(); 
    int h = map.height(); 
    cout << "Dimensions: " << w << "x" << h << endl; 

    // Iterate over all pixels displaying their RGB values 
    for (int r = 0; r < h; r++){ 
     for (int c = 0; c < w; c++){ 
     cout << r << "," << c << "=" << (int)map(c,r,0,0) << "/" << (int)map(c,r,0,1) << "/" << (int)map(c,r,0,2) << endl; 
     } 
    } 
    return 0; 
} 

サンプル出力

Dimensions: 400x300 
0,0=94/94/94 
0,1=100/100/100 
0,2=88/88/88 
0,3=89/89/89 
0,4=89/89/89 
0,5=89/89/89 
0,6=89/89/89 
0,7=89/89/89 
0,8=89/89/89 
0,9=89/89/89 
0,10=89/89/89 
0,11=89/89/89 
0,12=89/89/89 
0,13=89/89/89 
0,14=89/89/89 
0,15=93/93/93 
0,16=101/101/101 
.... 
.... 

は(ビルトインサポート含めるには、このようなあなたのコンパイルフラグを設定します。 ImageMagickなし):

g++ -Dcimg_use_tiff ... -ltiff 

lib tiffがインストールされている必要があります。

カラーに興味がない場合は、イメージを白黒に変換して、3つではなく1つのチャンネルにすることができます。スレッショルドでは、純粋な黒と純粋な白があり、扱いやすくなりますと。誰もが知っている場合、タグを付けて下さい -

// Convert to single channel black and white 
CImg<unsigned char> bw = map.get_RGBtoYCbCr().channel(0); 
bw.normalize(0,255).threshold(1).normalize(0,255); 

// Now get pointer to black and white pixels, or use bw(x,y,0) 
unsigned char* data=bw.data(); 

bw.save_png("result.png"); 

enter image description here

ありCImgdijkstra方法は、実際のですが、私は、現時点ではそれを使用する方法を考え出すことはできません。ただ、上記のコードの最後にこのコードを追加します。私のコメントで私!ありがとう。代替案として

+0

素晴らしい例で、CImgについて知っておきましょう。 –

+0

@BruceDeanありがとう、親切な先生! –

関連する問題