5

MATLAB を使用して 2D 画像から 3D 立体視画像を作成するにはどうすればよいですか?

4

2 に答える 2

11

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

したがって、簡単に理解できる、または首尾一貫した質問がない場合、私ができる最善のことは、次のようなものが必要であると想定することです単一の2D画像がありますが、それでも「3D画像形式で見たい」. その場合、その 1 つの画像を何らかの方法で 2 つの新しい画像に分割する必要があります。

  1. 左目の左画像
  2. 右目用右画像

これは簡単なことではありません。通常、2D 画像の各ピクセルの深度を推測することから始めます。深度情報を「推測」しているため、2 つの新しい画像は 3D シーンの完全な表現にはなりません。

次に、その深度情報を使用して画像をレイヤーに分離します。基本的に、子供向けの本のポップアップの切り抜きのように見えます。

代替テキスト

より多くのレイヤーを作成し、深度推定がより正確になればなるほど、3D 表現はよりリアルになります。

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

編集

リンク先の 2 番目のビデオでは、一般にアナグリフ イメージとして知られているものの簡単な作成について説明しています。3D 赤シアン メガネが必要です。これらは、現在ほとんどの 3D シアターで使用されている偏光メガネではありません。私が簡略化したと言う理由は、前景と背景を区別しないからです。

最良の効果を得るには、前景を背景から分離し、アプローチを前景にのみ適用します。これは、通常、背景には無限の奥行きがあり、モノラル ビジョンからステレオ ビジョンに移行しても変化しないためです。ピアノの場合、すべてが多かれ少なかれ前景にあるため、このアプローチは機能します。

ビデオで説明されているアルゴリズムは次のとおりです。

  • 2 つの画像から始めim1ますim2。それらは同一です
  • 緑と青のチャネルim1をゼロに設定します。これにより、赤い画像が作成されます
  • の赤チャンネルim2をゼロに設定します。これにより、シアンの画像が作成されます。
  • 2 つの画像を指定された量 (被写体までの深度に応じて) オフセットim1し、左側とim2右側に配置します。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)

ビデオで使用されているものと同様の画像を次に示します。

代替テキスト

出力は次のとおりです。

代替テキスト

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

于 2011-01-18T12:58:24.653 に答える
0

わずかに異なる視点から撮影された 2 つの画像がある場合、これははるかに簡単に行うことができます。2 つの画像を修正することで、ステレオ アナグリフを作成できます。関連する関数はestimateUncalibratedRectifiationstereoAnaglyphComputer Vision System Toolbox にあります。キャリブレーションされていないステレオ イメージの修正の例を参照してください。

または、 Stereo Camera Calibrator アプリを使用してカメラを調整し、関数を使用することもできrecifyStereoImagesます。ステレオ キャリブレーションとシーンの再構築を参照してください。

于 2015-01-03T03:12:46.713 に答える