読者です 読者をやめる 読者になる 読者になる

凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

カメラ補正機能などにより精度・性能が向上した Ovrvision SDK v0.7 のアップデートをまとめてみた

Oculus Unity

はじめに

Ovrvision SDK v0.7 がリリースされました!

アップデート内容に関して簡単に調べてみましたのでご紹介します。

更新点

今回の更新点は次のようになっています。

  • The configuration XMLfile reading system was changed into a TEMP folder.
  • Unity Inspector of the Ovrvision control has changed sharply.
  • The distortion compensation function of the camera was changed. (intrinsics.yml config file)
  • Fixed a bug in the camera control of the Unity Pro.

設定ファイル

設定ファイルが TEMP フォルダに保存されるようになりました。書き換えは実行時と終了時に行われるため、実行時および編集時のスライダの値の変更が保存されるようになります。

処理としては、Windows であれば、C:\Users\USER_NAME\AppData\Local\Tempovrvision_config.xml という以下の様な設定ファイルが保存されるようになります。

<?xml version="1.0" encoding="utf-8"?>
<ovrvision>
 <cameraparam>
  <p set="exposure">Auto</p>
  <p set="whitebarance">Auto</p>
  <p set="contrast">32</p>
  <p set="saturation">40</p>
  <p set="brightness">100</p>
  <p set="sharpness">2</p>
  <p set="gamma">7</p>
  <p set="ipd-horizontal">0.00000</p>
  <p set="ipd-vertical">0.00000</p>
 </cameraparam>
</ovrvision>

実行時は Ovrvision.Awake() 内の OvrvisionProperty.AwakePropSaveToXML() で DLL 内の SaveParamXMLtoTempFile() を呼び出して書き出ししています。終了時はどこか見当たらないので、Ovrvision.OnDestroy()ovClose() 内でやってるのかなぁ、と推測しています。

インスペクタの変更点

f:id:hecomi:20140523010034p:plain

デフォルト値が設定されるようになった点と、カメラキャリブ用のファイルの設定が追加された点が変更点になります。

カメラの補正

カメラのキャリブデータの入力が可能になりました。データは OpenCV に準拠した形で YAML 形式で与えます。

%YAML:1.0
LeftCameraInstric: !!opencv-matrix
   rows: 3
   cols: 3
   dt: d
   data: [ 4.0781384509765246e+002, 0., 3.0354362331402490e+002, 0.,
       4.0681921278864587e+002, 2.1476481472578010e+002, 0., 0., 1. ]
LeftCameraDistortion: !!opencv-matrix
   rows: 1
   cols: 5
   dt: d
   data: [ -4.3033426952578735e-001, 2.5186381334873753e-001,
       1.4230015038428666e-004, 5.8724582307503469e-004,
       -9.1939409664307470e-002 ]
RightCameraInstrics: !!opencv-matrix
   rows: 3
   cols: 3
   dt: d
   data: [ 4.0620808845966502e+002, 0., 3.2244279521779976e+002, 0.,
       4.0549297233063805e+002, 2.3292530943361234e+002, 0., 0., 1. ]
RightCameraDistortion: !!opencv-matrix
   rows: 1
   cols: 5
   dt: d
   data: [ -4.1923438677328939e-001, 2.1476404664086707e-001,
       7.5242604644903716e-004, 6.6822998564754937e-004,
       -5.8073543368349696e-002 ]

OpenCV のキャリブ周りについては以下をご参照下さい:

本パラメタの抽出には @izm さんの以下のツールが利用されているようです。

intrinsics.ymlAssets 化にあるのですが、ビルドによる書き出しの際は、これを {AppName}_Data フォルダ以下に手動でコピーする必要があります(Ovrvision のエディタ部にも書いてあります)。ここについては改善案を後述します。

テクスチャ取得部の別スレッド化(undocumented)

テクスチャ取得部が別スレッド化されたことで高速化されました。これは以下のエントリの内容を反映してくださったようです。

undistorted 画の取得(undocumented)

これまでは、画を取ってくる関数は以下のようになっていました。

[DllImport("ovrvision", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
static extern void ovGetCamImageForUnityColor32(System.IntPtr pImagePtr_Left, System.IntPtr pImagePtr_Right, System.IntPtr pImagePtr_LeftUndistort, System.IntPtr pImagePtr_RightUndistort);

今回から、カメラ補正を指定したパラメタベースで行うようになったため、この undistorted な画の計算は AR 処理の直前で行われるようになったと思われ、以下の様な形になりました、

[DllImport("ovrvision", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
static extern void ovGetCamImageForUnityColor32(System.IntPtr pImagePtr_Left, System.IntPtr pImagePtr_Right);

これまで undsitorted 画を渡していた OvrvisionEx.Render() には、distorted 画を渡す形になっています。

ステレオカメラ間の微妙な時間のズレの低減

Twitter で @Wizapply さんがつぶやかれてました。

未検証ですが嬉しいアップデートです。

ビルド時のキャリブファイル自動移動

StreamingAssets ディレクトリを利用します。

Assets ディレクトリ下に StreamingAssets ディレクトリを作成し、そこへ intrinsics.yml を移動します。そして、Ovrvision.Awake() に以下の 1 行を追記します。

void Awake() {
    intrinsicsFilePath = System.IO.Path.Combine(Application.streamingAssetsPath, intrinsicsFilePath);
    ...
}

これでビルド後も自動でファイルがコピーされて読み込まれるようになります。

おわりに

今回は堅実なアップデートがなされ、着実に完成度が高くなっていて嬉しいですね!次回のアップデートは6月2周目、OpenCV 画像解析系、ハンド2Dトラッキングとのことでとても楽しみです!

Ovrvision 1 : Stereo camera for Oculus Rift

Ovrvision 1 : Stereo camera for Oculus Rift