ストリートビュー(360度写真)を撮影するのを少し楽にするツールを作った

[個人開発 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/personal-developement)、3日目の記事です。
360度写真をスマホでキレイに撮影する方法を考えたのでまとめます。

# そもそも360度写真って何？
360度写真と言うよりストリートビューと言ったほうが伝わりやすいと思います。
あの360度見渡せる写真です。
[こう言う感じ※](https://maps.app.goo.gl/7JeALpSkna1Hrajg9)
一般的には専用カメラ（THETAやinsta360など）を使うのですが、
今回は360度写真をスマホで撮影する方法を考えたので軽くまとめます。

※この写真はストリートビューアプリを使って撮影したものです。
　（ストリートビューアプリは配信終了していて今は使えません・・・）

# スマホで撮影から360度写真ができるまでの工程
1. 360度全てを角度を変えながら撮影する※
2. スティッチングソフトで合成する
3. 完成！

ものすごく簡単に書きましたが手順1の撮影が結構大変です。
普通のカメラでは一度に360度を撮影することは出来ないので、
スマホを回転させながら360度全て撮影していきます。
そしてこの回転ですが、中心点がスマホ本体ではなく
撮影しているカメラのレンズを中心点として回転させなければいけません。

もちろん位置は固定でズレてはいけません。
これだと手持ちではどうしても無理なので専用の雲台を使います。
[Matterport Axis(yodobashi)](https://www.yodobashi.com/product/100000001007643522/)
※アフィリエイトリンクではありません。

# Matterport Axis を使うアプリを作る
Matterport Axisを使うには専用アプリが必要です。
なのですが、使うには有料プランに入る必要があります。
（無料でも使えるが制限がある）
その上、画質はお世辞にもいいとは言えないので制御アプリを自作しました。
[ソースリンク(Github)](https://github.com/ryotn/Matterport-Axis-Controller/tree/main/iOS/Panorama360_MatterportAxis)
今のところiOSのみですが、そのうちAndroid版も作る予定です。（気が向いたら）

# アプリの使い方
※前提としてMatterport Axisにスマホをセットする方法がわかっている事。
（これは通常通りMatterport Axisを使用するのと同じなのでMatterport Axisの説明書を読んでください）
1. 「Connect」をタップするとアプリがMatterport Axisに接続されます
2. 「Angle」が0になってることを確認して「Start Caoture」をタップ
3. 横に一周撮影が完了すると音がなります。
4. 縦方向の角度を変えて再度撮影
5. 2～4を360度全て撮影終わるまで繰り返す

# 写真の取り出し方
写真はアプリのフォルダに保存されます。
### ファイルアプリの場合
「このiPhone内」→「Panorama360_MatterportAxis」→「撮影した日付のフォルダ」内にあります。
<img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258005/adff5ec5-de88-66ad-0fcb-8c7f6b6adf8d.png">

### iTunesの場合
「ファイル共有」→「Panorama360_MatterportAxis」→「撮影した日付のフォルダ」内にあります。
![スクリーンショット 2023-11-28 223120.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258005/e345c881-02c5-ced2-03d3-9a59e2954d14.png)

# アプリ内のオプション
![IMG_0525.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258005/4ee8f0c6-34aa-03ff-61d4-4b57d5343acb.png)

1. 画面上部のスライダー
「focal length(焦点距離)」です。
基本的に0.8のままで大丈夫かと思います。
　
2. 「Normal / wide」
使用するレンズの選択です。
Normalは広角レンズ、wideは超広角レンズです。
iPhone SEのようにレンズが一つしかない端末だとクラッシュするかも。
　
3. 「15° / 30° / 45° / 60°」
横の回転角度です。
基本的に30度毎に撮影すれば問題ないですが、
超広角レンズを使うような狭い場所の場合は15度にすることをおすすめします。
45～60度は一応あるだけで使ってないです・・・
　
4. 「Connect / Disconnect」
Matterport Axisへ接続/切断するためのボタンです。
　
5. ステータス情報
Matterport Axisへの接続状態と角度を見れます。
　
6. 「Angle Reset」
Angleを0まで戻します。
Matterport Axisは右回転しか出来ないので、0度になるように右回転します。
　
7. 「Create Dir」
「写真の取り出し方」で説明した「撮影した日付のフォルダ」を生成します。
連続で別の場所を撮影する場合はこのボタンを押してフォルダを生成してください。
　
8. 「Start Capture」
撮影を開始します。
完了すると効果音がなります。
　
その他、一般的なスマホ用のカメラリモコンが使えます。

# 撮影した画像をスティッチする

撮影した画像はそのままでは360度写真にはなりません。
なので専用のソフトを使ってスティッチ（合成）します。

ソフトウェアは基本的に有料のものしかありません。
（検索すると無料のが出てきますが、配布終了していたりするので・・・）
　
有名なのは「PTGui」です。
スティッチもキレイにできますし、多機能なのでおすすめしたいところですがライセンス料が結構高いです。

自分は「PanoramaStudio 3 Pro」というソフトを使っています。
こちらはPro版でもUS$ 79.90とそこまで高くありません。

無料だとHuginというソフトがありますが、こちらは今回の撮影方法ではうまく行かないので使えません。

# 今回参考になった記事とかWebページ
Bluetooth LE周りは仕事で扱っていたので困ることはなかったのですが、
カメラ周りは触ったことがなかったので @t_okkan さんの以下の記事を参考にさせていただきました。
[Swiftでカメラアプリを作成する(1)](https://qiita.com/t_okkan/items/f2ba9b7009b49fc2e30a)
[Swiftでカメラアプリを作成する(2)](https://qiita.com/t_okkan/items/b2dd11426eab107c5d15)

スマホ用のカメラリモコンに対応するために、ボリューム監視する箇所はKazuo Tsubakiさんの以下のページを参考にさせていただきました。

[アプリの中でボリュームボタンを監視する方法 (iOS & Swift)](https://gist.github.com/kazz12211/9d58af5c42ecbe35de58d66418412690)

# それで実際はどんな感じに撮れるの？
試しに専用カメラ(insta360 X3）とiPhone 12 Proで取った写真の比較をしてみましょう。
insta360 X3は72MPモードで撮影しました。

![スクリーンショット 2023-11-28 221356.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258005/cbdbb6ae-5881-de85-9682-db9216341496.png)
左がiPhone 右がinsta360です。
引きで見るとそこまで大差無いですね。

ですが拡大してみると・・・
![スクリーンショット 2023-11-28 221430.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258005/3a26e894-f9c8-6716-f715-7810e3d049aa.png)
右のinsta360は椅子の輪郭が若干ボヤケていますが、左のiPhoneはクッキリしています。

他はストリートビューにアップロードしているのでこちらのリンクから見てください。
（高解像度なので表示されるまで時間がかかるかも）
### iPhone 12 Proで撮影
https://maps.app.goo.gl/w1aqBKv9qKf6Hguo8
https://maps.app.goo.gl/TNtpDMea2DjBeMFA7
https://maps.app.goo.gl/PyhYibbAN1msoU3Y9 (超広角レンズで撮影）
https://maps.app.goo.gl/T7bKkJ4GPQggsiD86
https://maps.app.goo.gl/mt6XA7YqVjj5kHz68
https://maps.app.goo.gl/etQFwhSNVrU88Rry6
### iPhone 14で撮影
https://maps.app.goo.gl/VvBx3H4Nq6vRrM7E7
https://maps.app.goo.gl/g3iNXfGWeypz8wxZ9

# おわりに
元々は手持ちでストリートビューアプリを使って撮影していました。
ですがどうしてもつなぎ目が自然にならず、
「キレイに撮るにはどうすればいいんだろう・・・？」
と色々試していたところにMatterport Axisを見つけました。
Matterport Axisを自作アプリで使えるようにするのは少し大変でしたが、
おかげてキレイに360度写真が撮れるようになりました。

今後は他の方法でもっと簡単に撮れないか？
スティッチをアプリ内で出来ないかやってみようと思います。