モノクロタイム

I'm from the future!

【OpenCV2.4.9】cvMatを使って矩形切り抜き【VC++】

研究で画像をブロック分割する必要があったので,忘れないうちにメモ.
OpenCV2.4.9を使用,開発環境はVS2012,言語はC++
普通はブロックの高さと幅を決めて,ブロックの幅(又は高さ)ぶんずらしながら分割していくのだろうけど,
(というかそれをするならフリーソフトを使っていたほうが良いですね)
1px毎に切り抜くブロックの領域をずらしながら切り抜き・保存しています.

サンプルコードは以下の通り.

Mat src_img = cv::imread("input.png",0);
 for(int y = 0;y < src_img.rows;y++){
  for(int x = 0;x < src_img.cols;x++){
   Mat cut_img(src_img,Rect(x,y,31,31)); // 31px四方で切り抜くとき.
   imwrite("output.png",cut_img);
  }
 }

実際は切抜き後のファイルは連番をつけたり,名前を変えたりするコードが入るのですが,.NetFrameworks4.5を使えばこんな風に書けると思います.

char* dst = (char *)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi("output_"+y+"_"+x+".png").ToPointer();
imwrite(dst,cut_img);

cv::Matは行列として画像を扱うので,画素値にアクセスする時は(x,y)ではなく(y,x)のように(行,列)で指定をします.
IplImageに代わる新しい画像を扱える構造体としてOpenCVのユーザーの中では積極的に使われており,実際IplImageからcvMatを使うように変えた所,より直感的に画素値を扱えるような感じでした.
OpenCVをこれから始めようかな~と思っている人はIplImageではなくcvMatを使った勉強をおすすめします.
なお,cvMatの使い方や仕組みなどについては下のブログ,サイトが詳しいです.こちらもぜひ参照してください.
ゴリラになる知識
OpenCV.jp : OpenCV逆引きリファレンス — OpenCV-CookBook

ではでは.

~余談~
今更ながら記事の書き方をはてな記法モードにしました.
gistを使わなくてもコードをぺたっと貼り付けられるし,シンタックスハイライトもついていい感じですね.
これからもどんどんコード貼っていこう.