OpenCV の Mat ってやつの話
OpenCV の Mat のメモ
意外に閲覧してくださる方が多いみたいで
この雑な記事を近々もうちょっときれいに書こうと思います。(笑)
画像処理 といえば OpenCV
OpenCV といえば Mat
Mat といえば...??
ってことで Mat とやらを使うことになったけど
アホな俺が初見でよくわからんかったから
とりあえずメモをしておく
主にこちらのゴリラさんからいろいろ引用させてもらいました。
和歌山大学さんのとこも。
ここは Mat の構造についての詳細が書かれています。知っておいた方がいいと思う。
cv::Matの基本処理 — OpenCV-CookBook
そしてこちらにはOpenCVの画像処理関数集が。
とりあえず初心者は全部ブックマークしろやオラァッ!
以下、他のいろいろWebページも参照させてもらって適当にまとめた
いや、まず「Mat」ってなんやねん?
OpenCVで使えるほぼ画像用の行列らしい
行列であって画像なのであって行列である(適当)
まあデジタル画像は 画素値が入ってる行列 だからそこんとこは適当にわかれや
ちなみにオブジェクト指向だから「Mat」は「クラス」ね
だから変数を用意してみんな大好きコンストラクタを呼びだそう
ここから Mat の基本処理ちょっとだけ
行列の用意
- Mat image(Size(100, 200), CV_8U, Scalar::all(0));
①横100 ✕ 縦200 の
②符号なし8ビット型の要素を持つ
③全画素を0で初期化した
「image」 の誕生
画像の取り込み
- Mat image1 = imread("../lenna.png", 1); //カラー取り込み
- Mat image2 = imread("../lenna.png", 0); //グレースケール取り込み
コメントの通り
大事な大事な画像の取り込み
とても簡単
大体のフォーマットはサポートされていると思います
png,jpg,bmp,ppm,pgm,pbm,pnm ... etc.
Matのコピー
- Mat tmp1 = image.clone(); // 完全なコピー
- Mat tmp2(image.size(), image.type()); // サイズとデータ型のみコピー
上記のとおりである
基本的にはcloneを使う方がいい
ちなみに
- Mat tmp1 = image;
ができてしまう!なんということだ簡単じゃないか!
しかーし!!!
これは shallow copy といって浅いコピーになってしまう
つまり,データを共有することになる(オブジェクトIDのコピー?)
だからたぶんほとんどの人はこれやっても意味ない。
おとなしく clone() 関数を使おう(^ω^)
型の変換
- Mat image(Size(100, 200), CV_8U, Scalar::all(0));
- Mat tmp;
- image.convertTo(tmp, CV_32F, 1.0/255);
①Mat型の tmp に
②32ビット float型変換をして
③1.0/255を全画素にかけて
imageを変換する
ガウシアンフィルタを掛ける
画像処理の基本 ぼかし
α=1.5でガウシアンフィルタをかける
ちなみに画像処理集は上記のWebページにたくさん載ってる
逆行列を求める
- image.inv()
画像処理では使わんと思うけど一応
画像を表示
- imshow("name", image);
画像を確認したいとき、というか画像なんだから見ないとダメなんだけど
この関数を使おう
①タイトルバーに name ってかかれたウィンドウに
②Mat image が
表示される
動画でも基本これ使う
フレームを1枚1枚読み込んで表示するってのを繰り返す
画像確認用として
- void showImage(const Mat& image) {
- imshow("out", image);
- waitKey(0);
- destroyWindow("out");
- }
このような関数を用意しとけば
引数にMat 持ってくるだけで画像確認できるからとても便利
画像の上でクリックしたら画像消えて次進む
まだまだあります
あとは上記のリンク等で適当に調べてださあああああああああい(投げ気味ごめん)