おっぱい山をFOSS4Gでアーカイブする方法
この記事はFOSS4G Advent Calendar 2016の20日目の記事です。
今年のFOSS4G Tokyoの特別セッションは「アーカイブ×FOSS4G」というテーマで、大変刺激を受けました。
ということで私もそれにのっかって、おっぱい山をFOSS4Gでアーカイブする方法を紹介したいと思います。
![]() |
| 仙台市上空よりおっぱい山を望む(巨乳化処理済み) |
2. 写真を撮る
おっぱい山が出来上がったら、UAV(ドローン)を用いた公共測量マニュアル(案)に従って写真を撮ります。ドローンはありませんので、スマホを手に砂場の周りをぐるっと回ってシャッターを押してください。注意点は、写真に位置情報が記録されるよう設定しておくこと、7割以上オーバーラップさせて撮影すること、公園にいるママさん達に不審がられないようにすることです。
![]() | ![]() |
| 撮影の様子。自分の影が写らないように。 | 撮影したおっぱい山(80枚) |
3. OpenDroneMapで3Dモデルとオルソ画像を作る
写真が準備できたら、OpenDroneMapで3Dモデルとオルソ画像を作成します。OpenDroneMapは、ドローンで撮影した空中写真から地形の3Dモデルとオルソ画像を作ることができるオープンソースのソフトウェアです。*1ドローンだけでなく、スマホで撮影した写真からでも作成できます。
3-1. Bash on Windowsの導入
OpenDroneMapをWindowsで使うためにBash on Windowsを導入します。Bash on Windowsとは、Windowsで動作するBashシェルです。これによってOpenDroneMapのようなLinux用のソフトもWindowsでコンパイル&実行できるようになります。導入方法はここでは説明しないので、適当にググってください。
3-2. OpenDroneMapのコンパイル
Bash on Windowsを起動して、以下のコマンドでGitHubからOpenDroneMapのソースをダウンロードします。
git clone https://github.com/OpenDroneMap/OpenDroneMap.git
~/.bashrcにパスを追加して、sourceコマンドで設定を読み直します。/your/path/の部分はソースのある場所に置き換えてください。
export PYTHONPATH=$PYTHONPATH:/your/path/OpenDroneMap/SuperBuild/install/lib/python2.7/dist-packages export PYTHONPATH=$PYTHONPATH:/your/path/OpenDroneMap/SuperBuild/src/opensfm export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your/path/OpenDroneMap/SuperBuild/install/lib
source ~/.bashrc
OpenDroneMapのフォルダに移動してコンパイルします。依存するライブラリなど諸々インストールされるので結構時間がかかります。(1時間ほど)
cd OpenDroneMap bash configure.sh
3-3. GCP(グラウンドコントロールポイント)の作成
OpenDroneMapを実行する前に、写真の位置あわせをするためのGCPを作成しておきます。スマホの写真には位置情報が記録されているのでGCPがなくてもオルソ画像は出来ますが、精度をあげるために作成します。GCPファイルは、gcp_list.txtという名前で以下のフォーマットで作成します。
coordinate system description x1 y1 z1 pixelx1 pixely1 imagename1 x2 y2 z2 pixelx2 pixely2 imagename2 x3 y3 z3 pixelx3 pixely3 imagename3
coordinate system descriptionは位置の投影法、x1,y1,z1は位置座標、pixelx1,pixely1は写真のピクセル座標、imagenameは写真ファイル名です。1枚の写真に対して最低5点ぐらいはあると良いようです。具体的には、こんな感じです。
WGS84 UTM 54N 494399.2 4232697.1 5 333 1590 IMG_6785.jpg 494399.2 4232697.1 5 758 1698 IMG_6786.jpg 494399.2 4232697.1 5 877 1942 IMG_6787.jpg
手動でこのファイルを作ろうとすると結構手間ですが、支援ツールもあるようなので、利用してみると良いかもしれません。*2
3-4. OpenDroneMapを実行する
プログラムを実行する準備として、OpenDroneMapフォルダの直下にoppaiyamaフォルダを作成します。さらにoppaiyamaフォルダの中にimagesフォルダを作って、そこにスマホで撮影したおっぱい山の画像を入れておきます。gcp_list.txtはoppaiyamaフォルダの直下に入れます。
その後、以下のコマンドでプログラムを実行します。写真の枚数や設定にもよりますが、80枚で30分ぐらいはかかるので、気長に待ちます。
sh run.sh --project-path oppaiyama --odm_georeferencing-useGcp --odm_orthophoto-resolution 1000
実行パラメータは、色々ありますが、今回は、gcpを使用して、オルソ画像の解像度を1000pixcel/mと設定しておきます。
パラメータの詳細は、ここを参照してください。https://github.com/OpenDroneMap/OpenDroneMap/wiki/Run-Time-Parameters
4. OpenDroneMapのデータをCesium用に変換する
OpenDroneMapで作成した地形データをCesiumで表示するためデータを変換します。Cesiumとは、地図をブラウザで3D表示できるオープンソースのjavascriptライブラリです。Cesiumの使い方は、このあと説明しますが、とりあえず読み込むためのデータを作成しておきます。
CesiumにOpenDroneMapのデータを読み込む方法は二通りあります。一つは、objファイルをgltf形式の3Dモデルに変換して読み込む方法です。もう一つは、lasファイル(点群データ)をCesium用の標高タイルに変換して読み込む方法です。
4-1.(方法その1) objファイルをgltf形式の3Dモデルに変換する
おっぱい山を3Dモデルとして読み込むために、まずmeshlabでobjファイルをcollada(dae)形式に変換します。
odm_texturingフォルダの中のodm_textured_model_geo.objをMeshLabに読みこんでcollada(dae)形式でエクスポートします。その際、MeshLabでいらない部分を消すなど編集しておくと良いかもしれません。ファイル名は「oppaiyama.dae」としておきます。
次に、collada(dae)形式をgltf形式に変換するためcollada2gltfというソフトをGitHubからダウンロードしてコンパイルします。*3
git clone https://github.com/KhronosGroup/COLLADA2GLTF.git cd COLLADA2GLTF cmake . make sudo make install
以下のコマンドで、oppaiyama.daeをoppaiyama.gltfに変換します。-eはテクスチャ等も同梱するオプションです。
collada2gltf -e -f oppaiyama.dae -o oppaiyama.gltf

4-2.(方法その2)lasファイルを標高タイルに変換する
おっぱい山を標高タイルとして読み込むために、LastoolsでlasファイルをDEMデータに変換します。まず、Lastoolsを以下からダウンロードます。
http://www.cs.unc.edu/~isenburg/lastools/
Lastoolsの一部のツールは残念ながらフリーウェアではありません。今回使用するlas2dem.exeも商用使用だと有料になりますが、個人的に使用する分にはサイズ制限はありますが使用できるようです。*4ソフトを解凍したら以下のコマンドで変換します。ただし、las2dem.exeはWindows用の実行ファイルなので、Bash on Windowsではなく、別途、PowerShellを起動して実行します。変換するlasファイルは、odm_georeferencingフォルダに入っているodm_georeferenced_model.ply.lasを使用します。
cd Lastools\bin las2dem.exe -i odm_georeferenced_model.ply.las -o dem.tif -elevation -step 0.001 -utm 54N -nodata 0
オプションの設定は、高さ方向0.001mの解像度で、UTM54の投影法、nodataは0の標高データをdem.tifで出力するとなっています。
次に、DEMデータをCesium用の標高タイル(heightmap-1.0 terrain format)*5に変換するため、Cesium Terrain Builderをコンパイルします。Cesium Terrain Builderのコンパイルには、gdal2.0.0以上が必要なので、以下のコマンドでgdalをアップデートしておきます。(Bash On Windowsでの作業に戻っているので間違えないように)
sudo add-apt-repository ppa:ubuntugis/ppa && sudo apt-get update sudo apt-get install libgeos-c1v5 gdal-bin
gdalをアップデートできたら、Cesium Terrain Builderのソースをダウンロードしてコンパイルします。
git clone https://github.com/geo-data/cesium-terrain-builder.git cd cesium-terrain-builder mkdir build && cd build && cmake .. sudo make install
ソフトは準備できましたが、今回のデータは対象範囲が狭すぎるためそのままでは上手く変換できません。そのため、Cesium Terrin Builderで変換する前にgdal_translateで巨乳化処理をしておきます。
gdal_translateの-a_ullrオプションで範囲を1000倍に拡大し、-scaleオプションで高さも1000倍にして最低標高を調整しておきます。ついでに-projwinオプションで必要な範囲にクリップします。(nodataを範囲に含むと変換結果がおかしくなる?ので切り取る)
gdal_translate -projwin 494398.737 4232696.642 494400.030 4232694.956 -scale 4.740 5.160 -80 340 -a_nodata -9999 -a_ullr 494398.737 4232696.642 495893.03 4231008.956 dem.tif dem_scale.tif
Cesium Terrain Builderのctb-tileコマンドで、DEMデータを標高タイルに変換します。標高タイルはterrainフォルダに保存します。
mkdir terrain ctb-tile -o terrain dem_scale.tif
標高タイルには以下の定義ファイルも必要なので、「layer.json」という名前でterrainフォルダの中に入れておきます。
{
"tilejson": "2.1.0",
"format": "heightmap-1.0",
"version": "1.0.0",
"scheme": "tms",
"tiles": ["{z}/{x}/{y}.terrain"]
}また、0/1/0.terrainと0/0/0.terrainは必須(?)のようなので、0/0/0.terrainを、そのまま0/1/0.terrainとしてコピーしておきます。(今回のデータ範囲は、0/0/0の領域ではないので作成されていないため)
オルソ画像も地図タイルにしておきます。dem.tifと同じように範囲を1000倍に拡大して、png形式の地図タイルに変換しておきます。なお、ctb-tileで作成される地図タイルはtmsなので原点は南になります。
gdal_translate -projwin 494398.737 4232696.642 494400.030 4232694.956 -a_ullr 494398.737 4232696.642 495893.03 4231008.956 odm_orthophoto.tif ortho_scale.tif mkdir ortho ctb-tile -p mercator -f png -o ortho ortho_scale.tif
ctb-tileのオプションの詳細は、こちらにあります。https://github.com/geo-data/cesium-terrain-builder
5. Cesiumでおっぱい山を表示する
おっぱい山のデータが出来上がったので、これをCesiumで表示してみます。
5-1. Cesiumを用意する

Cesiumのサイトからライブラリをダウンロードします。
https://cesiumjs.org/
解凍するとファイルとフォルダが色々入っていますが、使用するのはAppsフォルダの中のHelloWorld.htmlとBuildフォルダの中のCesiumフォルダ一式になります。
ひとまず動作確認のために、Bash on Windowsで以下のコマンドを打って、簡易ウェブサーバーを起動します。その後、ブラウザで http://localhost:8000/ にアクセスして「Hello World」のリンクをクリックしてみましょう。Ctrl+Cでサーバーを終了できます。
cd Cesium-1.28 python -m SimpleHTTPServer
5-2. gltfの読み込み
gltfを読み込む場合は、以下のコードをHelloWorld.htmlに追加します。3Dモデルを正しい方向で読み込むには、中心を軸に-90度回転させる必要があります。高さの中心は、今回は見た目で微調整しました。Cesiumの高さの基準は楕円体面(海面0mではない)なので、そのへんの調整も必要です。
var center = Cesium.Cartesian3.fromDegrees(140.9360018, 38.2422495, -5.5);//地形を読み込む場合は42.5にする
var heading = 0.0;
var pitch = 0.0;
var roll = -Math.PI / 2.0;
var hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll);
var transform = Cesium.Transforms.headingPitchRollToFixedFrame(center, hpr);
var model = viewer.scene.primitives.add(Cesium.Model.fromGltf({
url:"./oppaiyama.gltf",modelMatrix : transform, scale : 1.0})
);
5-3. 標高タイルとオルソ画像の読み込み
標高タイルとオルソ画像の地図タイルを読み込む場合は、以下のコードをHelloWorld.htmlに追加します。オルソ画像の地図タイルは、南が原点となっているので{reverseY}と指定します。
var terrainProvider = new Cesium.CesiumTerrainProvider({
url : './terrain'
});
viewer.terrainProvider = terrainProvider;
var ortho = new Cesium.UrlTemplateImageryProvider({
url: './ortho/{z}/{x}/{reverseY}.png'
});
viewer.scene.imageryLayers.addImageryProvider(ortho);
5-4. おっぱい山の表示
ついにCesiumで表示できるところまで来ました。5-1.と同様に簡易ウェブサーバーを起動して確認したいところですが、gzip形式で圧縮されている標高タイルは、そのままではSimpleHTTPServerでは配信できません。そこで、元のSimpleHTTPServer.pyをコピーして以下のコードを加えます。こうすると拡張子が.terrainの標高タイルはgzip形式として配信されます。
cp /usr/lib/python2.7/SimpleHTTPServer.py ./Cesium-1.28
self.send_response(200)
self.send_header("Content-type", ctype)
## SimpleHTTPServer.pyの95行目以降に以下の3行加える(send_head関数内)##
base, ext = posixpath.splitext(path)
if ext == ".terrain":
self.send_header("Content-Encoding", "gzip")
###################################################なお、通常のウェブサーバーの場合は.htaccessを以下のように記述して設置しておきます。
AddType application/octet-stream .terrain AddEncoding x-gzip .terrain
SimpleHTTPServer.pyを変更したら簡易サーバーを起動しましょう。5-1.の時と違って、-m オプションは付けずに.pyも含むので間違えないように。
python SimpleHTTPServer.py
http://localhost:8000/Apps/HelloWorld.html にアクセスしてみましょう。(簡易サーバーだと、読み込みに少し時間がかかります。また、時々gltfの読み込みに失敗するので、表示されない場合はShift+リロードしてみます。)


6. アーカイブをVRで体験
ここまでの作業で、おっぱい山をアーカイブして、Cesiumで表示することができました。Cesiumでは、さらにヴァーチャルリアルティ(VR)表示も可能なので、やってみましょう。以下のようにhtmlを変更すると、画面右下にVRボタンが表示されるようになります。
var viewer = new Cesium.Viewer('cesiumContainer', {
vrButton : true
});VRボタンを押すと2画面表示になり、Google Cardboardのようなヘッドセットで見ると臨場感あふれるバーチャルリアリティ体験ができます。
※ VR表示はiPhoneには対応していませんが、PCでVR表示させた画面をリモートデスクトップでスマホに表示すれば可能になります。

まとめ
子供と作った砂場のおっぱい山は、夕日とともに崩れてなくなってしまいますが、このようにアーカイブしておけば、思い出と一緒に永遠に残しておくことができます。
プライスレスなこの活動、FOSS4Gがあれば誰でもできます。皆さんもぜひお試しください!それでは、良いクリスマスを。
追伸:
Google Cardboadは、このあと別のおっぱい山の閲覧に有効活用させていただきました。VRすげーよ。ムフフ。
参考リンク
この記事に使用した画像、コード
おっぱい山アーカイブ
http://ecoris.co.jp/map/Cesium-1.27/Apps/HelloWorld.html
http://ecoris.co.jp/map/Cesium-1.27/Apps/HelloWorld1.html
http://ecoris.co.jp/map/Cesium-1.27/Apps/HelloWorld2.html
OpenDroneMap関連
https://github.com/OpenDroneMap/OpenDroneMap
https://github.com/OpenDroneMap/OpenDroneMap/wiki/Running-OpenDroneMap
https://github.com/OpenDroneMap/OpenDroneMap/wiki/Run-Time-Parameters
http://lists.osgeo.org/pipermail//opendronemap-users/2016-June/000314.html
https://github.com/wolkstein/OpenDroneMap-GCP_LIST.TXT-generator
データ変換関連
http://www.cs.unc.edu/~isenburg/lastools/
https://www.cs.unc.edu/~isenburg/lastools/download/las2dem_README.txt
https://github.com/KhronosGroup/COLLADA2GLTF
https://github.com/geo-data/cesium-terrain-builder
https://github.com/AnalyticalGraphicsInc/obj2gltf
http://www.sarasafavi.com/installing-gdalogr-on-ubuntu.html
http://blog.mastermaps.com/2014/10/3d-terrains-with-cesium.html
http://blog.mastermaps.com/2016/09/creating-tins-in-saga-gis.html
http://blog.mastermaps.com/2016/09/creating-tin-from-raster-dem.html
https://cesiumjs.org/data-and-assets/terrain/formats/heightmap-1.0.html
http://cesiumjs.org/data-and-assets/terrain/formats/quantized-mesh-1.0.html
http://www.pdal.io/
*1:商用だとPhotoScanとかPix4Dなどがありますが、これらはウン十万円もする高価なソフトで、個人ではとても手がでません。そのようなツールと同等なものを使えるのは、ほんとFOSS4Gのおかげです。ただ、まだまだ開発途中で商用のものに及ばない部分は沢山ありますが。
*2:https://github.com/wolkstein/OpenDroneMap-GCP_LIST.TXT-generator
*3:obje形式から直接gltf形式に変換できるobj2gltfというソフトもありますが、テクスチャが表示できない不具合(?)があったので見送りました。
*4:PDALとかOpenDroneMapでDEMに変換できると良いのですが
*5:Cesium用の標高タイルはheightmap-1.0 形式のほかに、quantized-mesh-1.0 形式というものがあります。こちらの形式は標高データをTINにして、それをタイルに切り分ける方法のようですが、まだ使いやすい変換ソフトが無いようなので試せていません
ドローンで撮影しすぎた写真を間引く方法
ドローンのインターバル撮影で撮りすぎた写真をPhotoscanに入れる前に間引くプログラムです。
以下のように実行します。
# python extract_photo.py Z:\DCIM
引数で指定したフォルダの中のjpgを一定の割合でno_useフォルダに移動します。
間引く割合はプログラム中のratioで指定します。
no_useフォルダは、指定したフォルダの中に作られます。
# -*- coding: utf-8 -*-
import glob
import shutil
import sys
import os
# 説明と使い方
# ドローンのインターバル撮影で撮りすぎた写真をPhotoscanに入れる前に間引くプログラム
# 指定したフォルダの中のjpgをratioの割合でno_useフォルダに移動させる
# python extract_photo.py Z:\DCIM
ratio = 2 #何枚に1枚移動させるか
args = sys.argv
search_dir = args[1]
print(search_dir)
files = glob.glob(search_dir + os.sep + '*.jpg')
save_dir = search_dir + os.sep + "no_use"
if not os.path.exists(save_dir):
os.mkdir(save_dir)
i=0
for file in files:
if i % ratio == 0:
shutil.move(file, save_dir)
i = i+1
Phantom3のExif情報(高さ)を確認&補正する方法
追記:
このような情報もありました。
http://gpsrsgis.seesaa.net/article/441683778.html
===
現時点(2016.3.3)でのファームウェアではPhantom3で撮影した画像のEXIFに記録される高度には、「GPS Altitude」と「Relative Altitude」の二種類あります。
「GPS Altitude」は、GPSで測位した標高楕円体高で精度はあまり良くないようです。
「Relative Altitude」は、気圧センサーによる対地高度で、精度は「GPS Altitude」よりも良さそうです。
※「GPS Altitude」は、標高値としての精度は良くないですが、フライト中の相対的なバラつきは、少ないのかもしれません(分かりません)。
Photoscanでは、高さの値は「GPS Altitude」が参照されるので、出来上がりの高さ(標高値)がズレてしまいます。
そのため、exiftoolを使ってEXIF情報(高さ)を補正する方法を紹介します。
※PhotoscanのCamera Calibration→GPS/INS Offsetを利用するれば補正できるのかもしれませんが、良くわかりません。
1. exiftoolのダウンロード
ここからダウンロードします。
http://www.sno.phy.queensu.ca/~phil/exiftool/
コマンド終了時にEnterを押さなくても良いようにファイル名を以下のように変更しておきます。
exiftool(-k).exe→exiftool.exe
2. 高度の確認
コマンドプロンプトで以下のように打つと、EXIF情報を確認できます。
exiftool.exe DJI_0001.JPG
抜粋
About : DJI Meta Data Format : image/jpg Absolute Altitude : +3.27 Relative Altitude : +51.60 Gimbal Roll Degree : +0.00 Gimbal Yaw Degree : -65.10 Gimbal Pitch Degree : -89.90 Flight Roll Degree : +0.30 Flight Yaw Degree : -65.30 Flight Pitch Degree : +0.90 Version : 7.0 Has Settings : False Has Crop : False Already Applied : False MPF Version : 0010 Number Of Images : 2 MP Image Flags : Dependent child image MP Image Format : JPEG MP Image Type : Large Thumbnail (VGA equivalent) MP Image Length : 273323 MP Image Start : 4512084 Dependent Image 1 Entry Number : 0 Dependent Image 2 Entry Number : 0 Image UID List : (Binary data 66 bytes, use -b option to extract) Total Frames : 1 Image Width : 4000 Image Height : 3000 Encoding Process : Baseline DCT, Huffman coding Bits Per Sample : 8 Color Components : 3 Y Cb Cr Sub Sampling : YCbCr4:2:2 (2 1) Aperture : 2.8 GPS Altitude : 3.2 m Above Sea Level GPS Latitude : 35 deg 23' 59.25" N GPS Longitude : 139 deg 16' 58.14" E GPS Position : 35 deg 23' 59.25" N, 139 deg 16' 58.14" E Image Size : 4000x3000
対地高度(Relative Altitude)が51.6mなのに標高値(GPS Altitude)が3.2mになってしまっています。
3. GPS AltitudeをRelative Altitudeに変更
以下のコマンドを打って、imagesフォルダに入っているJPGファイルのGPS Altitudeの値を Relative Altitudeの値に変更します。なお、gpsaltituderefの値は0だと標高値がプラス、1だと標高値がマイナスを表すので、微妙な場所を飛行させた場合は、個別に考えてください。
※ファイルは上書き更新するようにしているので、あらかじめコピーしておいた方が良いかもしれません。
for %i in (images\*.JPG) do exiftool %i -s -s -s -RelativeAltitude | exiftool -overwrite_original %i "-GPSAltitude<=-" -gpsaltituderef#=0
4. GPS Altitude(Relative Altitudeの値が入っている)にオフセットを加える
Relative Altitudeの値は対地高度なので、それを標高値に変換するために、飛ばし始めの標高値を加えます。
ここでは、例として10mを加えています。
for %i in (images\*.JPG) do exiftool %i -overwrite_original -GPSAltitude+=10
以上です。
OpenDroneMapの使い方
ドローンで撮影した画像を合成して地図化するソフト「OpenDroneMap」をWindowsにインストールして実行する方法を紹介します。
https://github.com/OpenDroneMap/OpenDroneMap
1. docker-toolboxのインストール
ここからdocker-toolboxをダウンロードして、インストールします。
https://www.docker.com/products/docker-toolbox
virtualboxをインストールしていない場合は、途中で、「virtualboxをインストールする」かどうかの
チェックボックスが出るので、チェックを入れておきます。
2. Docker用のターミナル起動
Docker Quick Start Terminalを実行するとDocker用のターミナルが起動します。
なお、初回は、defaultというDocker用の仮想マシンが作成されます。
3. OpenDronMapのDockerイメージの入手
ターミナルで、以下のコマンドを打って、OpenDroneMapのイメージを入手します。
docker pull droneseed/opendronemap:latest
4.テスト画像の用意
ここからDownload ZIPを押してテスト画像を入手します。
https://github.com/tmizu23/odm_data_natori
解凍したフォルダは「odm_data_natori」と名前を変えてデスクトップに置いておきます。
5.OpenDroneMapの実行
ターミナルで以下のコマンドを打って、テスト画像の場所を指定します。
hogehogeは自分のユーザー名に置き換えてください。
export IMAGES=/c/Users/hogehoge/Desktop/odm_data_natori
以下のコマンドで、プログラムを実行します。
docker run -v $IMAGES:/images droneseed/opendronemap:latest
6.結果の確認
odm_data_natori\reconstruction-with-image-size-2400-resultsフォルダの中にジオレファレンス済みの画像「odm_orthphoto.tif」が出来上がっていると思うので、それをQGISで開いて表示されればOKです。
同じく、作成された点群ファイル「pointcloud_georef.laz」は以下のサイトにドラッグアンドドロップで確認できます。
http://plas.io
7.DSMの作成
起伏データが欲しい場合は、別途、lastoolsをダウンロードして、コマンドプロンプトで以下のコマンドを打ちます。
http://lastools.org/download/lastools.zip
LAStools\bin\las2las -i pointcloud_georef.laz -o pointcloud.las LAStools\bin\las2dem -i pointcloud.las -o dsm.tif
感想
Dockerって何?とかOpenDroneMapの細かい設定については、よく分かってません。
とりあえず、やってみただけなので、詳しいことはこれから勉強します。
Phantom3で撮影した4Kビデオから静止画をキャプチャする方法
Phantom3で撮影した4Kビデオから静止画をキャプチャする方法を紹介します。動画をPhotoscanの入力データにしたいときに使います。
1. ffmpegのダウンロード
2. 変換
ff-prompt.batを実行して、以下のコマンドを打ちます。
DJI_0063.MOVの動画ファイルをvideoフォルダの中に開始10秒地点から1秒あたり0.5枚(2秒に1枚)を6桁の連番で保存する
ffmpeg -i DJI_0063.MOV -ss 10 -r 0.5 -f image2 video\\mov%06d.jpg
複数のビデオをまとめて変換したい場合はこちら
for %f in (*.MOV) do ffmpeg -i %f -ss 10 -r 0.5 -f image2 video\\%f%06d.jpg
Phantom3の飛行ログをgoogle earthで確認する方法
Phantom3の飛行ログをgoogle earthで確認する方法を紹介します。
1. 機体から飛行ログを転送
以下のサイトを参考に機体に保存されている飛行ログをPCに転送します。
1. Phantom3を起動してDJI GOを立ち上げる
2. 設定画面でflight data mode にする。(日本語訳でそれっぽいのを探してください)
3. Phantom3とPCをUSBで接続する。USBの接続は機体の方(カメラじゃない方)
4. DATファイルをPCにコピーする。
3. 標高値の調整
変換したKMLの標高値が、ずれている場合は以下のスクリプトで調整します。
python repair_height.py > flight_path_repaire.kml
# -*- coding: utf-8 -*-
import sys
##高さの調整 この値を加える
height = 88
flag = False
for line in open('flight_path.kml', 'r'):
if "coordinates" in line:
flag = not(flag)
print line,
continue
if flag:
p = line.strip().split(',')
p[2] = str(float(p[2]) + height)
print ','.join(p)
else:
print line,
4. google earthで確認
kmlをgoogle earthで開けば飛行ログが確認できます。
レイヤパネル->[右クリック]->プロパティ->標高->[パスを地面に延長]のチェックを外すと飛行線だけになって見やすいかもしれません。
「おっぱい山」御神体の作成
先日、知人の結婚式で阿蘇に行ってきました。
阿蘇には米塚という見事な「おっぱい山」があります。

写真:「左:阿蘇山周辺(Landsat8、国土地理院標高タイルを使用)、右:阿蘇の米塚」
「おっぱい山」は、ジオパークの看板にあるように火山の噴石が円錐状に積み上がることによって形成されます。

写真:「阿蘇ジオパークの看板」
こういうのを「スコリア丘」と言うらしく伊豆の大室山や西之島も「おっぱい山」です。

写真:「左:大室山(出典:wikipedia)、右:西之島(出典:海上保安庁)」
「おっぱい山」は、その美しさで人々を魅了するですが、このように、その実態は火山だということを忘れてはいけません!もし、再び噴火が始まれば、おっぱい山を愛でることもままならず、最悪その美しさも損なわれる可能性があります。
そこで今回は、「おっぱい山が荒ぶることなく、美しくあり続けますよーに」と、どこからでも祈願できるように「おっぱい山」御神体 を作成してみたいと思います。
【用意するもの】
- ラズベリーパイ ×1個
- 寒天クック ×4g
- 牛乳 ×1カップ
- 「おっぱい山」の型 ×1山
- LED ×2個
- Webカメラ ×1個
- 地理院地図 ×1枚
- Amazon Web Service ×1アカウント
1. 御神体の準備
「おっぱい山」御神体を作成するために、まず型を用意します。
型を作るためのファイルは、地理院地図3Dからダウンロードしたstlファイルをchiriin3d_reverseで裏返して作成します。

写真:「左:地理院地図3DからダウンロードしたSTLファイルをmeshlabで表示、右:裏返して型にした状態」
これを3Dプリンタで造形すれば良いのですが、手元に使用できる3Dプリンタがありませんので、DMMのサービスを利用してみます。ファイルをアップロードして、しばらく待つと材料ごとの見積が作成されるのですが、、、
う〜ん、高いですね。。。
最安のナイロン製でも78,341円です。これからはmakersの時代だ!と思っていたのですが、この価格設定を見る限り、まだ時代はキテないのかもしれません。
ということで、3Dプリンタはあきらめて、お椀で代用します。これに寒天を注ぎ込み、30分冷蔵庫で冷やした後、慎重に取り出します。最後に、山頂部分にLEDを装着すれば御神体の本体部分の完成です。


写真:「おっぱい山御神体」(水を少なめにすると触感がいい感じになります)
2. ラズベリーパイとの接続
「おっぱい山」御神体にどこからでも祈願できるように、ラズベリーパイを御神体に接続してIoT化します。
ラズベリーパイには、無線LANのアダプタとWebカメラを装着します。また、GPIO端子は、御神体山頂のLEDと接続しておきます。あと、御神体側からメッセージを送るためのボタンも接続しておきます。
3.地理院地図の準備
「おっぱい山」御神体に祈願するためのインターフェースを地理院地図で作成します。
今年のfoss4g Tokyoの藤村さんのハンズオン資料を参考に、おっぱい山のポイントを2/3/1.geojsonで作成します。
ポイントを配置した場所は、左おっぱい山は阿蘇の米塚に、右おっぱい山は伊豆の大室山にしました。
ポイントをクリックすれば、おっぱい山への願いが送信できるように、2/3/1.geojsonのstyle.jsにPOST処理を追加します。また、御神体の最新状況を確認できるように、index.htmlに@oppaiyama38のツイートが表示されるツイッターウィジェットも追加します。
完成
こちらにアクセスすると、我が家の台所に祀ってある「おっぱい山」御神体に参拝できます。
http://tmizu23.github.io/tmizu23_gsimaps/
[表示できる情報]から [おっぱい山]を選択して、ポイントを表示させてください。
まとめ
地理院地図やラズベリーパイ、クラウド技術を誰でも簡単に利用できるようになったおかげで、おっぱい山をいつでもどこでも拝むことができるようになりました。
ただ、実物で見る「おっぱい山」の美しさは、やはり格別です。
是非、阿蘇に行って、実際の米塚を拝んでみてください!!!
(※おっぱい山どこですか?と聞いても通じないのでご注意ください。)
その他
今回作成した「おっぱい山」御神体ですが、我が家の中では、サンタクロースにメッセージを送る装置ということになっています。クリスマスに欲しいものをホワイトボードに書いてボタンを押すと、サンタクロースにその願いが届くかもしれないよ!そして、時々、ライトが赤く光るのは、サンタクロースを乗せたトナカイがこちらに向かっている合図だよ!と、子供達に伝えてあります。(実際には、ボタンを押すと、Webカメラで画像を撮影してツイートするだけなのですが、それは伝えてません)
そのため、Twitterにアップされた画像には、子供が欲しいクリスマスプレゼントが写り込んでいますが、気にしないでください。もし、不憫に感じた場合は、プレゼントを送ってもらうのは、構いませんのでご遠慮無く。
参考
設定方法など詳細に説明できると良かったのですが、間に合わなかったので、参考にしたページのリンクを張っておきます。(もっと、色々参考にした気がしますが、とりあえず)
- http://qiita.com/masato/items/715e28e0c0c945a54297
- http://blog.studiok-i.net/raspberry-pi/848.html
- http://mag.switch-science.com/2015/11/02/s3-lambda-iot-yun-continued/
- http://dev.classmethod.jp/cloud/aws/amazon-api-gateway-cors/
- http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/how-to-api-keys.html
- http://kintone-aws-iot-handson-2015.readthedocs.org/ja/latest/03.html
- https://github.com/foss4g-tokyo-vt/slides
- https://github.com/tmizu23/tmizu23_gsimaps
おっぱい山についてご存知ない方は、こちらも参考ください。
















