見出し画像

植物を3Dで記録しスマホで管理したい

この記事はUMITRON Advent Calendar 2024 9日目の記事です。


こんにちは、UMITRONの宮山(@jkatagi)です。昨年に引き続き、植物の栽培にハマっています。そこで今回は植物に関する記事を書いてみます。


はじめに

植物を育てていく上で、日々の観察と記録が大切です。特に写真でこまめに撮影しておくと、後から成長を見返すことができます。

サンスベリア・バナナ
この9ヶ月で新しく葉っぱが2枚でた

ただ写真で正面から撮っておくだけだと、後から見たとき「裏側どうなっていたっけ?」や「上から見た姿どんな感じだったかな」となることもあります。
そこで本記事では植物を3Dで記録することに挑戦してみようと思います。

現実に存在する物体を手軽に3Dモデル化する手法

現実に存在する物体を手軽に3Dモデル化する手法は、大きく分けて2つあります。1つは、LiDARや深度センサーを使った3Dスキャンの技術です。これらは対象物にレーザー光や赤外線を当て、その反射を計測して3Dモデルを作成します。最近ではiPhoneやiPadにLiDARスキャナを搭載した機種が出て、手軽にLiDARスキャンが行えることが一時期話題となりました。

もう1つはPhotogrammetryで、普通のカメラで対象物をさまざまな角度から撮影し、それらの画像を合成して3Dモデルを作成します。特別な機材が不要なため、手軽に始められる点が特徴です。今回は、特別な機材を使わずに手軽に実施できるPhotogrammetryを採用しました。

撮影方法

撮影にはGoogle Pixel 6aを用いました。
撮影方法としては、最初は植物の周りを私自身がぐるっと回って撮影していました。ところがこの方法だと植物以外の不要なものがモデリングされてしまったり、陰影が入り込んでしまいうまく3Dモデルが作成できないことがわかりました。

植物以外の物が写ってしまっている

何かいい方法がないか探していたところ…1

上記のYouTubeで以下の手法が紹介されていました。

  • その1:撮影対象を中央に置き、それを回転台に乗せて回転させて撮影する

  • その2:グリーンバックのような単色の背景を用意する

その1については回転台がなかったので鉢を手動で回転させ、その2についてはソフトウェアで解決することにしました(後述します)。
また撮影時に手ブレしないようにスマホを固定し、画面を長押ししてAE/AFロックしました。そして今度は植物の鉢自体を回転させながら合計35枚撮影しました。

撮影風景。スマホのスタンドがなかったためマイクのスタンドで代用した

使用したソフトウェア

3Dモデルの作成にはOpenMVS + OpenMVGを使用しました。OpenMVSはOpenMVGの実行も含んでいるため、OpenMVSの実行環境を準備しました。OpenMVSはDockerが用意されていますが自分の環境ではうまく走らなかったため、こちらも参考にしつつ自前でDockerfileを用意しました。なおOpenMVSの実行時に撮影したカメラのセンサー情報が必要なため、ネットで調べてDockerfileに追記しています。

加えて前処理としてBackgroundRemoverで背景画像を除去しました。なお背景画像を除去した後はPNG形式になり、OpenMVSには(カメラ情報付きの)JPEG形式が必要になるため、以下のスクリプトで対応しました。

#!/bin/bash
for input_file in *.jpg; do 
    output_file_prefix=${input_file%.jpg}_removed
    # 背景を除去
    backgroundremover -i ${input_file} -o ${output_file_prefix}.png
    # JPEG形式に変換
    magick ${output_file_prefix}.png ${output_file_prefix}.jpg
    # EXIF情報(カメラ情報)をコピー
    exiftool -tagsFromFile ${input_file} -all:all ${output_file_prefix}.jpg
    # 不要なファイルを削除
    rm ${input_file} ${output_file_prefix}.jpg_original
done
# 不要なPNGを削除
rm *.png

BackgroundRemoverによって背景画像を綺麗に取り除くことができました。

BackgroundRemoverにより背景除去

作成した画像を images というディレクトリに格納し、以下のコマンドを実行して3Dモデルを作成しました。

# 作成したDockerfileをbuild
docker build . -t open_photogrammetry
# 実行
docker run --name photogrammetry --rm -v ./images:/images -v ./work:/work -it open_photogrammetry python3 /opt/bin/MvgMvsPipeline.py /images /work --1 p HIGH n 8

15分ほどすると3Dモデルが生成されます。作成したファイルはPLY形式で、これはMeshLabというソフトで確認できます。

作成した3Dモデル。なおここまでに20回ほど試行錯誤しました…

注意点としてDockerのメモリが足りないと異常終了してしまうので、ノートパソコンに搭載しているメモリ16GBを上限として設定しました。

作成した3Dモデルをスマホで表示する

上記ではMeshLabで表示しましたが、スマホで確認したいのでFlutterを使ったアプリの作成にも挑戦しました。幸いにもFlutterでFlutter 3D Controllerというライブラリがあり、こちらのExampleに書かれているように記述すると表示することができます。

ただ上記で作成したファイルはPLY形式で表示できないので、GLB形式で保存し直しました。

import trimesh

mesh = trimesh.load('scene_dense_texture.ply')
mesh.export('scene_dense_texture.glb')

作成したglbファイルをassetsディレクトリに移動し、Flutterを実行すると作成した3Dモデルが表示されます。

3Dモデルをエミュレーターで表示

おわりに

本記事では3Dモデルの作成からアプリでの表示まで行いました。今回はコマンドラインから3Dモデルの作成を行いましたが、これをAPI化すればスマホからファイルの転送 → 3Dモデルの作成 → スマホ上で表示までできそうです。


ウミトロンは、「持続可能な水産養殖を地球に実装する」というミッション実現に向けて、日々プロダクト開発・展開にチーム一丸となって邁進しています。
ウミトロンのニュースや活動状況を各種SNSで配信していますので、ぜひチェックいただき、来年も応援よろしくお願いします!
Facebook https://www.facebook.com/umitronaqtech/
X https://x.com/umitron
Instagram https://www.instagram.com/umitron.aqtech/
Linkedin https://www.linkedin.com/company/umitron

いいなと思ったら応援しよう!