凸凹写真(仮)の記事の続きです。
今度は、実写のステレオ写真(右目、左目用の写真がペアになったもの)から、奥行きデータを作成、凸凹写真(仮)にしてみました
画像はEmguのサンプルより。
コードは下に。
—-
この凸凹写真(仮)のアイディアは、 富士フイルム FinePixREAL 3D W1 の発売当初から考えていた、、、のですが、やっと(実験的にですが) 形にすることができました。
[pukiwiki]
肝心のカメラは まだ入手してないのですが(汗
今回のコードは、結構やっつけなのでアレですけれども、、、
—-
余談 その1
立体カメラのプロモーション用に、 『ステレオ(左右ペア)写真をアップロードすると、凸凹写真(仮)になるWEBサービス』(とか、SNS, 写真共有サイト) なんてのが有ると、Webでも気軽に立体写真の感じが楽しめて面白いかなぁと思ったりしました。
私自身は技術力が追いつかないので作れませんが(無念)
—-
余談 その2
今年は3Dテレビなども発売されるみたいですが、ということは、うまくいけば、コンシュマーな3Dビデオカメラも松下やソニーから発売される可能性は有るのかしらん?
(というか、願望ですが。)
ホームビデオな3D動画の標準化など、通産省に音頭をとって頂きたいところ。 個々にバラバラのフォーマットだと、オーサリング(ソフトを作る人)なんかも困るだろうし、消費者としても困るし。
—-
さて、本題に戻りまして。
今回はironpython2.6を使用しました。
サンプル画像は、比較的きれいに奥行きデータを取得できました。
http://boxheadroom.com/wp/wp-content/uploads/2010/01/015_z.jpg
(凸凹写真(仮)の都合で、奥行きデータにぼかしをかけてあります)
ネット上に公開されている、いろんなステレオ写真で試したところ、元の写真によって、うまく奥行きを取得できる場合と、うまくいかない場合があるようです。
ものによっては、手書きで奥行きデータを与えてやったほうが、かえって綺麗な場合もあります。
*[[Emgu CV : OpenCV in .NET:http://www.emgu.com/wiki/index.php/Main_Page]]
.NET用のOpenCVラッパーライブラリ
IronPythonからも使えます。まだよく判らないので試行錯誤中
-[[ダウンロード:http://sourceforge.net/projects/emgucv/files/]]
サンプルEmgu.CV.SourceAndExample-1.5.0.1.zip
サンプルコード Simple3DReconstructionを、ほぼ引き写し。オリジナルはOpenGLを使ってポリゴンで奥行きを表示しているのですが、ビットマップの濃淡で出力するようにしました。
*関連記事
下記のソフトのほうが断然スゴイ、のですが。
-[[【トレたま】iPhoneソフトHourFace:http://www.tv-tokyo.co.jp/wbs/toretama_blog/post_693.html]]
顔写真を送ると、歳をとった自分の顔がポリゴンになって送られてくる、というアプリ。
モーションポートレイトは スゴイですねー
-[[【画像ぷるぷる】違った視点でソフト作ってみた:http://www.nicovideo.jp/watch/sm9277616]]
えろいので注意!
ポリゴンで超立体化&有限要素解析
*コード
まだ自分自身もライブラリの使い方がよくわかってないので、試行錯誤した後を清書せずに残してあります。
Emguのbinフォルダから、適当に必要なdll (cv200.dll , Emgu.CV.dll などなど)を、このスクリプトと同じフォルダにコピーして実行してください。
-画像データ 000_tex.jpg
-奥行きデータ 000_z.jpg
が作成されます。 先日のphpのコードで swfファイルを作成するための素材として使用できます。
[/pukiwiki]
decoboco.py
import clr
clr.AddReference("Emgu.CV")
import Emgu.CV as cv
import System
import Emgu.CV.Structure as S
clr.AddReference("System.Drawing")
import System.Drawing as D
import Emgu.CV.CvEnum as E
fnleft="left.jpg"
fnright="right.jpg"
rev=0.
rev=1.
b=4
iml=cv.Image[S.Gray,System.Byte](fnleft)
imr=cv.Image[S.Gray,System.Byte](fnright)
im2=cv.Image[S.Gray,System.Int16](iml.Size)
im2r=cv.Image[S.Gray,System.Int16](iml.Size)
#bm=cv.StereoBM(E.STEREO_BM_TYPE.CV_STEREO_BM_BASIC,0)
#bm.FindStereoCorrespondence(iml,imr,im2)
gc = cv.StereoGC(8, 2)
gc.FindStereoCorrespondence(iml,imr,im2,im2r)
#im2 = im2 * (-16)
minvalue,maxvalue,minpoint,maxpoint=im2.MinMax()
dz=(maxvalue[0]-minvalue[0])
dz2=dz/2.0
if rev :
#scale=-128*rev+128./(maxvalue[0]-minvalue[0])bm
#im3=im2.Add(S.Gray(-dz2+minvalue[0]))
im2-= minvalue[0]
#im3._Mul(-1)
#minvalue,maxvalue,minpoint,maxpoint=im3.MinMax()
scale=130./(dz)
im2*=scale
im2=255-im2
#im2+=128
#im4=im2.ConvertScale[System.Byte](scale,64.)
#else :
# scale=64./dz2
# im3=im2.ConvertScale[System.Byte](scale,0.)
#imb=im3.SmoothBlur(16,16)
im2=im2.SmoothBlur(b,b).SmoothBlur(b,b)
im2.Save("000_z.jpg")
#for i in [iml,imr,im2,im2r,im3,imb]:
for i in [iml,imr,im2,im2r]:
i.Dispose()
import shutil
if fnleft.endswith(".jpg"):
shutil.copy(fnleft,"000_tex.jpg")
else:
im=cv.Image[S.Bgr,System.Byte](fnleft)
im.Save("000_tex.jpg")
im.Dispose()
