OpenCVのJavaバインディングをJRubyから使ってみた

OpenCVのJava Bindingが登場したので、JRuby (1.7.3)から使ってみました。

OpenCV now supports desktop Java | OpenCV によるとC++のヘッダーをパースしてバインディングを生成するので、常に最新のAPIを利用することができるようです。

OpenCVをビルド

まず、OpenCV 2.4.4以降をビルドします。手動でビルドする場合は、Introduction to Java Development — OpenCV 2.4.4.0 documentationを参考に。

とりあえず、HomebrewでOpenCVをインストールしました。

$ brew update
$ brew install opencv

(すでにOpenCVがインストールされている場合)

$ brew upgrade opencv

Homebrewでインストールした場合、Javaバインディングは

/usr/local/Cellar/opencv/2.4.4a/share/OpenCV/java

に配置されます。(2.4.4aの場合)

ヘルパクラスを用意

動的ライブラリがうまく読み込めなかったので、JRubyでMeCabのJavaバインディングを利用しようとして、嵌まった。 – コンピュータわ難しくて分からない!!を参考にヘルパークラスを用意しました。

helpers/org/opencv/LdLibraryLoader.java

package org.opencv;;
import org.opencv.core.Core;

public class LdLibraryLoader {
    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }
}

このファイルをJRubyから読み込むため、classファイルを生成します。(CallingJavaFromJRuby · jruby/jruby Wiki

$ javac -cp /usr/local/Cellar/opencv/2.4.4a/share/OpenCV/java/opencv-244.jar helpers/org/opencv/LdLibraryLoader.java

JRubyから使ってみる

Javaバインディングのリファレンスはhttp://docs.opencv.org/java/で閲覧出来ます。(2013/03/26 21:35追記)
試しにSIFT特徴を描画してみます。

$CLASSPATH << "helpers"
require 'java'
require '/usr/local/Cellar/opencv/2.4.4a/share/OpenCV/java/opencv-244.jar'

Java::org.opencv.LdLibraryLoader

java_import org.opencv.core.Mat
java_import org.opencv.core.MatOfKeyPoint
java_import org.opencv.highgui.Highgui
java_import org.opencv.features2d.FeatureDetector
java_import org.opencv.features2d.Features2d

src = Highgui.imread(ARGV.first)
keypoints = MatOfKeyPoint.new
detector = FeatureDetector.create(FeatureDetector::SIFT)
detector.detect src, keypoints

keypoints.to_array.each do |keypoint|
  point = keypoint.pt
  puts "x: #{point.x}, y: #{point.y}"
end

dst = Mat.new
Features2d.drawKeypoints src, keypoints, dst

Highgui.imwrite "./feature_out.png", dst

定番のLenaさんの特徴点を描画してみました。

$ jruby ./draw_features.rb /path/to/lena.tif

Lena with Features

ソースコード

https://github.com/ryotarai/opencv_on_jruby