Swig を利用して、Ruby プログラムから CImg Library を使う
CImg Library とは、画像処理の機能を持った C++ のソフトウェア. このページでは, Ruby から CImg Library の機能を呼び出してみます
<作業の要点>
- swig を使うときは, swig ファイル中に 「template(UcharCImg) cimg_library::CImg<unsigned char>;」のように書く。
【関連する外部ページ】 http://www.swig.org/Doc1.3/SWIGPlus.html
前準備
-
Ubuntu で OS のシステム更新を行うときは,
次のコマンドを実行.
sudo apt -y update sudo apt -yV upgrade sudo /sbin/shutdown -r now
- CImg のインストール
◆ Ubuntu での操作手順
sudo apt -y update sudo apt -y install cimg-dev sudo apt -y install cimg-doc sudo apt -y install cimg-examples
CImg.h は /usr/include/CImg.h に置かれる. 見本となるプログラムは /usr/share/doc/cimg-dev/examples に置かれる。
◆ Ubuntu での操作手順(例) (CImg の Web ページからダウンロードしてインストールする場合)
- CImg Library の Web ページを開く
- 「Download」をクリック
- 「Standard Package」をクリック
- zip ファイルをダウンロード
- 解凍してできた CImg.h を使う. CImg Library の機能はすべてこのファイルに入っている.
Ruby 用のパッケージの作成手順例
- 作成する Ruby パッケージのライブラリファイル名: CimgLibrary.so
* Ruby では CimgLibrary.so を読み込むために 「require 'CimgLibrary'」のように実行する - モジュール名: CimgLibrary
* Ruby では、クラス名の前に「CimgLibrary::」を付けることになるモジュール名は大文字で始めることを推奨する.
- Ruby側からみた時のクラス名と C++ でのクラス名の対応
C++ クラス名 Ruby から見たクラス名 cimg_library::CImg<unsigned char> CimgLibrary::UcharCImg - パッケージ名: cimg_library
- cimg_library.i の作成
モジュール名を CimgLibrary に設定している.
モジュール名は大文字で始めることを推奨する.
%module CimgLibrary %{ #include "/usr/include/CImg.h" using namespace cimg_library; %} %rename(Cimg_display) cimg_display; %rename(Cimg_appname) cimg_appname; %rename(Cimg_version) cimg_version; %rename(Cimg_OS) cimg_OS; %rename(Cimg_file_separator) cimg_file_separator; %rename(Cimg_verbosity) cimg_verbosity; %rename(UUCimgdisplay_instance) _cimgdisplay_instance; %rename(UUCimg_instance) _cimg_instance; %rename(UUCimglist_instance) _cimglist_instance; %rename(UUNo_display_exception) _no_display_exception; %rename(__eq__) operator=; %rename(CImgDisplay) cimg_library::CImgDisplay; %rename(StdException) std::exception; %include "/usr/include/CImg.h" %template(UcharCImg) cimg_library::CImg<unsigned char>;
- swig の実行
rm -f cimg_library_wrap.* swig2.0 -ruby -c++ cimg_library.i
実行の結果、「エラー」が出ていないことを確認する
- extconf.rb の作成
「create_makefile('CimgLibrary')」と記述しているので、CimgLibrary.so が生成されることになる
require 'mkmf' dir_config('cimg_library') $libs += " -lstdc++ -lm -L/usr/lib/x86_64-linux-gnu -lpng -lGraphicsMagick++ -lGraphicsMagickWand -lfftw3 -lopencv_core -llapack -lblas -latlas -lgfortran -lgomp -lX11 -lXext -lpthread -ldl -lquadmath" create_makefile('CimgLibrary')
- cimg_library_wrap.cpp の変更
「 cimg_library::CImgDisplay::_no_display_exception();」の行をコメント化する。
- ビルド
ruby extconf.rb make CC=g++
- インストール
sudo make site-install
- 使ってみる
irb require 'CimgLibrary' a = CimgLibrary::UcharCImg.new( "/usr/local/share/opencv/samples/c/fruits.jpg" ) a.display