OpenCvSharpをつかう その23 (OpenCV 3.0対応)
またまただいぶ間隔が空いてしまいすみません・・・
前回の記事(http://schima.hatenablog.com/entry/2014/09/08/220420)で罵詈雑言を浴びせたOpenCV3.0にOpenCvSharpをひとまず対応させました。
- NuGet Gallery | OpenCvSharp3 3.0.0.20150823
- Release 3.0.0 (16 Aug., 2015) · shimat/opencvsharp · GitHub
以下、簡潔に変更点・注意点を示していきます。
C APIラッパー廃止
OpenCvSharp始まって7年、ずっと歩み続けてきたC APIを消しました。もうIplImage
などは使えません。互換性を気にする方は2.x以前をお使いください。当分残します。
OpenCvSharp.CPlusPlus が、CPlusPlusが取れて引っ越しました。
var mat = new OpenCvSharp.Mat(100, 120, MatType.CV_8UC3);
C++の書き方に近づけようとしているためというのもありますが、C#として自然なコードを書きやすくなると思います。
IplImageに依存するアセンブリの更新
OpenCvSharp.Blob
は、IplImageしか受け取れない構成でした。Mat
に対応しました。
OpenCvSharp.UserInterface.PictureBoxIpl
は、相変わらずIplが付いた名前なのですが、Mat対応に代わっています。
cv::ml::LogisticRegression 追加
何も追加しないのはさすがにアレと思って、足しました。
使えるモジュール
続いて注意点を。
OpenCV3.0 から、一部の機能がopencv_contrib(https://github.com/itseez/opencv_contrib)に移行され、標準のパッケージから除かれました。たとえばSIFT・OpticalFlowなどです。
3.0のWindows向け公式パッケージでは、opencv_world.dllにすべてのモジュールが固められています。ここにはopencv_contribのモジュールは含まれないので、従ってSIFT等は使えません。
とりあえず何でも入っていた2.xに比べると、機能が減っている面があります
(SIFTなどは、ラッパーは構築済みなので、opencv_worldにcontribを込みで自前ビルドすると、たぶん使えるようになる気がします。未確認ですが。今のところは、呼び出されたら一律NotImplementedException
が投げられます。)
opencv_world の部分ですらラップ完了度が低いので、まずはそこから...
enum名前変更
オリジナルOpenCVにおいて、#define
定数からenumへの移行は、OpenCV2.xの頃から進んでいました。おそらくOpenCV3.0から、さらに名前付きのenumが使われるようになってきました。
OpenCvSharp3.0では本家OpenCVのenum名前変更に合わせ、各enumの名前を変更しました。これでかなり過去のコードとの互換性は失われています。IDEの補完を頼りに修正すれば対応できます。
var image = new Mat("hoge.bmp", ImreadMode.Color); // imgprocのenum ImReadModesに合わせました
calib3dなど、enumの名前がまだ付いていないモジュールもあり、そのような箇所では名前変更はしていません。
また合わせて、OpenCV1.0時代を引きずっていた各enumの値も、できるだけ最新に更新しました。