ruby-opencvをWindows(RubyInstaller)で使う

ruby-opencvは一応Windowsもサポートしているわけですが、いつからかOpenCVMinGW版のバイナリを配布しなくなってしまったため、RubyInstallerを使っている場合は自前でOpenCVをビルドしなければならない状態になっていました。 GitHubでもissueがいくつか挙がってたのをずーっと放置していたのですが、さすがに放置し過ぎな気がしてきたので、取り急ぎインストール用のドキュメントを作成しました。

ruby-opencv/install-ruby-opencv-with-rubyinstaller-on-windows.md at master · ruby-opencv/ruby-opencv · GitHub

大雑把に言うと、ポイントは以下の2点です。

  • DevKitのビルドツール(mingw-32-make、gcc、g++)を使ってOpenCVをビルドする
  • ruby-opencvをインストールしたり使ったりするときに、OpenCVのDLLのフォルダに加えてMinGWのDLLのフォルダをパスに追加する

想定環境 & 用意するもの

ちなみに、OpenCV 3系だとDevKitに含まれるgccとかg++が古すぎてビルドできません。DevKitアップデートされないかな…。

インストール方法

OpenCVを取ってくる

まずはOpenCVhttps://sourceforge.net/projects/opencvlibrary/ あたりから取ってきて、適当なフォルダに展開します。

CMakeでOpenCVMakefileを作成する

コマンドプロンプト(cmd.exe)を開き、下記のコマンドを実行します。

D:\>set DEVKIT_PATH=D:/local/devkit
D:\>set SOURCE_PATH=D:/work/opencv-2.4.13/sources
D:\>set OPENCV_INSTALL_PATH=D:/opencv-2.4.13
D:\>cmake %SOURCE_PATH% -G"MinGW Makefiles" -DCMAKE_INSTALL_PREFIX=%OPENCV_INSTALL_PATH% -DCMAKE_MAKE_PROGRAM=%DEVKIT_PATH%/mingw/bin/mingw32-make.exe -DCMAKE_C_COMPILER=%DEVKIT_PATH%/mingw/bin/gcc.exe -DCMAKE_CXX_COMPILER=%DEVKIT_PATH%/mingw/bin/g++.exe -DBUILD_PERF_TESTS=OFF

上記コマンドでは、DevKit が D:/local/devkit に、OpenCVD:/work/opencv-2.4.13 にインストールされていて(ソースコードD:/work/opencv-2.4.13/sources )、出力先フォルダが D:/opencv-2.4.13 になるという前提です。もし別のフォルダを指定する場合は、 DEVKIT_PATHSOURCE_PATHOPENCV_INSTALL_PATH で設定しているパスを変更してください。

なお、 D:\>コマンドプロンプトのプロンプトなので、入力しなくてよいです。

OpenCVをDevKitでビルドする

コマンドプロンプトで下記のコマンドを実行します。

D:\>%DEVKIT_PATH%/mingw/bin/mingw32-make.exe
D:\>%DEVKIT_PATH%/mingw/bin/mingw32-make.exe install

ruby-opencvをインストール

コマンドプロンプトで下記のコマンドを実行します。

D:\>path %OPENCV_INSTALL_PATH%\x64\mingw\bin;%DEVKIT_PATH%\mingw\bin;%PATH%
D:\>gem install ruby-opencv -- --with-opencv-include=%OPENCV_INSTALL_PATH%/include --with-opencv-lib=%OPENCV_INSTALL_PATH%/x64/mingw/lib

インストールが完了したら、試しにrequireしてみます。

D:\>irb
irb(main):001:0> require 'opencv'
=> true
irb(main):002:0> OpenCV::CV_VERSION
=> "2.4.13"

うまくいったようです。

注意点として、 %OPENCV_INSTALL_PATH%\x64\mingw\bin%DEVKIT_PATH%\mingw\binruby-opencvを使うときには必ずパスに追加する必要があります。 でないと、以下のエラーが発生します。

D:\>irb
irb(main):001:0> require 'opencv'
LoadError: 126: 指定されたモジュールが見つかりません。   - D:/local/ruby/lib/ruby/gems/2.3.0/gems/ruby-opencv-0.0.17/lib/opencv.so
        from D:/local/ruby/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:133:in `require'
        from D:/local/ruby/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:133:in `rescue in require'
        from D:/local/ruby/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:40:in `require'
        from D:/local/ruby/lib/ruby/gems/2.3.0/gems/ruby-opencv-0.0.17/lib/opencv.rb:8:in `rescue in <top (required)>'
        from D:/local/ruby/lib/ruby/gems/2.3.0/gems/ruby-opencv-0.0.17/lib/opencv.rb:5:in `<top (required)>'
        from D:/local/ruby/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:133:in `require'
        from D:/local/ruby/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:133:in `rescue in require'
        from D:/local/ruby/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:40:in `require'
        from (irb):1
        from D:/local/ruby/bin/irb.cmd:19:in `<main>'

%OPENCV_INSTALL_PATH%\x64\mingw\bin のほうはOpenCVのDLLのフォルダなので当然必要なのですが、今回の手順でビルドした場合はMinGWlibgcc_s_sjlj-1.dlllibstdc++-6.dll もリンクされるので、これらが格納されている %DEVKIT_PATH%\mingw\bin もパスに追加する必要があるのでした*1

そんなわけで

どうにかWindowsruby-opencvが使えるようになりました。

*1:静的リンクしてしまえばよいのだろうけど、extconf.rb経由でうまくgccにオプションが渡せなかったので、とりあえずそのままに。