画像ツールを使用してMatlabを使用して3D Streososcopic画像を作成する方法は?
-
12-10-2019 - |
質問
MATLABを使用して2D画像から3Dステレオスコピック画像を作成するにはどうすればよいですか?
解決
私はあなたの質問を誤解している(人々はそれが明確ではないことをすでに指摘している)か、あなたは3Dビジョンの仕組みを誤解している。 「3D Glassを使用して2D画像を表示する」ことはありません。 3Dビジョンは、それぞれ左目と右目に左の画像と右目に2つの異なる画像を提供することで達成されます。基本レベルでは、Matlabはそれとは何の関係もありません。
だから、簡単に理解できるか一貫性のある質問がない場合、私ができる最善のことはあなたがのようなものが欲しいと仮定することです これ: :あなたは単一の2D画像を持っていますが、それでも「3D画像形式に見られる」ことを望んでいます。その場合、その単一の画像を何らかの形で2つの新しい画像に分割する必要があります。
- 左目の左画像
- 右目の右の画像
これは些細なことではありません。一般的に、あなたは最初から始めます 深さを推測します 2D画像の各ピクセルの。深さ情報を「推測」しているため、2つの新しい画像は3Dシーンの完全な表現ではありません。
次に、その深さ情報を使用して画像をレイヤーに分離します。それは本質的に子供向けの本からのポップアップの切り抜きのように見えます:
より多くのレイヤーを思い付くことができ、深さの推定がより正確であるほど、3D表現はより現実的になります。
最後に、その層状表現を2つの異なる位置から2Dに戻って投影します - 1つは左目と右目のために。これにより、必要な2つの異なる画像が表示されます。
編集
二番目 ビデオ あなたはそれを説明するためにリンクしました 簡素化 一般的にAとして知られているものの作成 アナグリフ画像. 。 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
コンピュータービジョンシステムツールボックス。を参照してください 非調整ステレオ画像修正 例。
または、カメラを使用してカメラを校正することもできます ステレオカメラキャリブレーターアプリ, 、次に使用します recifyStereoImages
働き。を参照してください ステレオキャリブレーションとシーンの再構築.