2015年10月30日

位相限定相関法(POC)のテスト

以前ちょっと試してそのまま放置していたので何となく整理しました。参考サイトもたくさんありますし、OpenCVでも実装されているようです[1]〜[4]。

2枚の画像のマッチングを行うときに、フーリエ変換して位相情報のみの相関をとって逆変換すると、平行移動量の所にピークが出るみたいです。

で、ピークの様子を確認するのにgnuplot等で表示すればいいのだと思いますが、画像サイズと等しいXY平面ポリゴンを作成して、値を高さZにするディスプレイスメントマッピングみたいなものを作ってみました。

POC_002.png

POC_003.png

上記の計算をしてPLYで出力するサンプルプログラムです。法線計算とか除いています。今回は表示をMeshLab上でやっていますが、法線計算もMeshLabでやればいいかと思います。
plytest.cpp

実行結果
poc_001.png

ついでにLenna画像で試してみました。高さはグレースケール化した時の輝度値です。

POC_006.png
横から見た結果
POC_008.png POC_007.png
       光源なし              光源あり

後は高さマップや法線マップを読み込んでポリゴンで出力するバージョンも作ってみました。画像から読み込んで出力する値を変更しただけですが。
POC_005.png
[5]の画像を使用させていただいております。

話が逸れましたが、まずは平行移動させた画像です。同一画像の場合、ピークが画像の中心に来ますので、平行移動量は画像の中心からどれだけずれているか、になるのではないかと思います。

POC_010.png POC_011.png
原画像

POC_004.png
ピーク画像

結果としては完全に一致していたと思います。ペイントで適当に移動させただけですので、サブピクセル単位のずれはありません。

次に、回転角の計算です。こちらはRIPOCというもので、2枚の画像をフーリエ変換して得られたスペクトル画像をLogPolar変換した画像からPOCで平行移動量を求める、という方法のようです。おそらく。

POC_010.png POC_012.png
原画像

POC_013.png
LogPolar変換した2枚の画像
(平坦な部分に見える線が横(画面奥方向)に平行移動している。今回は横方向がθ)

POC_009.png
ピーク画像

LogPolar変換で、今回は横軸にθ(-PI〜PI)をとっていますので、画像の幅が512ピクセルであれば、512ピクセルで2PIラジアンのずれ、ということになります。端の方が大きい値をとっていますので、変換バグがあるかもしれません。

計算した結果、横方向に48ピクセルずれたところにピークがありましたので、2PI*48/512ラジアン≒33.75度となりました。確かGIMPで33.4度回転させた気がしますので、大体あってそうです。もっと精度がほしい場合はピーク位置をsinc関数か何かで出す必要があるみたいです。

[1] http://d.hatena.ne.jp/suzume_r/20100515
[2] http://authorunknown408.blog.fc2.com/blog-category-1.html#39
[3] http://www.soaristo.jpn.org/blog/archives/2015/02/150214.php
[4] http://cvl-robot.hateblo.jp/entry/2014/02/06/171541
[5] http://www.bencloward.com/shaders_offset.shtml

web拍手 by FC2
posted by シンドラー at 18:28 | Comment(0) | TrackBack(0) | Image Processing | このブログの読者になる | 更新情報をチェックする

2015年10月16日

[Unity 5] FPS移動のためのクラッチ操作のテスト [DK2]

ダンジョン探索系のコンテンツで、視点変更にマウスを使うものがあります。あれはもう駄目ですね。酔います。しかし、後ろを振り向きたい場合、現状のOculus Rift DK2ではトラッキング範囲の限界などもあり何か工夫しないと難しいです。

可動範囲が決まっているマウスの場合、持ち上げている間はマウスカーソルが動かず、領域の端に来たら持ち上げて可動範囲内に戻す、というのを繰り返します。これをクラッチ操作と呼ぶこともあるようです。

今回は、このクラッチ操作を導入してみるテストです。左を向いて、これ以上後ろを向けない場合、キーを押しながら首を前向きに戻す、というのを繰り返す感じです。

仕様
・キーボードを押している間は、Y軸回転を無効化する
 →押した瞬間の向きを保存しておき、押している間はY軸回転の逆回転を親ノードに適用する
 →トラッキングを無効化する操作なので、ユーザが能動的に行わないと酔いそうなため
・キーボードを押している間は、画面を暗くする
 →トラッキング無効化中であることを認識しやすくするためと、酔いを軽減するため

というわけで、カメラに適用するスクリプトは下記のものになります。mainCameraはHMDの位置姿勢で上書きされますので、その親にdummyのGameObjectをつけています。
HMDWalkScript.cs

実行結果

首を限界まで回して、これ以上回らないところでキーを押して前を向く、ということをやっているのですが、動画だとさっぱり伝わりませんね。

感想

慣れると違和感なく操作できました。それ以前に、ただ単に前進しているだけでも体が動いていないのに視点が動くせいで酔ってしまったので、FPSは酔いやすい自分には厳しそうです。以前やったテレポート移動+今回のクラッチ操作が良さそうですかね。適用できるゲームが減ってしまいそうですが。

web拍手 by FC2
posted by シンドラー at 20:40 | Comment(0) | TrackBack(0) | Unity 5 | このブログの読者になる | 更新情報をチェックする

2015年10月15日

Unity 5でG-Bufferのテスト その4

時間が開くと色々忘れて困ったものです。前回のHeadモデルは、1マテリアルの1テクスチャなので問題なかったのですが、一般的なモデルは複数マテリアルで複数テクスチャを使っていて色々大変です。

今回は、マテリアル番号を確認するために、G-Bufferに前回と同様にマテリアル番号を出力して、そのデータを元に特定のマテリアル番号の所だけに特殊な処理をしたり、エッジを表示したりするテストです。

G-Bufferの出力は、前回と同じRenderGBuffer.shaderを使用しています。

手順
1. カメラにDrawEdgeTest.csを割り当てる
DrawEdgeTest.cs
2. ShaderにCustum/DrawEdgeを割り当てたマテリアルを準備する
DrawEdge.shader
3. SSS Matのところに上記マテリアルを割り当てる

後は前の手順なども併せて適当に色々やった気がします。

実行結果


TargetMatNoのところをいじると、マテリアルの境目に赤いエッジが表示されます。これはG-Bufferに出力したマテリアル番号にラプラシアンフィルタを掛けて閾値以上の所を赤色にしていたと思います。

TargetMatListの所に追加したマテリアルは、今回は青色にする処理だけを行っています。このような感じで、処理対象とするマテリアル番号を渡すようにすれば、特定のマテリアルだけに何らかの処理が可能となります。

この辺の処理は重そうで75fpsはきつそうなので、そろそろOculus Rift関係に戻ろうかと思います。

web拍手 by FC2
posted by シンドラー at 01:06 | Comment(0) | TrackBack(0) | Unity 5 | このブログの読者になる | 更新情報をチェックする

2015年10月03日

録音のテスト

いつの間にか10月ですね。困ったものです。

画像や音声の処理をする場合の補助として、切出しやキャプチャツールみたいなものを時間がある時に作っていました。今回は録音のテストです。この辺りはWindows 10になると動かなくなったりするんでしょうかね。

参考サイト[1][2]を見れば特に問題ないかと思います。ステレオミキサーを使うみたいですので、無効になっている場合は[3]等を参考に有効化します。

[1][2]はWindowsアプリケーションで作成していて、コンソールアプリケーションで作成している例が見当たらなかった(ちゃんと探してませんが)ので、そちらで作成してみました。

そのため、なるべくウィンドウプロシージャは使いたくなかったのでコールバック関数[4]を一つ使うようにしてみました。これで合っているのかどうかはわかりません。

基本は[1]のソースコードを[2]を参考に複数バッファ・動的サイズ変更できるようにHeapReAlloc[5]関数を使うように修正した感じです。

以下ソース。エラー処理などもしてません。何か問題があっても責任は取りません。
WaveTestConsole.cpp

WAVEを再生すると音が小さくなってる気がするのですが原因などはよくわかりません。

参考サイト
[1] 入力デバイスによる録音
[2] 音声の入力
[3] パソコンで流れる音を録音する方法(ステレオミキサー)<Windows(R)7>
[4] waveInProc
[5] HeapReAlloc
web拍手 by FC2
posted by シンドラー at 15:20 | Comment(0) | TrackBack(0) | OpenAL | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。