memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

THETA-Sで撮影した写真の手前方向の部分を抽出するProcessingプログラム

なんとも長ったらしいタイトルですが。。。一応、言葉であらわすとこのようになります。

THETA-S(その前の機種でも同じだと思います)を手に持って撮影すると、撮影ボタンのついている背面が360度画像の正面になります。

f:id:ke_takahashi:20160920213055j:plain

今、ちょうど手元にTHETA-Sがないので、ちょっと前にSmart Laser CO2を組み立てている様子を撮影した画像で説明しますね。

f:id:ke_takahashi:20160530200938j:plain

上記の例では、僕が写っている方が撮影ボタンと反対の面のレンズの方向になります。

360度撮影しているわけですから、カメラの向きがどうであろうと関係ないはずですから、意識する必要はないはずですが、例えば、上記の写真から僕が写っている部分だけくり抜きたい場合もあると思うんです。作業風景をタイムラプスでみたいときに、本棚の本なんて見えている必要ないですよね?

で、先日のイベントでも作業解析をするために(非公開ですが)子供達と大学生の動きをTHETA-Sで撮影してみたんですね。

そしたら、僕がミスってしまい、カメラの向きが反対だったんです。。。

上記の写真でがんばって手動で反対イメージを作ると以下のような感じになります。これじゃね。。。両脇を見る必要があって作業解析どころではありません。大失敗でした。。。僕が何に困ったのかわかっていただけたでしょうか。。。?

f:id:ke_takahashi:20160920215221p:plain

で、この、カメラの後ろ側に写ってしまったものを正面に持ってくるようなツールかオープンソースがないかあちこち探し回ったんです。でもGithubにもありませんでした。。。THETA-Sで発売当時からハックしたソフトウェアをアップしているような人も作ってなかった。。。

で、しかがたないので自分で作ったんですね。一番慣れているProcessingで作ってみました。

void setup()
{
  size(1024, 1024);
  PImage img;
  File dir = new File(dataPath(""));
  String[] files = dir.list();
  for (String s : files) {
    if (! "JPG".equals(split(s, ".")[1])) continue; 
    img = loadImage(s);
    copy(img, 0, 0, img.width/4, img.height, img.width/4, 0, img.width/4, img.height);
    copy(img, img.width/4*3, 0, img.width/4, img.height, 0, 0, img.width/4, img.height);
    save("_" + s);
  }
  noLoop();
}

このツールのアウトプットは以下のようになります。

f:id:ke_takahashi:20160920214533j:plain

使い方は、Processingで新規スケッチを作って、そこに上記のソースコードをコピペします。一旦保存して。

スケッチフォルダ(⌘-k)内にdataフォルダを手動作成して、その中にTHETAの画像ファイルを入れます。

あとはProcessingで実行ボタンを押せば、スケッチフォルダ内にアンダースコアを先頭につけたファイルが自動生成されます。

処理前の画像の縦横は2048x1024であることを前提としています。また拡張子はJPGです。たぶん、これはデフォルトなので変更は必要ないと思います。今後解像度があがると思いますが。。。

まぁ、こんな用途が世の中に存在するのかわかりませんが(誰も作っていないので困った経験がないのでしょうか?)、とりあえず、僕は困ったので作りました。もしよければ使ってください。