2011-01-18 11 views
5

MATLABを使用して2D画像から3D立体画像を作成するにはどうすればよいですか?イメージツールを使用してMATLABを使用して3Dストロス画像を作成する方法は?

+3

質問は何ですか?何を試しましたか? – carlosdc

+1

3Dデータがあれば作成する方が簡単だと思います。なぜなら、必要なのは、異なる画角で2つの投影を作成するだけだからです。 –

+0

@carlosdc @Itamar Katz:3Dガラスを使って2D画像を見たいのであれば、3D画像フォーマットに見えます。それとも他の方法でも3次元で見ることができますか? –

答えて

11

私はあなたの質問を誤解しています(人々は既にそれが明らかではないことを指摘しています)か、3Dビジョンの仕組みを誤解しています。 「3Dガラスを使って2D画像を見る」ことはできません。 3D視覚は、左画像および右画像の2つの異なる画像をそれぞれ左眼および右眼に提供することによって達成される。基本的なレベルでは、MATLABには何も関係ありません。

わかりやすくまとまった質問がなければ、できるだけthisのようなものが必要だと思うのです。あなたは1つの2D画像を持っていますが、まだ「3D画像フォーマットを見たい」と思っています。その場合、あなたは何とか2枚の新しい画像にその単一の画像を分割する必要があります。

  1. 左画像を左目用の
  2. 右画像を右目これは簡単ではありません

ため。一般に、2D画像の各ピクセルのinferring the depthから開始します。深度情報を「推測」しているので、2つの新しい画像は3Dシーンを完全に表現することはできません。

次に、その奥行き情報を使用して画像をレイヤーに分割します。それは本質的に子どもの本からポップアップの切り欠きのようになります。

alt text

以上の層は、あなたが思い付くことができ、より正確なあなたの奥行き推定は、より現実的なあなたの3D表現が可能になります。

最後に、レイヤーされた表現を、2つの異なる位置(左目用と右目用)から2Dに投影します。これにより、必要な2つの異なるイメージが得られます。

EDITあなたは、一般的にanaglyph imageとして知られているものの簡素化作成方法を説明するためにリンクされ

video。 3Dレッドシアンのメガネが必要です。ではなく、で、ほとんどの3D劇場で使用されている偏光メガネです。私がで簡略化したと言う理由は、前景と背景を区別しないからです。

フォアグラウンドをバックグラウンドから分離してフォアグラウンドにのみ適用します。これは、通常、背景が無限の深さを持ち、モノラルからステレオビジョンに移行するときに変化しないためです。ピアノの場合、すべてが多かれ少なかれフォアグラウンドなので、アプローチは機能します。ビデオで説明

アルゴリズムは次のとおりです。二つの画像、im1im2

  • スタート。それらは同一です
  • im1の緑と青のチャネルをゼロに設定します。これで赤のイメージが作成されます
  • im2の赤のチャネルをゼロに設定します。これにより、シアンの画像が作成されます。
  • im1が左側にあり、右側にim2があるように、指定された量だけ(対象の深度に応じて)2つの画像をオフセットします。 3Dレッドシアンのメガネは左側が赤、右側がシアンなので、この注文を正しく取得する必要があります。
  • シフトされた2つの画像を要素ごとに加算します。チャネルが飽和しないことに注意してください。

は、ここで私が書いたいくつかのPython/OpenCVのコードです:

import cv 
SHIFT=8 

if __name__ == '__main__': 
    import sys 
    _, fname = sys.argv 
    im = cv.LoadImage(fname) 

    size = cv.GetSize(im) 
    width, height = size 
    left = cv.CreateImage(size, im.depth, im.nChannels) 
    right = cv.CreateImage(size, im.depth, im.nChannels) 
    anaglyph = cv.CreateImage((width - SHIFT, height), im.depth, im.nChannels) 

    # 
    # This would be easier if we had COI support for cv.Set, but it doesn't 
    # work that way. 
    # OpenCV uses BGR order (even if input image is greyscale): 
    # http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html 
    # red goes on the left, cyan on the right: 
    # http://en.wikipedia.org/wiki/Anaglyph_image 
    # 
    b = cv.CreateImage(size, im.depth, 1) 
    g = cv.CreateImage(size, im.depth, 1) 
    r = cv.CreateImage(size, im.depth, 1) 
    cv.Split(im, b, g, r, None) 

    zeros = cv.CreateImage(size, r.depth, 1) 
    cv.Merge(zeros, zeros, r, None, left) 
    cv.Merge(b, g, zeros, None, right) 

    # 
    # cvRect is (x, y, width, height) and it MUST be a tuple, not a list 
    # 
    cv.SetImageROI(left, (SHIFT, 0, width - SHIFT, height)) 
    cv.SetImageROI(right, (0,  0, width - SHIFT, height)) 
    cv.Add(left, right, anaglyph, None) 

    cv.SaveImage('anaglyph.jpeg', anaglyph) 

ここで同様の画像が動画で使われているものにです:

alt text

ここでは出力です:

alt text

残念ながら、私は3D赤色シアンのメガネを持っていないので、これが動作することを確認できません。しかし、それは少なくとも理論的にはそうすべきだと思われる。もし私が間違いをしたら、誰かが私を訂正するかもしれない。

+0

ありがとう@misha ..しかし、私はビデオリンクhttp://www.youtube.com/watch?v=3r4M_KHt6aw、http://www.youtube.com/watch?v=g_JRHtHpuSY、http ://www.youtube.com/watch?v = zdXxS2KHXloのように.. - Abhiに感謝します。 –

+1

基本的に、最初のリンクは私が何をしたかを説明しました。深度マップを計算し、2番目の画像を作成します。実際の変位フィルターの実装についてはわかりません。 2番目のリンクは、ステレオイメージではなく、疑似3D効果を実現するだけの関連性はありません。これがあなたの望むものであれば、実装するのはかなり簡単です。子供がビデオで言っていたとおりに正確に行います。私は後で3番目のビデオを見るかもしれない - それは少し長いです、そして、ここに遅れています。関連するリンクを元の質問に入れて、あなたが望むものを明白にします。 – misha

+0

ありがとう@mishaはいあなたが得る。私は2D画像から擬似3D効果を追加したい。私はビデオリンクごとにシンプルな3D効果を実現します。あなたがそれについてのコードを持っているなら、私に返信してください。 - Abhi –

0

これは、わずかに異なる視点から2つの画像を撮影した場合、はるかに簡単です。 2つの画像を整流することでステレオアナグリフを作成できます。関連する機能は、Computer Vision System ToolboxのestimateUncalibratedRectifiationstereoAnaglyphです。 Uncalibrated Stereo Image Rectificationの例を参照してください。

また、Stereo Camera Calibrator appを使用してカメラを調整してからrecifyStereoImages機能を使用することもできます。 Stereo Calibration and Scene Reconstructionを参照してください。

+0

あなたの答えをありがとう..私たちが1つの画像しか持っていないなら、我々は立体画像を作ることができますか? –

関連する問題