2017年7月8日土曜日

OpenCvSharpのVideoWriter覚書

 OpenCvSharp2のVideoWriterでファイルを書き出す際の注意点とか。

 VideoWriter.WriteではMat形式の画像を受け取るので、Matで渡す必要がある。OpenCVで画像をいじるだけなら問題ないが、C#のGraphicsで図形を書いたりしようとすると、System.Drawing.Imageから変換する必要がある。
 OpenCvSharp.Extensions.BitmapConverterでToMatやToBitmapがあるが、なぜかToMatで変換した画像をVideoWriter.Writeに渡しても保存されなかった。
 適当なファイルにImage.Saveで保存し、new Matで開いても良いのだが、ディスクアクセスは極力避けるべきであり、工夫する必要がある。
 とりあえず、MemoryStreamを作成し、Image.SaveでStreamを指定、その後Mat.FromStreamでStreamを読み込み、という手順で変換することができ、動画として正常に保存できる。また、逆の方法でMatからImageにすることもできるはず。とはいえ、OpenCvSharp.Extensions.BitmapConverter.ToBitmapでSystem.Drawing.Bitmapに変換してSystem.Drawing.Graphics.FromImageに渡すのは問題ないから、Mat→BitmapはToBitmapで問題ないと思う。


 動画ファイルはAVIやMP4でも大体ヘッダにS32bitとかでファイルサイズが書いてあり、2GB(or4GB?)を超えるファイルは作成できない。しかしFHDのMJPGとかだと数分で2GBを超えてしまう。
 とりあえず、VideoWriter.Write後にFileInfo.Lengthでファイルサイズを確認し、閾値を超えるようであれば新たな動画ファイルを作成する、というクラスを作ってみた。たぶんうまく動いてると思う。


 いつぞやの、OpenCvSharpのオプティカルフローで手ブレ補正に再挑戦してる。まだ上下左右の2軸しか補正してないが、かなり見やすくなる。ブレ補正は米軍のドローンでよく使われてるタイプの補正方法。
 本来は回転方向のブレも修正すれば見やすくなるのであろうが、なかなかうまくいかない。特徴点から回転を検出するのはスタートラッカで作ったので、その応用で簡単に作れそうだなと思ったんだけど、そうは問屋がおろさない。コマッタ。

0 件のコメント:

コメントを投稿