あ。

完全なる趣味ブログ

OpenCV の Mat ってやつの話

OpenCV の Mat のメモ

 

意外に閲覧してくださる方が多いみたいで

この雑な記事を近々もうちょっときれいに書こうと思います。(笑)

 

 

画像処理 といえば OpenCV

OpenCV といえば Mat

Mat といえば...??

 

ってことで Mat とやらを使うことになったけど

アホな俺が初見でよくわからんかったから

 

とりあえずメモをしておく

 

主にこちらのゴリラさんからいろいろ引用させてもらいました。

ゴリラになる知識: OpenCVでまずやること『Mat』

 

和歌山大学さんのとこも。

Learning OpenCV 2

 

ここは Mat の構造についての詳細が書かれています。知っておいた方がいいと思う。

cv::Matの基本処理 — OpenCV-CookBook

 

そしてこちらにはOpenCVの画像処理関数集が。

画像処理 — OpenCV-CookBook

 

 

とりあえず初心者は全部ブックマークしろやオラァッ!

 

 

以下、他のいろいろWebページも参照させてもらって適当にまとめた

 

いや、まず「Mat」ってなんやねん?

 

OpenCVで使えるほぼ画像用の行列らしい

行列であって画像なのであって行列である(適当)

まあデジタル画像は 画素値が入ってる行列 だからそこんとこは適当にわかれや

ちなみにオブジェクト指向だから「Mat」「クラス」

だから変数を用意してみんな大好きコンストラクタを呼びだそう

 

 

ここから Mat  の基本処理ちょっとだけ

 

 

行列の用意

  1. Mat image(Size(100, 200), CV_8U, Scalar::all(0)); 

①横100 ✕ 縦200 の

②符号なし8ビット型の要素を持つ

③全画素を0で初期化した

「image」 の誕生

 

画像の取り込み

  1. Mat image1 = imread("../lenna.png", 1);  //カラー取り込み
  2. Mat image2 = imread("../lenna.png", 0);  //グレースケール取り込み

 

コメントの通り 

大事な大事な画像の取り込み

とても簡単

 

大体のフォーマットはサポートされていると思います

png,jpg,bmpppm,pgm,pbm,pnm ... etc.

 

 

Matのコピー

  1. Mat tmp1 = image.clone(); // 完全なコピー
  2. Mat tmp2(image.size(), image.type()); // サイズとデータ型のみコピー

上記のとおりである

基本的にはcloneを使う方がいい

ちなみに

  1. Mat tmp1 = image;

ができてしまう!なんということだ簡単じゃないか!

しかーし!!!

これは shallow copy といって浅いコピーになってしまう

つまり,データを共有することになる(オブジェクトIDのコピー?)

だからたぶんほとんどの人はこれやっても意味ない。

おとなしく clone() 関数を使おう(^ω^)

 

型の変換

  1. Mat image(Size(100, 200), CV_8U, Scalar::all(0));
  2. Mat tmp;
  3. image.convertTo(tmp, CV_32F, 1.0/255);

①Mat型の tmp に

②32ビット float型変換をして

③1.0/255を全画素にかけて

imageを変換する

 

ガウシアンフィルタを掛ける

  1. // 入力画像,出力画像,カーネルサイズ,標準偏差x, y
  2. GaussianBlur(in_image, out_image, Size(7,7), 1.5, 1.5);

画像処理の基本 ぼかし

α=1.5でガウシアンフィルタをかける

ちなみに画像処理集は上記のWebページにたくさん載ってる

 

逆行列を求める

  1. image.inv()

画像処理では使わんと思うけど一応

 

画像を表示

  1.  imshow("name", image);

画像を確認したいとき、というか画像なんだから見ないとダメなんだけど

この関数を使おう

①タイトルバーに name ってかかれたウィンドウに

②Mat image が

表示される

 

動画でも基本これ使う 

フレームを1枚1枚読み込んで表示するってのを繰り返す

 

画像確認用として

  1. void showImage(const Mat& image) {
  2.   imshow("out", image);
  3.   waitKey(0);
  4.   destroyWindow("out");
  5. }

このような関数を用意しとけば

引数にMat 持ってくるだけで画像確認できるからとても便利

画像の上でクリックしたら画像消えて次進む

 

 

まだまだあります

あとは上記のリンク等で適当に調べてださあああああああああい(投げ気味ごめん)