OpenCvSharpをつかう その23 (OpenCV 3.0対応)

またまただいぶ間隔が空いてしまいすみません・・・

前回の記事(http://schima.hatenablog.com/entry/2014/09/08/220420)で罵詈雑言を浴びせたOpenCV3.0にOpenCvSharpをひとまず対応させました。

以下、簡潔に変更点・注意点を示していきます。

OpenCvSharpをつかう 記事一覧

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_contribhttps://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では本家OpenCVenum名前変更に合わせ、各enumの名前を変更しました。これでかなり過去のコードとの互換性は失われています。IDEの補完を頼りに修正すれば対応できます。

var image = new Mat("hoge.bmp", ImreadMode.Color); // imgprocのenum ImReadModesに合わせました

calib3dなど、enumの名前がまだ付いていないモジュールもあり、そのような箇所では名前変更はしていません。

また合わせて、OpenCV1.0時代を引きずっていた各enumの値も、できるだけ最新に更新しました。

ラップ作業のぼやき

  • ・cv::ml::* など、インスタンス生成がcreateメソッドに統一されました。これは、良いと思います。返り値のcv::Ptr<T>がそもそも面倒なのを除けば。
  • ・魔窟cv::Algorithm の影が薄くなり、2.xよりかなりラップしやすくなりました。
  • cv::Feature2D あたりの多重継承が消えたのはいちばんのGood Job.
  • ・前も少し書きましたが、cv::vectorを消しておいてcv::Stringを追加するのは、何をしたいのか理解に苦しみます。