4K ROI カメラシステムの構築

ガジェット

激安! 4K(UHD) ROI カメラシステムをつくる

ROIカメラシステムとは

要するにデジタル・ズーム

ROIとは、「Region of Interest (関心領域)」のことです。「Return On Investment (投資収益率)」と紛らわしいですね。監視カメラとか画像処理とかでよく出てくる単語で、Interestの主が人なのか機械なのか文脈によって違うという面白さがあります。

どちらにせよ画像中の「ある箇所」を示す概念です。つまりリアルタイムな画像切り出しです。

8K画像からUHDやFHDを切り出す。

いつかのInterBEEではNHKも8Kからの切り出しデモをやっていたことがありました。

そう、特にひねりもなくいえばデジタル・ズームであり、その操作性を良くしただけです。

しかしどう考えても有用です。私のような零細制作でも、時々、放送/配信案件があって、人繰りに苦労しますので、こういった小手先テクニックはありがたいです。

利点

簡易マルチカメラとして

一つのカメラからいくつかのアングルを切り出せるため、特に配信・放送などを少人数で運用できると思います。

カメラを動かさなくて良い

遠隔雲台やカメラマンを増やさずに済むので、オペレーションの省力化ができます。先述の簡易マルチカメラ化のためカメラそのものの削減にもつながります。

4K ROI カメラシステムとは

今回つくるUHDからの切り出し

UHDからの切り出しだと、FHDで二倍、HD(1280*720)では約三倍のズームが可能です。

そしてこのシステムはかなり安く作れる点が魅力です。いくつか致命的な欠点もありますので・・・後述します。

動作デモ

絶対便利だと思うので、安く作れないか試します。

さて概念検証と参りましょう

用意するもの

Jetson Nano。2022年4月現在、とても品薄。
Gopro5とCamlink4K
  • そこそこはやいコンピュータ (Jetson Nano)
  • UHDのキャプチャカード (Elgato Camlink 4K)
  • UHDでHDMI出力できるカメラ (GoPro HERO5)
  • ゲームパッド (HORI GamePad)

プログラム

今回は実験的にPythonで書きました。これに超解像とかも載たりして遊びたいので・・・。

プログラム自体はGitに載せました。

Padzoom / main.py

試行錯誤した点

Gstreamer経由でNV12のまま読み込み

GstreamerのVideoconvertを経てOpenCVに取り込むと、UHDの場合15fps程度しか出ません。

そのため、NV12のまま取り込んでプログラム内で色変換しています。

この方法であれば40fps程度で変換可能でした。

NV12はYUV形式でYUVが4:1:1になっているので、画像のサイズ(YUV Plane)としては3840*3160*1になります。この程度ならJetson Nanoでもリアルタイムに処理できそうです。

OpenCVのimshowではなくOpenGL経由で表示

OpenCVのimshowはオーバーヘッドが大きいためかFHDでも25fps程度が限界です。

しかし、OpenGL経由で表示すると苦しいながらもFHDで30fps程度は出せます。

ゲームパッド入力はPyGameではなくinputs

前述のOpenGLと競合するのでPyGameは使いませんでした。

どうやらPyGameと共存させるにはOpenGLをリビルドする必要があるようです。

リサイズのパラメータを妥協

cv2.resizeのパラメータをINTER_NEARESTとしました。最速。

ほかのパラメータだとどうしても20fps切りますのでしょうがないね。

やっぱり3840*2160*3の処理なので重いです。

その他
マルチスレッド

multithreading_test.py

ビデオの読み取りと表示を非同期にすれば多少はいいかと思ったがそうでもなかった。

マルチプロセス

multiprocess_test.py

Queueを使ったが思っていたより読み書きに時間がかかる。重ーい処理なら有効かもしれない。

今後考えたい点

YUVの直接表示と画像処理

OpenGLにはRGBもしくはRGBAなどでしか渡せませんが、これをYUVで受け取れるようにしてやればもうちょっと画像処理も早くできるのではないかと思います。

いろいろ調べてみるとiPhone用にVRソフト作っている人とか、組み込みVRシステムの動画・3Dオブジェクト表示部分を作っている人の質問や記事が出てきました。

組み込み系に引っ張られていく気もしますが、気を引き締めて勉強する必要がありそうです。

問題点

4:2:0の限界

YUV 4:2:0は輝度信号に対して色信号が1/4の解像度しかないわけです。

これはでかい画面で見る分には構わないのですが、今回のようなソリューションを試ししているときは如実にその差を感じました。

この特性は色滲みとなって現れるのですが、キー合成などでは4:2:2と言わず4:4:4が必要な理由がよくわかりました。

入出力の遅延

実測してみたところ約380msもありました。

正直思っていたより大きくないけれど、特に放送では使い物にならないと思いました。

この機器構成ではあまり詰められないかもしれないが、実装方法を変えてもう少し試行錯誤してみたいところです。

まとめ

4K ROI カメラシステムを安く手軽に作ってみました。

機能的には絶対的な便利さを感じましたが、性能的には改善の余地が多々ありそうです。

コンビニで印刷した、実は解像してない解像度チャート

コメント