2012/11/10

OpenCVでまずやること『Mat』

なにから覚える?

Mat。
Matが使いこなせればOpenCVは使いこなせる、といっても過言ではない。

Matとは

OpenCVにおいて、画像はMat型。
Matは『マトリックス・リローデッド』のMat。
つまり行列。
(昔のバージョンだとIplImageやCvMatというものを使っていた。相互変換可能)


Mat生成

とりあえず、Matをつくるのだ。
インクルードなどの設定が終わっていて、
using namespace std;
using namespace cv;
と記述されているものとして進める。(これをしないとMatと書く代わりにcv::Matと書かなくてはならない。めんどい)
Mat gori(Size(256, 512), CV_8U, Scalar::all(0));
これで
  • 横256×縦512 
  • unsigned char 型 
  • 全要素0
の行列ができた。
以下では一個ずつ整理する。

Mat型の変数goriを定義しているのは雰囲気でわかると思う。
そのgoriに続く括弧は何かっていうと、コンストラクタに渡す引数だ。
オブジェクト指向がむにゃむにゃな人も大丈夫、あとで勉強してくれ。

一つ目の引数では大きさを指定する。Size(width, height)と書けばいい。これは楽勝。
ちなみにSizeもOpenCVで定義される型の一つだ。
Size sz(100, 200);
cout << sz.area() << endl;
なんてことをすると、面積が出力される。

二つ目の引数では要素の型を指定する。
goriは行列Mat型だということは指定したが、その行列の各要素のデータ型も指定するのだ。
といっても面倒なことはない。unsigned char, short, float, int, double とかのことだ。
ただ指定する名前がC++とは違う!
対応としては
http://www.wakayama-u.ac.jp/~chen/opencv/opencv2.html
を参照してほしい。

なお、よく使う型は

  • unsigned char: CV_8U これがメインだ
  • float: CV_32F 計算途中で使う
  • double: CV_64F 精度を大事にする計算途中で使う

だと思う。覚え方
数字がビット長 SがSigned UがUnsigned FがFloat

三つ目の引数は初期値だ。
ScalarもOpenCVで定義される型の一つ。
4要素からなるベクトルだ。
Scalar::all(n)で4つの要素が全部nとなるScalarを生成している。

なぜ4つの要素をもつのかは追々説明しよう。(オイオイ


Matは画像だ

画像処理を初体験する君、とりあえず作った一行からなるMat生成文を眺めて、
「これ、画像じゃなくて行列じゃね?goriってゴリラじゃね?」
と思うかもしれない。
しかし画像である。(goriはゴリラである)
たしかに行列でもある。なんてったって
gori.inv()
とやれば逆行列が求められる。
しかし!
GaussianBlur(gori, gori, Size(7,7), 1.5, 1.5);
とやれば画像goriに対してσ=1.5のガウシアンぼかしをかけることができる。
画像とは、色、輝度の情報が2次元の長方形に並んだものに過ぎない。
それはズバリ行列である。画像は2次元行列なのだ。

※画像を行列として扱うのはOpenCVに限った話ではない。


0 件のコメント:

Related Posts Plugin for WordPress, Blogger...