Skip to content

ruby-opencv で遊ぶ

ruby-opencvで遊んだ。自分も初心者なので、動かすだけで嬉しい人向け。
ちゃんと勉強したい人は公式ドキュメントがめちゃくちゃしっかりしている。公式のexampleはSURFを使っているものが多いので自分で頑張ってopencvをコンパイルする必要あり。

エッジ検出

不幸にもこの文字が見えているということは画像が表示されていないということですね lenna

BGR2GRAY でグレースケールに変換すればうまくいく。

sobelフィルタ

sobel

画像ファイルを読み込む

画像を保存する

・拡張子で判断してくれる模様

画像をリサイズする

 

モザイク処理

l3

カラーチャンネルの分離と合成

lenna

画像を垂直・水平に反転する

:x, :y, :xy で方向を指定

画像をネガポジ反転する

not

2値化する

threshold

ガウシアンぼかし

幅、高さ、標準偏差(ぼかしの強さ)の順番

動画を読み込んで保存する

CvMatの四則演算について

このへん分かりにくい。
* は mut_mul と同じ。mul は別物。
/ は div と同じ。
そして、* は引数にCvMatやCvScalarを想定していて、FixnumやFloatをとらない。一方で div や / はFixnumを引数として取るがFloatはダメ。mut_mul や * はFixnumも引数として取れない。mulはFixnumを引数として取りうる。
例えばPython/OpenCVで減色処理をRubyでやるとこうなると思う。

Python/OpenCV の場合

ruby-opencv の場合

l2
あまりクールではない…気がするけどもっといい方法はあるのだろうか。

移動物体の抽出

これも簡単だけど、印象はかなり強烈。NHKクリエイティブ・ライブラリーの動画を使用。ダウンロードしてcrossing.mp4として保存。

Ruby/Tk と ruby-opencv を接続する

lena2
ややこしいので結論だけ書く。PNM形式で画像をやりとりする。
CvMat.encode(“.pgm”)
を使用する。Ruby Array が返ってくる。これをpack(“C*”)すると、pgmなどのbinaryの文字列になっていることがわかる。なので、これをTkPhotoImageに流し込む。残念ながら、TkPhotoImage.dataにはbinaryしか読み込めないらしい。(CvMat.encode(‘.pgm’, CV_IMWRITE_PNG_COMPRESSION => 0) とすれば、pgm のプレーンテキストが得られる)

同様の方式でカメラからのキャプチャもできる。
橋本商会さんのサイトに載っている顔認識のコードは
こんな感じにすれば、Ruby/Tk上でほぼ同じように動く。

長い。でもRuby/TkのGUIが使えるのは魅力的。

テンプレートマッチング

temp_match

ctr
添付のExampleそのままでも、何やら一見実用的に見えるようなことができる。
※CT画像の出典:CT画像は東海大学医学部付属病院 画像検査センター

Good Features to Track

画像中の明確なコーナーを検出する
第1回 Ruby/OpenCV進捗報告から転用
ct

ヒストグラム

histogram
Ruby/Tk の Plotchart でヒストグラムを描いてみる。

ヒストグラムの均一化

equalize_histgrayequalized

SURF

surf
第4回 Ruby/OpenCV進捗報告より転載。

ハフ変換で直線検出

mat0

mat1

mat2

result

第2回 Ruby/OpenCV進捗報告から転用。

文字を書き込む

l4

アフィン変換による画像の回転

100,100を中心に、10度回転させて、縮尺を0.9倍する場合。
l5

トラックバーをつける

l7

輪郭抽出

chest

chest2

チェッカーボードパターンの検出

chessboard

gmat

OpenCV 3 プログラミングブックOpenCVによる画像処理入門 (KS情報科学専門書)詳解 OpenCV ―コンピュータビジョンライブラリを使った画像処理・認識OpenCV 2 プログラミングブック OpenCV 2.2/2.3対応OpenCV with Python By Example実践 コンピュータビジョンPythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Post a Comment

Your email is never published nor shared. Required fields are marked *
*
*