ステレオ計測をすると、データをどう可視化するのかという問題に出くわす。
データの保存だけなら、*.npy ファイルでなんとかなるだろう。
numpy を利用すること前提になるが、IEEEの不動小数点フォーマットでNaN, PosInf, NegInf を含めてデータを保存できる。
データを登録して管理するのは、npyファイルだけで十分
- カラー化した画像を保存するのは無駄。
- カラー化した画像はnpyファイルから簡単に作れる。
- ビューワーは簡単にアルゴリズムから切り離せる。
視差それとも深度
- 視差データがよいと考える。
- left画像とright画像から決まるのは視差データ。
- 特定のステレオカメラの深度データは、視差データに換算できる。
- DepthAnythingも視差データを算出する。
- 視差こそが比較に適している。
- データの精度を考えるとき
- 視差ベースの比較の方が、残差の比較に適する。
- 15m、20mの差を5mの残差として考えるよりは, 15m相当の視差、20m相当の視差の差と考えるほうがいい。
- 残差2乗和の最小化に適するのは、視差。
- ロボットの場合
- 近距離の物体の方が重要。
- 近距離での距離の精度の方が重要。
以上のことから視差データの表示ツールを作ることにした。
表示方法の例(最大値と最小値による正規化)
- グレースケール表示:
- データを最大値と最小値で正規化してそれをグレースケールで表示する
- 近い側が白、遠い側が黒の方が、視覚的に理解しやすい。
- カラーマップ表示:
- データを最大値と最小値で正規化してそれをカラーマップで表示する
- カラーマップを表示の画像をモノクロ印刷しても大小関係がわかるカラーマップとそうでないカラーマップがある。
考慮すべき値の範囲
- 視差ベースならば、カメラに違い側が限界を決める。
欠損値の扱いをどうするか?
難点:
異なるフレーム間での比較、異なる手法間での比較に向かない。
plt.imshow(img, vmin=0.0, vmax=10.0)
この方法だと、フレーム間での比較が可能になる。
Jetのcolormap
利点:セグメンテーションとしてわかりやすい
難点:
colomap に対応するcolorbar が与えられていないことが多いので
深度の絶対値を知ることができない。
平面であるべきものが平面に保たれているか・歪んでいるかがわからない。
視差データ・深度データの表示の課題
よほどの理由がないかぎり、その示す値の妥当性(もっともらしさ)を人が視覚的にすることができない
ほしい情報
- 物体表面の法線ベクトルの向きがわかる可視化手法
そうすれば、平面であるべき領域が平面になっているのかが判定しやすい。
シェーディングの情報によって対象物の形状の様子などがわかる。
Open3D Visualization
から引用
print("Load a ply point cloud, print it, and render it")
pcd = o3d.io.read_point_cloud("../../TestData/fragment.ply")
o3d.visualization.draw_geometries([pcd], zoom=0.3412,
front=[0.4257, -0.2125, -0.8795],
lookat=[2.6172, 2.0475, 1.532],
up=[-0.0694, -0.9768, 0.2024])
open3d.visualization.draw_geometries
3D カメラのSDKでのサンプルコードの例
OpenGL を利用して書かれたviewerを利用している。
https://github.com/stereolabs/zed-sdk/blob/master/depth%20sensing/depth%20sensing/python/depth_sensing.py