> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dwe.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# DWVO 録画の読み込み

> Python と OpenCV を使って .dwvo 録画を再生・エクスポート・解析します。

<div style={{ marginTop: '-40px' }} />

<Tooltip tip="DeepWater Video Object">`.dwvo`</Tooltip> は当社のマルチカメラ録画用コンテナで、Discovery で録画すると生成されます。ペイロードは MJPEG なので、ファイル内の各フレームはすでに完全な JPEG です。再生は `cv2.imdecode` 1 回で済み、エクスポートは再エンコードや品質劣化のないバイトコピーだけで行えます。

<Card title="Discovery での DWVO 録画" icon="video" href="/ja/discovery/misc/dwvo-support" horizontal>
  DWVO を初めて使いますか? まずはここから `.dwvo` ファイルのストリーミングと録画を始めましょう。
</Card>

```
DWE.ai | header: nCameras, width, height, pixelFormat, fps | ext data
block:   uint32 timestamp | per camera: busID\0, uint32 length, JPEG bytes
block:   ...
```

## 前提条件

* Python(バージョン 3.x)
* `opencv-python`、`numpy`、`pillow`
* `.dwvo` 録画ファイル — 以下の例では `test.dwvo` を使用します

## セットアップ

OpenCV Guides リポジトリをクローンし、このガイド用のフォルダーを開いてから、仮想環境を作成して依存関係をインストールします:

<CodeGroup>
  ```bash macOS / Linux theme={null}
  git clone https://github.com/DeepWaterExploration/opencv-guides.git
  cd opencv-guides/4-dwvo-read/python

  python3 -m venv venv
  source venv/bin/activate
  pip install -r requirements.txt
  ```

  ```bash Windows theme={null}
  git clone https://github.com/DeepWaterExploration/opencv-guides.git
  cd opencv-guides\4-dwvo-read\python

  python3 -m venv venv
  venv\Scripts\activate
  pip install -r requirements.txt
  ```
</CodeGroup>

## 再生

`main.py` はすべてのカメラをデコードし、1 つの OpenCV ウィンドウ内に並べて表示します。

```bash theme={null}
python main.py test.dwvo
python main.py test.dwvo --fps 60 --loop
```

| 引数 / キー     |                           |
| ----------- | ------------------------- |
| `--fps N`   | 再生レート。デフォルトはヘッダーの fps。    |
| `--loop`    | ファイルの終わりに達したら最初から再生し直します。 |
| `space`     | 一時停止 / 再開。                |
| `q` / `esc` | 終了。                       |

<Note>
  再生は固定スケジュールに従います: デコードが 1 フレーム分以上遅れた場合、そのフレームは遅れて表示するのではなくドロップされるため、映像は実時間の速度を保ちます。
</Note>

## JPEG へのエクスポート

DWVO はすでに MJPEG として保存されているため、`export.py` は各フレームをそのままディスクにコピーします — デコードなし、品質劣化なしです。

```bash theme={null}
python export.py file.dwvo output-folder

# keep every fifth frame
python export.py file.dwvo output-folder --step 5
```

| 引数                |                                        |
| ----------------- | -------------------------------------- |
| `--step N`        | N フレームごとに 1 枚保持します。                    |
| `--start-frame N` | 出力の開始インデックス。以前のシーケンスから連番を続けたい場合に使用します。 |

出力はカメラごとに 1 ディレクトリで、KITTI 形式の番号付けになります:

```
out/
  image_0/000000.jpg, 000001.jpg, ...
  image_1/000000.jpg, 000001.jpg, ...
  times.txt
```

## ロスレス PNG(KITTI データセット)

`dwvo_to_kitti.py` は同じレイアウトを生成しますが、Pillow を通してデコードするため、ロスレスな PNG を出力できます。下流のツールが JPEG を受け付けない場合に使用してください。それ以外の場合は `export.py` の方が高速です。

```bash theme={null}
python dwvo_to_kitti.py test.dwvo out          # PNG
python dwvo_to_kitti.py test.dwvo out --jpeg   # same zero-copy JPEG as export.py
```

## DWVO をプログラムから読み込む

`dwvo.py` では、`DWVOReader` がタイムスタンプブロックを反復処理し、`DWVOWriter` がそれらを書き込み、`combine_dwvos()` は同じヘッダーを共有する録画を連結します。

```python theme={null}
from pathlib import Path
from dwvo import DWVOReader

with DWVOReader(Path("test.dwvo")) as reader:
    print(reader.header.n_cameras, reader.header.width, reader.header.height)
    for block in reader.iter_blocks():
        for frame in block.video_frames:   # one per camera
            frame.bus_id, frame.data       # "0" / "1", raw JPEG bytes
```

## FAQ

<AccordionGroup>
  <Accordion title="録画したものより映像が遅く再生されるのはなぜですか?">
    Discovery では、一部のカメラは FPS を手動で設定する必要があります。映像が 60 FPS でストリーミングされていたのに 30 FPS に設定されていた場合、`.dwvo` ファイルはメタデータに 30 FPS を記録し、アプリケーションに 30 FPS で読み込むよう指示します。再生時に `--fps` で上書きしてください。
  </Accordion>
</AccordionGroup>

## 詳細情報

追加の詳細、他言語での例、および上記スクリプトの完全なソースは、OpenCV Guides リポジトリを参照してください。

<Card title="OpenCV Guides リポジトリ" icon="Github" href="https://github.com/DeepWaterExploration/opencv-guides">
  DWVO リーダー、再生、エクスポート、KITTI 変換のソースコード。
</Card>
