Minoru3Dのコードを激安3D ウェブカメラ(DS-3DW300)に移植する
DS-3DW300で深さ情報を検知するよー!
というわけで当初の目的だったDepthMapが作りたくなりました。
実はDepthMap、自分で作ろうとして先ほどのPython等のコードで作成できたSideBySideの画像を、cvFindStereoCorrespondenceBMやcvFindStereoCorrespondenceGCにそのまま突っ込んだのですが、あんまり良い画像が得られませんでした。ちゃんとそれをやるには左右カメラの歪みや相対位置のキャリブレーションが必要になります。うーん。面倒。
で、よく考えたらminoru3Dで使えるキャリブレーションからDepthMap作成までのコードが公開されているのを思い出し、移植してみることにしました。
こちらで公開されているソースコードですが、「学術,研究用途に限り,個人・法人に限らず利用者は自由に使用することができます。」とのことですので、有りがたく使用させて頂くことにしました。
MinoruではOpenCVからはL/Rのカメラが2台のカメラとしてオープンするのですが、
今回の激安3Dカメラでは1台のカメラとしてキャプチャするので、絵を分離して辻褄をあわせる必要がありました。
そこで以下のようなコードで適当に画像を分離しています。(即値で320とか480とか入っていますが、そもそも激安Webカメラ、VGA以外の解像度を持っていないのでとりあえず問題有りません。(本当か?!)
void separateImage(IplImage *src,IplImage *dst1,IplImage *dst2)
{
IplImage *tmp=cvCloneImage(src);
cvSetImageROI(tmp,cvRect(0,0,320,480));
cvResize(tmp,dst1);
cvSetImageROI(tmp,cvRect(320,0,320,480));
cvResize(tmp,dst2);
cvReleaseImage(&tmp);
}
その他、OpenCV2.4.9に対応させるためにいろいろいじりました。
結果、こんな感じでDepthMapが取れましたー。
ちなみに元の絵はこんな感じです。(撮影し直したので厳密に同じではないです。)
ぴよちゃんの方がチャートよりも前なので、手前のぴよちゃんが白っぽく、チャートの方は黒っぽくなっています。
(2014/5/25追記)
作者様に許可を頂けたので、移植したコードをソースコードごと置いてみます。
動いたら(動かなくても)教えてねー。
使い方に関しては元の作者様のドキュメントを参照して下さい。そのうちこちらに使い方を追記したいと思います。
こちらのDownload ソースコード&マニュアル の中に入ってるパワーポイントに使い方が紹介されていました。(英語です)