OpenCVSharp Installation Memo

Reference

https://github.com/shimat/opencvsharp

Install OpenCVSharp

1年ぶりくらいにOpenCVSharp を使おうと思ったら、OpenCVのバージョンアップに伴い、若干 I/F に変更があったようなので、一部動かなくなっていた。そこで、環境構築と修正のメモです。

環境

Microsoft Visual Studio Community 2019 Version 16.7.3

OpenCVSharp 4.4.0

インストール手順

Reference にある手順書に従い、Visual Studio の Nuget パッケージの管理から、OpenCvSharp4, OpenCvSharp4.nuntime.win をインストールする。

古いバージョンからの変更点

注意

Bitmap.GetHbitmap メソッド のメモリーリークに関して

その他注意事項

インストールパッケージを作成すると、プログラムが動作しない。原因を調査したところ、インストールパッケージに OpenCvSharpExtern.dll が含まれていない。依存関係が正しくセットされいないのかもしれない。

対応として、インストールパッケージに対応する OpenCvSharpExtern.dll を追加する。このときの注意点として、OpenCvSharpExtern.dll には、Release/Debug, 64/x86 の4種類のファイルが存在している。正しいバージョンを追加しないと動作しないので注意。ここでは、

自分の環境では、32bit 版でビルドしているので、

*****\bin\Release\dll\x86\OpenCvSharpExtern.dll
を追加する。

Dependency Walker について

shimat さんのメモによると、この問題はあちこちで起こっているようで、Dependency Walker を使うとdllの依存関係を調査するのに便利とありました。
しかしながら、自分の環境(Win 10)では、 Dependency Walker V2.2に exe を追加すると、フリーズしてだめでした。Dependency Walker のあとにリリースされている Dependencies も試してみましたが、こちらも自分の環境では起動すらできませんでした。

OpenCV + Python で Video でネガポジ変換

昔の写真とネガを整理していて、写真とネガが別々に保存していました。このため、ネガイメージからだとどのネガがどの写真に対応しているのか、確認が難しいです。そこで、OpenCV + Python を使って、ネガポジ変換を行ってみました。

単純に、ネガポジ変換だけだと、全体的に青みがかった画像になり、思った色になりませんでした。そこで、青みがかった色を修正するために、ホワイトバランスの修正を行っています。これは、照明、撮像デバイス、ネガなどにより、パラメータを調整する必要があります。

ホワイトバランスは、単純にRGBのフィルムを通過した光のダイナミックレンジを一次式で正規化しているだけです。

つぎに、彩度が薄い感じだったので、RGBをHSV に変換し、彩度を1.5倍に上げてから、RGBに戻しています。これでだいたい何が写っているのか判別できるようになりました。

ほかの照明や撮像デバイスが異なると、色合いがおかしくなったりすると思いますが、地道にパラメータを調整する必要があります。

OpenCvSharp

OpenCvSharp でC#で組めるのはいいですね。中のソースを少し見てみましたが、shimatさんに感謝!

OpenCv のPython のチュートリアルに近い形で実装した場合

これだとキー待ちでループして気持ち悪いので、もう少し C# らしく書くと、こんな感じかな。

[ WARN:0] videoio(MSMF): async ReadSample() call is failed with error status: -1

OpenCVで、突然次のエラーが出るようになった。
[ WARN:1] videoio(MSMF): can’t grab frame. Error

原因は、VideoCapture を2つのプロセスで起動していたため、あとから起動したプロセスがフレームを取得することができなかったため。

OpenCV: FFMPEG: tag 0x5634504d/’MP4V’ is not supported with codec id 12 and form
at ‘mp4 / MP4 (MPEG-4 Part 14)’
OpenCV: FFMPEG: fallback to use tag 0x7634706d/’mp4v’
[ WARN:0] videoio(MSMF): OnReadSample() is called with error status: -1072875772

[ WARN:0] videoio(MSMF): async ReadSample() call is failed with error status: -1
072875772
[ WARN:1] videoio(MSMF): can’t grab frame. Error: -1072875772
[ WARN:1] videoio(MSMF): can’t grab frame. Error: -2147483638
[ WARN:1] videoio(MSMF): can’t grab frame. Error: -2147483638
[ WARN:1] videoio(MSMF): can’t grab frame. Error: -2147483638
[ WARN:1] videoio(MSMF): can’t grab frame. Error: -2147483638

Download YouTube

テスト用の動画をYouTubeから調達

Video の DCT, IDCT ローパス

OpenCvで、リアルタイムで、Video を200×200にスライスして、DCT→ローパス→IDCT を行ってみた。

左から、オリジナル、DCT、DCTの高周波成分をカット( 情報量はオリジナルの 1/100 )、IDCTで逆変換結果。

OpenCVで、動き検出

【爆速】OpenCVで複数の物体検出 -ラズパイ- を参考に、物体認識を試してみた。

単一オブジェクトの動き検出

KMeans を使って複数オブジェクトを認識をしてみたところ、ノイズがあると重心がうまく分離できず、Bounding Box が大きくずれてしまう。また、同一の物体であっても、複数のクラスターから構成されてしまうという問題点があった。

次に、オブジェクト輪郭検出 を参考に 複数のオブジェクトの動き認識してみた。 動いていないと認識できない、物体の特定ができない、といった問題があり、 正確ではないけれど、ある程度認識することができる。

drawContours だけで輪郭を描画できる。

OpenCv で動きを検出したらビデオに出力

動きを検出したら、ビデオき書き出す

OpenCvで timelapse

既存のビデオファイルから、タイムラプスを作成する方法

fourcc : Windows 10 の場合、次の動作を確認した。

フォーマットfourcc
aviDIVX
aviDIVX
wmvWMV1
wmvWNV2
mp4MP4V

OpenCV でキャプチャーしたビデオをファイルに出力

OpenCV でキャプチャーしたビデオをファイルに出力

参考
https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_video_display/py_video_display.html