なにから覚える?
Mat。
Matが使いこなせればOpenCVは使いこなせる、といっても過言ではない。
Matが使いこなせればOpenCVは使いこなせる、といっても過言ではない。
Matとは
OpenCVにおいて、画像はMat型。
Matは『マトリックス・リローデッド』のMat。
つまり行列。
(昔のバージョンだとIplImageやCvMatというものを使っていた。相互変換可能)
(昔のバージョンだと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で定義される型の一つだ。
二つ目の引数では要素の型を指定する。
goriは行列Mat型だということは指定したが、その行列の各要素のデータ型も指定するのだ。
といっても面倒なことはない。unsigned char, short, float, int, double とかのことだ。
ただ指定する名前がC++とは違う!
対応としては
http://www.wakayama-u.ac.jp/~chen/opencv/opencv2.html
を参照してほしい。
なお、よく使う型は
だと思う。覚え方
三つ目の引数は初期値だ。
ScalarもOpenCVで定義される型の一つ。
4要素からなるベクトルだ。
Scalar::all(n)で4つの要素が全部nとなるScalarを生成している。
なぜ4つの要素をもつのかは追々説明しよう。(オイオイ
それはズバリ行列である。画像は2次元行列なのだ。
※画像を行列として扱うのはOpenCVに限った話ではない。
オブジェクト指向がむにゃむにゃな人も大丈夫、あとで勉強してくれ。
一つ目の引数では大きさを指定する。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 件のコメント:
コメントを投稿