PYNQ-Z1 で、USB ウェブカム動画入力を試す

投稿者: | 2019年5月23日

Evaluating USB webcam by PYNQ-Z1.

先日紹介した PYNQ-Z1 ですが、まずは早速 USB ウェブカムを繋いで HDMI ディスプレイに出力する実験をしてみました。PYNQ は v2.4 を使っています。

(いわゆる)ウェブカムには、Logitech の C270(たくさん出回っていて安いやつ。私のは、ファームウェアバージョン 6.0.1133)を使っています。

結論から言いますと、画像のパススルーでも結構固まります。なぜだろう。私の環境だけの問題なのでしょうか。以下に Jupyter notebook のサンプルコードを示しますが、動作させて数十秒ほどすると固まってしまいます。OpenCV の VideoCapture オブジェクトを release() しようとしても反応がありません。どの部分で固まっているか(Python ライブラリなのか、下にあるユーザー空間ライブラリなのか、カーネル空間でなのか、あるいは Programmable Logic の内部の話なのか)切り分けできていませんが、再起動を何度もしなくてはならないので、結構ストレスです。

でもとりあえず、コードを紹介しておきます。

コード

簡単な説明

最初の Some Magic Words という部分は、Zynq FPGA の programmable logic に「オーバーレイ」というものを流し込む「おまじない」です。詳しくはここに説明があります。

Start HDMI Output という部分は、HDMI 出力の初期化です。VideoMode() 関数で、HDMI 出力の解像度、ピクセル辺りのビット数(ここでは 24ビット)を指定しています。詳しくはここに説明があります。

Start USB Camera (OpenCV) は、純粋に OpenCV の話です。OpenCV + Python の入門資料を参考にしてください。

その次のセル(タイトルを付けるの忘れた)が、ビデオ入出力のループです。基本的には OpenCV の書き方だと思いますが、

outframe = hdmi_out.newframe()
hdmi_out.writeframe(outframe)

という部分が、PYNQ 独特な部分です。newframe() は毎回呼ぶ必要があるかどうかよく分からないのですが、PYNQ のサンプルコードがそうしているので、そうしています。 🙂  ちなみにこれを一回だけ呼ぶようにしても、安定性はあまり関係ないような気がします。

最後に、Cleaning up というところで後始末しています。今回のデモコードでは、無限ループになっているので、あまり意味がありませんが。

肝心のフレームレートですが、何しろ安定して動かないので測定しづらいのですが、概ね、20〜25 fps くらいは出るようです。本当は自力で画像処理のオーバーレイを書いてみようかと思ったのですが、何しろ Python の環境が安定して動かないので、ちょっとしんどいですね。

今日はここまで。

することリスト(問題切り分け)

  • OpenCV のカメラ入力だけでも固まるか?
    • 結果: 固まる。Some Magic Words, Start HDMI Output をコメントアウトして、Video Pass-through Loop から outframe に関する処理 3行を除いてみたが、やっぱり固まる。どうも USB 側の問題らしい。あるいは C270 にも原因があるかも知れない。(Mac OS でも認識が不安定だし。ちなみに、ファームウェアバージョン 6.0.1133。)
  • 同じウェブカムと OpenCV コードを、他のプラットフォーム(Raspberry Pi)とかで動かしてみる。