2016-05-04 21 views
1

私の仕事では、雲の各XYZポイントのz座標が灰色の陰影を表すことを意味するグレースケール(深度)画像に点群を変換する必要があります。その行うと3D点群を奥行き画像に変換するにはどうすればいいですか?

float map(float x, float in_min, float in_max, float out_min, float out_max) { return (x - in_min) * (out_max - out_min)/(in_max - in_min) + out_min; }

私は結果を記述する必要があり:Zから座標をマッピングするための[z_min、z_max] [0 255]間隔に間隔Iはアルドゥイーノのマップ機能を使用しました問題は、私が持っている雲が何百万というポイントを持つことができるということなので、画像を1つずつ順番に書き込むことはできません。 3000x1000の順序付けされたXYポイントがあるとします。それらを700x300ピクセルの画像に書きたい場合はどうすればよいですか?私はその質問が明確であることを願っています。

+0

たぶんだけ座標を拡張し、複数のポイントが1つのピクセル上にある場合はグレースケール値を追加しますか? –

+0

こんにちは、私もそれを念頭に置きましたが、これを考慮しましょう。1つの雲列は3600ポイントに等しく、1つの画像行は1680ピクセルに等しい。結果はピクセルあたり2.41ポイントになります。私はちょうど1ピクセルにつき2ポイントで行き、占められていないピクセルを0で埋めるのですか? –

+0

ポイントクラウドが密集しているかどうかは不明です。つまり、複数の点が同じピクセルにある場合、それらをラスタライズする場合と同じように、最も近いもののz値を取ることになります。ですから、この作業を手作業でやりたくない場合は、ポイントを送信してOpenGLと言ってラスタライズしてから、深度バッファを読んでください。 – masterxilo

答えて

0

私は私の問題の解決方法を見つけることができました。これは、スタックオーバーフローのためのフェアリー長いアルゴリズムですが、私と一緒に耐える。このアイデアは、pgmファイルとしてXYグレースケールポイントのベクトルを書いています。

ステップ1:cloud_to_greyscale - XYグレースケール点のベクターXYZポイントクラウドを変換し、それをパラメータとしてcloudを受信する機能:

for each point pt in cloud 
    point_xy_greyscale.x <- pt.x 
    point_xy_greyscale.y <- pt.y 
    point_xy_greyscale.greyscale <- map(pt.z, z_min, z_max, 0, 255) 
    greyscale_vector.add(point_xy_greyscale) 
loop 

return greyscale_vector 

ステップ2:greyscale_to_image - 以前に返されたベクトルをgreyscale_imagewidthheight、のクラスに書き込む関数メンバーは通常unsigned shortの二次元配列に対応します。ファンクションは、(画像に変換される)とxポイント座標が浮動小数点(配列インデックスとしては不適切)であることを知り、xピクセル座標を区切るのに役立つx_epsilonのパラメータを受け取ります。 。

少し背景情報:私は私の3D空間xになるよう雲widop と呼ばれるものに取り組むydepthで、zheightで、widthです。また、私の問題では、画像のheightは見つけやすいです:y_max - y_minですyintegerであるという事実です。画像のwidthを見つけるには、以下のアルゴリズムに従ってください。明確でない場合は、私は質問に答えて、私は提案についています。

img_width <- 0; // image width 
img_height <- y_max - y_min + 1 // image height 

// determining image width 
for each point greyscale_xy_point in greyscale_vector 
    point_x_cell <- (pt.x - x_min) * x_epsilon * 10 

    if point_x_cell > img_width 
     img_width <- point_x_cell + 1 
loop 

// defining and initializing image with the calculated height and width 
greyscale_img(img_width, img_height) 

// initializing greyscale image points 
for y <- 0 to greyscale_img.height 
    for x <- 0 to greyscale_img.width 
     greyscale_img[y][x] = 0 
    loop 
loop 

// filling image with vector data 
for each point point_xy_greyscale in greyscale_vector 
    image_x = (point_xy_greyscale.x - x_min) * x_epsilon * 10 
    image_y = point_xy_greyscale.y - y_min 

    greyscale_image[image_y][image_x] = point_xy_greyscale.greyscale 
loop 

return greyscale_image 

唯一のことはやって左ファイルにイメージを書き込むことですが、それを行うのは簡単です、あなただけのPGM形式に関連する以前のリンクでの書式ルールを見つけることができます。私はこれが誰かを助けることを望む。

EDIT_1:結果の画像を追加しました。それは鉄道であると考えられており、かなり暗い理由は、背の高い物がいくつかあり、地面の物体が暗くなっているからです。

depth image of railway

+0

答えにあなたのマップ関数は何ですか? – Ehsan

関連する問題