ScalaでOpenCVを使って画像処理

OpenCV meets Scala
OpenCV meets Scala

OpenCV 2.4.4から正式にJava APIをAndroidプラットフォーム以外でも使えるようになりました。つまりJVM(Java Virtual Machine)上で動く言語ならどんな言語からでもOpenCVが使えるということですね。
* OpenCV now supports desktop Java

、ということで今回はJVM上で動作するScalaからOpenCVを使ってみます。

環境

* CentOS 5.8 (x86_64, 仮想2コア, 1GB RAM)
* Scala 2.10.0 (sbt 0.12)
* Java 1.6.0 (java-1.6.0-openjdk.x86_64)
* OpenCV 2.4.4

Java APIを使う際にAndroidプラットフォームを意識する必要はもうなくなりましたので、ここではアプリケーションサーバから使えるようにLinux機に環境構築して試しました。OpenCVのLinuxへのインストール手順については技術Wikiにメモを残していますのでそちらを参照してください。
* OpenCV – 2.x Tech Note
公式サイトではeclipseやsbtなどでのプロジェクト構築手順もスクリーンショット付きで載っているのでこちらも参考に。
* Introduction to Java Development

ちなみにMac OSXではHomebrewのOpenCVが2.4.4にアップデートされていたので、

でインストールできます。簡単ですけどcmakeのオプションを自由にいじれないのでオススメできないかも。

sbt(Simple Build Tool)

sbt(Simple Build Tool)はScala/Java用のビルドツール。ライブラリの依存関係を自動で解決してくれるし、Scalaで書かれたDSLを使ってビルド設定を簡潔に記述できます。今回はEclipseのようなIDEは使わずにemacs + sbtでストレスなく開発ができました。
参考: 始める sbt

OpenCVのインストールに成功したら、ライブラリファイル(opencv-244.jar, libopencv_java244.so)をsbtプロジェクトのlibディレクトリにコピーしておきます。sbtが自動でクラスパスを追加してくれます。

Hello OpenCV in Scala

Javadocを参考にしながら進めます。
* OpenCV Javadoc

core

まずは基本から。JNI(Java Native Interface)経由でMatの機能を使えるか試します。

* 実行結果

行列演算はネイティブ側で行われるので高速に処理できます。

highgui, imgproc

ファイルI/Oや画像処理も試してみます。sbtプロジェクトの src/main/resources ディレクトリに画像ファイルを置いておきます。

Highgui周りはちゃんと動くか心配してたのですが、I/O処理は特に問題ないようでした。

features2d

特徴点検出/特徴量記述、マッチング処理も試してみました。特徴量はパテントフリーで使いやすいORB特徴を使っています。

matching_result
多少は関数型っぽくしてみましたけど、Javaの道具を使ってるので普通のJavaプログラムと変わらないように見えてしまうのは仕方ないですかね。

C++ APIで提供されている FeatureDetector/DescriptorExtractor クラスの機能はJava APIでもほぼそのまま利用できるようです。また、上記のサンプルコード内で MatOfKeyPoint や MatOfDMatch というクラスが登場していますが、どうやらJava側では std::vector を Mat のサブクラスとして扱い、JNIで渡すときに内部でコンテナ変換しているようです。ちなみにその変換部分の実装はOpenCVソースツリーの modules/java/generator/src/cpp/generators.cpp にあります。

C++コンテナ Javaクラス
std::vector<{型名}> org.opencv.core.MatOf{型名}

それぞれのクラスには toArray や toList メソッドが用意されていて、配列やリスト(java.util.List)のインスタンスに変換できるので運用はしやすいと思います。

以上、簡単にですがOpenCVのJava APIをScalaから使ってみました。他のJVM言語からでも簡単に使えそうなので興味ある方は是非試してみてください。

Scalaを使ってみた感想

ScalaにはREPL(Read-Eval-Print-Loop: 対話型評価環境)があるので思いついた処理を手軽に試すことができて良いですね。それに最近のJVMは速いのでパフォーマンス的にもあまり心配することはなさそうです。

一方、Scalaがどういう風に型推論するのか見切れないから結局は型を明示してしまうという、僕のようなScala初心者は多いのではないかと思います。ScalaでRubyのようにスラスラ書き下すのは難しいです。。また、ScalaをBetter Javaとして使うだけなら学習コストは低いですが、関数型言語としてしっかり使っていくにはかなり学習が必要だと感じました。

また、ScalaはTwitterでの利用実績があることは有名だと思いますが、中の人がEffective Scala(邦訳)というドキュメントを残しています。Scalaを勉強するなら一度は読んでみると良いと思います。

あわせて読む:

One thought

  1. Am aflat aceasta pagina, dupa ce am cautat despre
    ScalaでOpenCVを使って画像処理 Rest Term
    pe Google. Se pare ca informatia dvs e foarte valoroasa, mai ales ca am mai gasit aici si despre ora, ora exacta,
    lucruri interesante si folositoare. Mult succes in continuare!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です