8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

spresenseAdvent Calendar 2021

Day 13

Spresenseカメラからのキャプチャ画像をリアルタイムにProcessingに転送してライブストリーミング再生する

Posted at

はじめに

Spresenseカメラから撮影したJPEG画像をリアルタイムにPC上に転送してPC上でストリーミング再生(っぽいことを)するアプリケーションを作成しました。SpresenseをUVC(USB Video Class)カメラデバイスとして使うようなイメージです。

PCアプリケーション側はProcessingツールを用いて動画再生、実際には動画ではなくJPEG画像のパラパラ漫画風再生、を行います。

実際に動作している様子(Qiitaにアップするためにgif化しているのでカクカクしてます)
UsbLiveStreaming2.gif
JPEGデータの転送は、USB UVCクラスの代わりにCDC/ACMクラスを使用してシリアル転送します。今回のアプリを実現するのに、UVCクラスドライバがあればそれで良いんですが、真の目的はストリーミング再生ではないのでCDCクラスの方が自分にとっては都合が良くて、このあたりは後述します。

用意するもの

つらつらと挙げましたが、必要なボードはメイン、拡張、カメラボードの3点セット、ソフトウェアは、ProcessingとArduino IDEがインストールされていること、Spresense Arduinoパッケージを入れていない人は、公式サイトのSpresense Arduinoスタートガイドを参照してインストールしてください。また、USBSerialライブラリ(自作)を使用するので、Arduino/libraries以下にインスールしてください。
USBSerialについての過去記事はこちら

通信仕様

ProcessingとSpresenseとの通信仕様は超シンプルなものにしました。
image.png
Processingから開始トリガを送ったら、SpresenseからJPEG画像データのサイズ、実データの順番で転送します。サイズ分の転送が終わったら、最後にProcessingから終了トリガを送ります。

これをJPEG画像1枚ごとに繰り返し実行します。

転送間の同期や転送チェックサム等も省略したプロトコルなので、エラーが発生したらそのフレームは捨ててはじめからやり直すような簡単なエラーリカバリ処理を入れています。

使い方

ハードウェア接続

  1. メインボード、拡張ボード、カメラボードを接続します
  2. メインボードとPCをUSBケーブルで接続します
  3. 拡張ボードとPCをUSBケーブルで接続します

Arduino

  1. Arduino IDEを起動します
  2. Arduino/UsbLiveStreaming/UsbLiveStreaming.ino スケッチをオープンします
  3. 書き込みを行います

デフォルトの画サイズはVGAにしています。MainCoreしか使用しないので、[ツール]->[Memory]のサイズは、最大の1536KBを選択しておきます。
ArduinoIDE

Processing

  1. Processingを起動します
  2. Processing/UsbLiveStreaming/UsbLiveStreaming.pde スケッチをオープンします
  3. スケッチ内のSERIAL_PORTNAMEをお使いの環境に合わせて変更します
    シリアルポートは、拡張ボード側のUSB CDC/ACMで接続されたシリアル番号を指定します。
    SERIAL_PORTNAMEのデフォルトは、macOS用に/dev/cu.usbmodem01になっています。
    画サイズのデフォルトはVGAです。変更する場合は、Arduinoスケッチと合わせて変更してください。
    Processing
  4. スケッチを実行すると、UsbLiveStreamingウィンドウが表示されます。
    UsbLiveStreaming
  5. この画面をクリックすると、そのときのJPEG画像をdataディレクトリに保存します。

さいごに

本当はライブストリーミングをしたかったわけではなく、AI機械学習するときに例えばカメラ画像をSDカードに保存してそれを取り出して、というのが面倒だったので、画像データをその場でラベリングできて直接PCに転送できれば便利だなと思って作成したのがきっかけです。単なるJPEG転送だけの表示に簡素化したものが本アプリケーションです。

今後の応用として、通信プロトコルのコマンド仕様をもっとちゃんと決めて、カメラの細かいパラメータを設定しつつ描画結果を確認できるような画づくりツールにしたり、画像データに限らず、音声データも含めて任意のデータをPCに転送できるようにしたり、ということを検討しています。

メインで使用している開発マシンのMacBookでは問題無く動作していたのですが、Windowsで試すとシリアル通信エラーが多発しました。なんちゃってプロトコルのせいもありますが、USB CDC/ACMの動作がPC側のスペックに大きく依存してしまってそうです。

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?