MATLAB を使用して 2D 画像から 3D 立体視画像を作成するにはどうすればよいですか?
2 に答える
私があなたの質問を誤解しているか (人々はすでに明確ではないことを指摘しています)、または 3D ビジョンの仕組みを誤解しています。「3Dグラスを使って2D映像を見る」ことはありません。3D ビジョンは、2 つの異なる画像 (左画像と右画像) をそれぞれ左目と右目に提供することによって実現されます。基本的なレベルでは、MATLAB はそれとは何の関係もありません。
したがって、簡単に理解できる、または首尾一貫した質問がない場合、私ができる最善のことは、次のようなものが必要であると想定することです。単一の2D画像がありますが、それでも「3D画像形式で見たい」. その場合、その 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 赤シアン メガネを持っていません。しかし、少なくとも理論上は、そうすべきだと思われます。私が間違いを犯した場合、誰かが私を訂正できるかもしれません。
わずかに異なる視点から撮影された 2 つの画像がある場合、これははるかに簡単に行うことができます。2 つの画像を修正することで、ステレオ アナグリフを作成できます。関連する関数はestimateUncalibratedRectifiation
、stereoAnaglyph
Computer Vision System Toolbox にあります。キャリブレーションされていないステレオ イメージの修正の例を参照してください。
または、 Stereo Camera Calibrator アプリを使用してカメラを調整し、関数を使用することもできrecifyStereoImages
ます。ステレオ キャリブレーションとシーンの再構築を参照してください。