動画生成AIでインプット画像を作成してフォトグラメトリ（Meshroom）

# 記事の概要

動画生成AIで生成した一貫性の高い動画は、一貫性の高い画像に連続になるため、その画像をフォトグラメトリのインプットして、3Dモデルを作成する。

　動画（三次元＝X軸 × Y軸 × 時間）

　　　　　↓↓↓ 　   ↓↓↓
 
　3Dモデル（三次元＝X軸 × Y軸 × Z軸）

■動画

https://x.com/jun_kongo/status/1873227935123214705


■3Dモデル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/c3fffa9d-b9e3-ddf4-d23f-b8e5fa4491ec.png)

以下の記事を参考にしています。

https://styly.cc/ja/tips/photogrammetry-rinmizouchi-meshroom/#STYLY_Mobile

# 環境

OS：Windows 11
CPU：i7-10750H 16G
GPU：NVIDIA GeForce RTX 3060 Laptop 8G

# 準備

## インプット（動画生成 → 画像分割）

### 動画生成

今回はSoraを使って動画を生成する。
プロンプトは「キノコの周辺を一周する」。回転が遅い場合は「もう少し早く」などで回転を速くする。

https://openai.com/sora/

以下のキャプチャの流れで動画をダウンロードする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/10fa5e15-eb77-a541-fba2-99236fbd00b3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/96e3f3f2-9a5e-5066-8009-40615899318d.png)

### 画像分割

FFmpegなどを使って動画を分割する。

https://taziku.co.jp/blog/windows-ffmpeg

以下のコマンドなどで画像を分割する。

```
ffmpeg -i input.mp4 -vf fps=30 %03d.png
```

以下のように画像が分割される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/581e1711-4f01-1cd3-272a-f5ff6c7de25e.png)


## Meshroomのダウンロード

以下のページからWindows版のソフトをダウンロードする。

https://github.com/alicevision/meshroom/releases

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/2026385d-8e7a-61e4-1d53-2ef14229955e.png)

ダウンロードしたzipファイルを解凍すると、以下のようなフォルダがさ作成されるので、「Meshroom.exe」をダブルクリックなどで起動する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/87be2adf-e7ea-2d7d-5c90-8a14c29934de.png)

起動すると、以下のような画面が起動する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/544d3a19-d1f5-99a1-3e07-45fd362a2429.png)


## 注意事項

**注意として、この手順に関わるパスに、「C:\Users\XXXXX\OneDrive\デスクトップ\task」の「デスクトップ」のような日本語名が入ると、以下のようなエラーが発生するので、パスに日本語名が入らないようにしてください。**

```
Failed to Import Images - Meshroom 2023.3.0

You probably have a corrupted image within the images that you are trying to import.
```

```
[2024-12-28 23:26:07.580425] [0x0000443c] [trace]   Embedded OCIO configuration file: 'C:\Users\XXXXX\deep-learning\Meshroom-2023.3.0\aliceVision/share/aliceVision/config.ocio' found.
Program called with the following parameters:
 * allowSingleView = 1
 * allowedCameraModels = "pinhole,radial1,radial3,brown,fisheye4,fisheye1,3deanamorphic4,3deradial4,3declassicld"
 * colorProfileDatabase = "" (default)
 * defaultCameraModel = "" (default)
 * defaultFieldOfView = 45
 * defaultFocalLength = -1 (default)
 * defaultFocalRatio = 1 (default)
 * defaultOffsetX = 0 (default)
 * defaultOffsetY = 0 (default)
 * errorOnMissingColorProfile = 1 (default)
 * groupCameraFallback =  Unknown Type "enum EGroupCameraFallback"
 * imageFolder = "" (default)
 * input = "C:\Users\XXXXX\AppData\Local\Temp\tmp68yefuw2/CameraInit/961e54591174ec5a2457c66da8eadc0cb03d89ba/viewpoints.sfm"
 * lensCorrectionProfileInfo = "${ALICEVISION_LENS_PROFILE_INFO}"
 * lensCorrectionProfileSearchIgnoreCameraModel = 1
 * maxCoresAvailable =  Unknown Type "unsigned int" (default)
 * maxMemoryAvailable = 18446744073709551615 (default)
 * output = "C:/Users/XXXXX/AppData/Local/Temp/tmp68yefuw2/CameraInit/961e54591174ec5a2457c66da8eadc0cb03d89ba/cameraInit.sfm"
 * rawColorInterpretation =  Unknown Type "enum aliceVision::image::ERawColorInterpretation"
 * sensorDatabase = "C:\Users\XXXXX\deep-learning\Meshroom-2023.3.0\aliceVision\share\aliceVision\cameraSensors.db"
 * verboseLevel = "info"
 * viewIdMethod =  Unknown Type "enum aliceVision::sfmDataIO::EViewIdMethod"
 * viewIdRegex = ".*?(\d+)" (default)

Hardware :
        Detected core count : 12
        OpenMP will use 12 cores
        Detected available memory : 7520 Mo

ERROR:root:Error while building intrinsics: CameraInit failed with error code 3221226505.
Command was: "aliceVision_cameraInit  --sensorDatabase "C:\Users\XXXXX\deep-learning\Meshroom-2023.3.0\aliceVision\share\aliceVision\cameraSensors.db" --lensCorrectionProfileInfo "${ALICEVISION_LENS_PROFILE_INFO}" --lensCorrectionProfileSearchIgnoreCameraModel True --defaultFieldOfView 45.0 --groupCameraFallback folder --allowedCameraModels pinhole,radial1,radial3,brown,fisheye4,fisheye1,3deanamorphic4,3deradial4,3declassicld --rawColorInterpretation LibRawWhiteBalancing --viewIdMethod metadata --verboseLevel info --output "C:/Users/XXXXX/AppData/Local/Temp/tmp68yefuw2/CameraInit/961e54591174ec5a2457c66da8eadc0cb03d89ba/cameraInit.sfm" --allowSingleView 1 --input "C:\Users\XXXXX\AppData\Local\Temp\tmp68yefuw2/CameraInit/961e54591174ec5a2457c66da8eadc0cb03d89ba/viewpoints.sfm"".

QQmlComponent: Created graphical object was not placed in the graphics scene.
```

# フォトグラメトリ実行

インプットの画像をドラッグアンドドロップする。（フォルダ単位でも可）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/c853de25-b2b7-896c-9253-f0aff4c3ed5b.png)

以下のようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/aa6093d3-ea04-2618-e72c-7e5b296320a0.png)

「Start」をクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/266b2160-2010-5bb0-aba1-adf1173d5b7c.png)

以下のポップアップが表示されるので、「Save」をクリックしてプロジェクトのファイルを作成するか、「Continue without Saving」をクリックして、処理を開始する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/f799c101-4bea-4b93-6c84-c942999cae63.png)

以下のようになっていれば、処理が開始されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/b7ab9e86-1447-8591-196c-bd6f2c1d56a9.png)


## 結果

10分程度で、以下のような画面となる。

![スクリーンショット 2024-12-29 141355.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/08966b49-3614-9c3c-92d8-a5cc86044030.png)

プロジェクトを作成したフォルダ配下で、「MeshroomCache > Texturing > ランダムな文字列」フォルダ作成されており、「texturedMesh.obj」が作成されていることが確認できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/736b0846-d499-4f6c-3cd6-96cfe9d00e2e.png)

ちなみに、このカラフルなオブジェクトは、インプット画像から想定されている視点みたいなものなので、出力には関係がない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/2be91425-7929-8cac-ffc1-8a8f607827a5.png)




# 確認

## Blenderでの確認

Blenderを起動し、「File > Import > Wavefront(.obj)」をクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/8745dd96-c6a5-21c9-5c6c-3efda2790901.png)

「texturedMesh.obj」を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/6ed76183-30c8-7871-bc07-49a8a065368f.png)

以下のような3Dモデルが作成されていることが分かる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/8470d1ce-701c-61be-3184-bfbc1148f570.png)

ちなみに、360度全てをインプットにできていないため、角度を変えると破綻している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/282c5967-9773-0e6d-a55d-8c78beea5aeb.png)


# 感想

動画で見えている部分についてはかなりいい感じにモデリングできている。
動画に情報があるかが全て。