Googleのレンズぼかし機能のファイル構造

Google Cameraの目玉機能としてレンズぼかし機能があります。

スマフォのカメラで擬似的に高深度の写真を取る機能です。

例えば、次のような写真が撮れます。

レンズぼかしで撮影

この機能の方法はGoogleのブログで解説されていますが、後からフォーカスを設定できたりと面白いのでどのようなファイル構造になっているかを調べてみました。

Exiftoolからの出力はこんな感じ。

ExifTool Version Number : 9.46
File Name : IMG_20140416_181937.jpg
Directory : .
File Size : 909 kB
File Modification Date/Time : 2014:05:01 18:06:55-07:00
File Access Date/Time : 2014:05:01 18:06:57-07:00
File Inode Change Date/Time : 2014:05:01 18:06:55-07:00
File Permissions : rw-rw-r--
File Type : JPEG
MIME Type : image/jpeg
Exif Byte Order : Big-endian (Motorola, MM)
GPS Latitude Ref : North
GPS Latitude : 47 deg 36' 45.04"
GPS Longitude Ref : West
GPS Date Stamp : 2014:04:17
GPS Longitude : 122 deg 20' 0.10"
GPS Time Stamp : 01:19:28
Modify Date : 2014:04:16 18:20:08
XMP Toolkit : Adobe XMP Core 5.1.0-jc003
Blur At Infinity : 0.017260155
Focal Distance : 18.298956
Focal Point X : 0.5
Focal Point Y : 0.5
Mime : image/jpeg
Format : RangeInverse
Near : 11.670198440551758
Far : 53.99827575683594
Mime : image/png
Has Extended XMP : 16D07BD6549EF7884C2D15AB36A95F28
Data : (Binary data 369408 bytes, use -b option to extract)
Data : (Binary data 204032 bytes, use -b option to extract)
JFIF Version : 1.01
Resolution Unit : None
X Resolution : 1
Y Resolution : 1
Image Width : 1536
Image Height : 2048
Encoding Process : Baseline DCT, Huffman coding
Bits Per Sample : 8
Color Components : 3
Y Cb Cr Sub Sampling : YCbCr4:2:0 (2 2)
GPS Date/Time : 2014:04:17 01:19:28Z
GPS Latitude : 47 deg 36' 45.04" N
GPS Longitude : 122 deg 20' 0.10" W
GPS Position : 47 deg 36' 45.04" N, 122 deg 20' 0.10" W
Image Size : 1536x2048

メタデータ部分に二つのバイナリデータが存在するのが確認できます。これを出力してみるとこれらはXMPとして記録されているデータであることがわかりました。一つはPNGファイル、そしてもう一つがJPEGファイルです。

まずはJPEGファイルを出力してみました。

exiftool -X -b IMG_20140416_181937.jpg | sed -n '/XMP-GImage:Data/{s/.(.)<\/XMP-GImage:Data>.*/\1/;p}' | base64 -d > IMG_20140416_181937_xmp.jpg

GImage:Dataに含まれるのは以下の画像でした。つまり、これはカメラが見たそのものの画像となります。

GImage:Data

もう一つPNGとして記録されている画像は次のように出力しました。

exiftool -X -b IMG_20140416_181937.jpg | sed -n '/XMP-GDepth:Data/{s/.(.)<\/XMP-GDepth:Data>.*/\1/;p}' | base64 -d > IMG_20140416_181937.png

こちらの名称はGDepth:Dataで、被写体の距離が示されたもので、色が濃いほど近くのものとなります。

GDepth:Data

この機能を使用して撮られた写真は単体で深度情報を含んでいるため、例えば他の機種で撮った写真をGoogle Cameraがインストールされた機種にコピーなどをするとそのままフォーカスを再度変えたりすることができます。Google+なんかでブラウザ上でこれができたら面白いと思うのですが、必要な情報は全てファイルに内包しているということもあり、実現されるかもしれません。

Raspberry Piを使用したリモートVPN接続ポイントの構築

先日、固定IP接続を実現するために職場で使用しているVPN接続サービスのルータ配置を自宅に移動しました。現在職場はオフィスビルに立地しているにも関わらず、Clear(WiMax接続サービス)以外に現実的に使用できる回線がなくローカル、リモートの接続とともにボトルネックになりつつあったからです。VPN接続ポイントを外に配置することにより、アクセススピードの高速化を実現することになりました。

職場に設置していた時にはLinuxを走らせているPCでアクセスを制御していましたが、自宅に設置するにあたり、より電源効率の良い、ポータブルなものにする、ということで、Raspberry Piを採用することにしました。(一応自宅にもLinuxマシンは常時走っているのは走っているのですが、責任分界的にも自宅LANと会社LANは完全に隔離しておきたかった、という狙いもあります。)

リモートからVPNにアクセスするにあたっていろいろと検討した上で、最近オープンソフトされたSoftEtherを採用することにしました。

  • 設定が比較的簡単であること
  • OpenVPNやL2TP/IPSecなどを使用できること。特にMac用のSoftEther接続ソフトは現在提供されていない(サーバはある)ため、これは重要な判断基準となりました。

また、以前、UT-VPNは試用していたことがあるため、SoftEtherはそれに近い、ということも判断の一つでした。

SoftEtherの設定は非常に簡単に行えましたが、カーネルモードのNATが使用されている場合、スタックの関係上からか、DHCPがVPNより下のレイヤーからIPを取得してしまう問題があり、DisableKernelModeSecureNATを使用し、ユーザーモードでNAT環境を作ることで解決しました。SoftEtherの独特な設定環境(例えばnattableとsecurenattableが別の意味を持っていることなど)で少し混乱があり、NATが有効になっていなかった、という問題などはありましたが、無事環境を構築することができました。

パフォーマンス的にどこまでいけるか、という不安はありましたが、接続時などのCPUのロードは20%でぐらいで、問題なく使用できると判断でき、専用のRaspberry Piを購入し、現在実運用中です。

回転寿司とRFID

回転寿司の機械は一定時間でベルトから落とされる仕組みになっていて、恐らくRFIDみたいな仕組みになっていたのだろうと思っていたので調べて見ました。

IMG_20130511_191405

食べ終わった変哲のないトレイ、裏返してみると何か中に入っているような感じ。

IMG_20130511_192931

普通のRFIDで管理されているんだろうか、と思って、スマフォのRFIDを当てて見ました。

Screenshot_2013-05-11-19-12-28

内蔵されているのはNXPのSL2ICS20というチップが使われているようです。

Screenshot_2013-05-11-19-34-59

Screenshot_2013-05-11-19-35-09

メモリの内容は大した情報は入っていないようですが、トレイごとに微妙な差があったので、カウントなどは書き込まれている可能性があります。尚、画面写真ではアンロックとなっていますが、実際は書き込み制限がチップには設定されていました。(フォーマット化、と出ていたので書き換えが全くできなくなるハードロックではなく、条件が合えば書き込めるソフトロックであるかもしれません。)

Screenshot_2013-05-11-19-35-39

Screenshot_2013-05-11-19-35-58