2012年8月7日火曜日

OpenCV(C++) 超々々入門

ヘッダファイルやライブラリの指定方法,画像のロード/セーブ,行列の操作方法のみに絞ってメモ書き.

Visual Studioのプロジェクト:
https://github.com/r168xr169/ForOpenCvSuperBeginner

インクルードファイルとライブラリ

正しくインストールされていればインクルード方法は至って簡単.

#include <opencv2/opencv.hpp>

ただし、ライブラリは使う機能に応じて指定する必要がある. 例えば下記のサンプルコードで使用されているimreadという関数は, OpenCV3.1.0ではopencv_imgcodecs310.libというファイルの中で実装されてる このライブラリを指定するためにVisual Studioではソースコード中に次のマクロを追加すればよい.

#pragma comment(lib, "opencv_imgcodecs310.lib")

しかし,単純なOpenCVのプログラムを書くだけでも複数のライブラリが必要なので上記方法で全部指定するのはかなり面倒. 今のところ このヘッダファイルを インクルードし必要なライブラリに対応する行だけコメントを外すのが今のところ一番簡単な方法.

画像のロードとセーブ

//ロード
cv::Mat_<cv::Vec3b> img_rgb = cv::imread("img000.png");

//セーブ
cv::imwrite("output1.png", img_rgb);

画素の参照、画素への代入

//画素(i, j)のrgb値を変数に代入
cv::Vec3b rgb = img_rgb(j, i);

//画素(i, j)のr値を変数に代入
uchar r = img_rgb(j, i)(0);

//画像(i, j)に色(0, 100, 200)を代入
img_rgb(j, i) = cv::Vec3b(0, 100, 200);

行列の初期化

cv::Mat_のinitializerを使う

意外と知られていないが便利な初期化機能.

//cv::Mat_の初期化機能
cv::Mat_<double> mat_ = (cv::Mat_<double>(3, 2) <<
    1.0, 2.0,
    3.0, 4.0,
    5.0, 6.0);

//cv::Matもcv::Mat_を介して初期化可能
cv::Mat mat2 = (cv::Mat_<double>(3, 2) <<
    1.2, 2.3,
    3.4, 4.5,
    5.6, 6.7);

配列のポインタに直接アクセス

配列の先頭ポインタdataを使って値をダイレクトに書き換えることも参照することも簡単.OpenGLのglTexSubImage2Dなど直接配列のポインタを渡さないと行けない場合など.
//memcpyでコピーしてしまう
cv::Mat_<cv::Vec3b> a = cv::imread("img000.png");    
a.data[0] = 0;
a.data[1] = 0;
a.data[2] = 255;

詳しくは