New Articles
(01/26)
(01/25)
(01/21)
(01/18)
(01/16)
Category
Comments
[01/11 NICA]
[01/10 NONAME]
[11/05 いなば]
[10/10 ドリン]
[09/26 名無し]
マッチングの一致度評価関数に使われるSAD(sum of absolute difference)の等角直線フィッティングとSSD(sum of squared difference)のパラボラフィッティングでステレオ画像の対応点のサブピクセル推定を行うプログラムを作りました。
こちらは今まで作ったステレオマッチングプログラムと今回作ったものの比較用に復元した3次元モデルです。
一番上は普通のピクセル精度のステレオマッチングで復元したモデルで、ピクセル単位の対応点しか取っていないので段々なモデルになります。
その下が今回作ったサブピクセル推定法をベースにしたステレオマッチングプログラムで復元したモデル。前に作った位相相関ベースの手法に比べると精度はイマイチですが、処理時間は位相相関ベースのものより4倍くらい速かったので速さを重視したいときはメリットは結構大きい手法なんじゃないかと思います。
ちなみに処理時間ですが、400x400程度の画像で探索範囲が100pixelのときはだいたい次のような感じになりました。
環境
OS: Windows 7 64bit
CPU: core i-7 860
Memory: 8GB
ピクセル精度のブロック相関: 0.1秒
サブピクセル精度のブロック相関: 0.3秒
サブピクセル精度の位相相関: 1.4秒
いろいろな論文を見ていて、ステレオ法にはいろいろなテクニックがあることが少しずつわかっては来たのですが、それと同時に自分の無知さをかなり痛感します。
ちなみに、この辺りが参考にした論文です。
http://www.springerlink.com/content/l707554742p42355/fulltext.pdf
http://vision.kuee.kyoto-u.ac.jp/japanese/happyou/pdf/Sumi_2004_P_170.pdf
元画像はこちらからお借りしました
http://vision.middlebury.edu/stereo/data/
こちらは今まで作ったステレオマッチングプログラムと今回作ったものの比較用に復元した3次元モデルです。

一番上は普通のピクセル精度のステレオマッチングで復元したモデルで、ピクセル単位の対応点しか取っていないので段々なモデルになります。
その下が今回作ったサブピクセル推定法をベースにしたステレオマッチングプログラムで復元したモデル。前に作った位相相関ベースの手法に比べると精度はイマイチですが、処理時間は位相相関ベースのものより4倍くらい速かったので速さを重視したいときはメリットは結構大きい手法なんじゃないかと思います。
ちなみに処理時間ですが、400x400程度の画像で探索範囲が100pixelのときはだいたい次のような感じになりました。
環境
OS: Windows 7 64bit
CPU: core i-7 860
Memory: 8GB
ピクセル精度のブロック相関: 0.1秒
サブピクセル精度のブロック相関: 0.3秒
サブピクセル精度の位相相関: 1.4秒
いろいろな論文を見ていて、ステレオ法にはいろいろなテクニックがあることが少しずつわかっては来たのですが、それと同時に自分の無知さをかなり痛感します。
ちなみに、この辺りが参考にした論文です。
http://www.springerlink.com/content/l707554742p42355/fulltext.pdf
http://vision.kuee.kyoto-u.ac.jp/japanese/happyou/pdf/Sumi_2004_P_170.pdf
元画像はこちらからお借りしました
http://vision.middlebury.edu/stereo/data/
PR
研究で与えられた3点をパラボラフィッティング(Parabola Fitting)で関数近似して最小解を求めるようなC++プログラムを作る機会があったので、ちゃんとできているか確認するためにMELで同じようなものを書いてMayaでビジュアル化しました。
本当はMathematicaとか使うんでしょうけど、私には慣れているMayaの方が手っとり早い。
3つトランスフォームノードを選んで、下記のようにコマンドを実行するとフィッティングしたカーブに沿ったアニメーションが作られます。
createXYParabolaAnimExpression_SelectedThreePoints("pSphere1", 0.1, -30);
この場合はpSphere1というオブジェクトにExpressionでアニメーションがつきます。0.1がアニメーション速度で、-30は接線が平行になる点のオフセットです。
動画にするとこんな感じです。
こういった関数あてはめを行うことで、サンプル点よりも細かい情報を得ることができます。
MELで作ったところで、このままでは何の役にも立ちませんけどソースを載せておきます。
本当はMathematicaとか使うんでしょうけど、私には慣れているMayaの方が手っとり早い。
3つトランスフォームノードを選んで、下記のようにコマンドを実行するとフィッティングしたカーブに沿ったアニメーションが作られます。
createXYParabolaAnimExpression_SelectedThreePoints("pSphere1", 0.1, -30);
この場合はpSphere1というオブジェクトにExpressionでアニメーションがつきます。0.1がアニメーション速度で、-30は接線が平行になる点のオフセットです。
動画にするとこんな感じです。
こういった関数あてはめを行うことで、サンプル点よりも細かい情報を得ることができます。
MELで作ったところで、このままでは何の役にも立ちませんけどソースを載せておきます。
global proc fit2dParabolaFromThreePoints(
float $in_x1, float $in_x2, float $in_x3,
float $in_y1, float $in_y2, float $in_y3,
float $o_result[]
){
float $denom = ($in_x1 - $in_x2)*($in_x1 - $in_x3)*($in_x2 - $in_x3);
$o_result[0] = ($in_x3 * ($in_y2 - $in_y1) + $in_x2 * ($in_y1 - $in_y3) + $in_x1 * ($in_y3 - $in_y2)) / $denom;
$o_result[1] = ($in_x3*$in_x3 * ($in_y1 - $in_y2) + $in_x2*$in_x2 * ($in_y3 - $in_y1) + $in_x1*$in_x1 * ($in_y2 - $in_y3)) / $denom;
$o_result[2] = ($in_x2 * $in_x3 * ($in_x2 - $in_x3) * $in_y1 + $in_x3 * $in_x1 * ($in_x3 - $in_x1) * $in_y2 + $in_x1 * $in_x2 * ($in_x1 - $in_x2) * $in_y3) / $denom;
};
// Example
// createXYParabolaAnimExpression("pSphere1", 1, 1, 0, 0.1, -30);
global proc createXYParabolaAnimExpression(
string $target_transform,
float $a, float $b, float $c,
float $speed,
float $frame_offset
){
string $tx = $target_transform + ".tx";
string $ty = $target_transform + ".ty";
string $exp_str =
"float $a="+$a+";\n"+
"float $b="+$b+";\n"+
"float $c="+$c+";\n"+
"float $speed="+$speed+";\n"+
$tx+" = (frame+"+$frame_offset+")*$speed;\n"+
$ty+" = $a*"+$tx+"*"+$tx+" + $b*"+$tx+"+$c;";
expression -s $exp_str;
};
// Example
// createXYParabolaAnimExpression_SelectedThreePoints("pSphere1", 0.1, -30);
global proc createXYParabolaAnimExpression_SelectedThreePoints(
string $target_transform,
float $speed,
float $frame_offset
){
string $point_list[] = `ls -sl`;
if(size($point_list)<3){
print "error: Number of selected point is not enough, must be more than 3."; return;
}
float $coefs[3];
fit2dParabolaFromThreePoints(
`getAttr ($point_list[0]+".tx")`,
`getAttr ($point_list[1]+".tx")`,
`getAttr ($point_list[2]+".tx")`,
`getAttr ($point_list[0]+".ty")`,
`getAttr ($point_list[1]+".ty")`,
`getAttr ($point_list[2]+".ty")`,
$coefs
);
createXYParabolaAnimExpression($target_transform, $coefs[0], $coefs[1], $coefs[2], $speed, $frame_offset);
}
MayaでHairの長さの変更はHairメニュのhair scale toolというツールを使えばできますが、キーフレームアニメーションさせるにはHairの長さを示す特定のアトリビュートがないので一瞬戸惑います。
しかし、hair scale toolを実行したときに何が起こっているのかをscript editorを開いてみるとfollicleのトランスフォームノードのscaleアトリビュートを変えているだけのようでした。
ということでfollicleのscaleアトリビュートにキーフレームを打ってみたら、Hairの長さをキーフレームアニメーションさせることができました。
この仕様すごくわかりづらいです。多分この仕様を作った開発者の方はMayaを使うデザイナーにHairの長さをアニメーションさせる気がなかったんですね。
しかし、hair scale toolを実行したときに何が起こっているのかをscript editorを開いてみるとfollicleのトランスフォームノードのscaleアトリビュートを変えているだけのようでした。
ということでfollicleのscaleアトリビュートにキーフレームを打ってみたら、Hairの長さをキーフレームアニメーションさせることができました。
この仕様すごくわかりづらいです。多分この仕様を作った開発者の方はMayaを使うデザイナーにHairの長さをアニメーションさせる気がなかったんですね。
After EffectsのTutorialが満載のサイトVIDEO COPILOTのTutorialページの各Tutorialにカーソルを載せると自動でTutorialのプレビュー動画が流れる機能がずっと前から便利だなぁと思っていて、自分のサイトでも取り入れたいと思っていました。
今日、サイトのソースを見させてもらいながら仕組みを調べてみたんですが、Javascriptだけで簡単に実装できそうだったので、真似ながら試行錯誤していたら、とりあえず音楽のプレビュー機能として同じようなものが作れました。
画像にカーソルを載せるとプレイヤーが現れてカーソルにくっついてきます。その間、プレビュー用の音楽が再生されるという機能です。
MusicページのWorksにてすでに機能していますので、興味のある方は試してみて下さい。
激しく動きまくったりすると結構落ちたりするので優しくお願いします。何度か試してChromeとFirefoxは一度も落ちなかったんですが、IEは落ちることがあったのでご注意を。
やっぱりWebのプログラミングは簡単に目に見える成果が出るのでおもしろいです。修士論文からの現実逃避はこのくらいにしときます。
-------------------------------------
追記
ブラウザごとで音楽プレイヤーの埋め込みタグを分けたら安定して落ちなくなりました。
今日、サイトのソースを見させてもらいながら仕組みを調べてみたんですが、Javascriptだけで簡単に実装できそうだったので、真似ながら試行錯誤していたら、とりあえず音楽のプレビュー機能として同じようなものが作れました。
画像にカーソルを載せるとプレイヤーが現れてカーソルにくっついてきます。その間、プレビュー用の音楽が再生されるという機能です。
MusicページのWorksにてすでに機能していますので、興味のある方は試してみて下さい。
激しく動きまくったりすると結構落ちたりするので優しくお願いします。何度か試してChromeとFirefoxは一度も落ちなかったんですが、IEは落ちることがあったのでご注意を。
やっぱりWebのプログラミングは簡単に目に見える成果が出るのでおもしろいです。修士論文からの現実逃避はこのくらいにしときます。
-------------------------------------
追記
ブラウザごとで音楽プレイヤーの埋め込みタグを分けたら安定して落ちなくなりました。
次のページ >>

