OpenCV 2.2 チートシート (C++)
OpenCV C++ リファレンスマニュアルは，こちら:
http: // opencv. jp/ opencv-2svn/ cpp/ (Original :http: // opencv. willowgarage. com/ documentation/ cpp/ )．関数やクラスの説明を見つけるには クイック検索 を利用してください

OpenCV の重要なクラス
Point
Point3
Size
Vec
Matx
Scalar
RectRangeMat

2 次元点クラステンプレート
3 次元点クラステンプレート
サイズ (幅，高さ) クラステンプレート
ショートベクトルクラステンプレート
小型行列クラステンプレート
4-要素ベクトル
矩形
整数値で表現される範囲
2 次元 または 多次元の密な配（行列，画像，ヒストグラム，特徴ディスクリプタ，ボクセルボリュー
ムなどを格納できます）
多次元の疎な配列
スマートポインタのクラステンプレート

A33.at<float>(i,j) = A33.at<float>(j,i)+1;
Mat dyImage(image.size(), image.type());
for(int y = 1; y < image.rows-1; y++) {Vec3b* prevRow = image.ptr<Vec3b>(y-1);
Vec3b* nextRow = image.ptr<Vec3b>(y+1);
for(int x = 0; y < image.cols; x++)for(int c = 0; c < 3; c++)dyImage.at<Vec3b>(y,x)[c] =saturate cast<uchar>(nextRow[x][c] - prevRow[x][c]);}Mat <Vec3b>::iterator it = image.begin<Vec3b>(),itEnd = image.end<Vec3b>();for(; it != itEnd; ++it)(*it)[1] ^= 255;行列操作: コピー，シャッフル，部分行列

src.copyTo(dst)
別の行列へのコピー
src.convertTo(dst,type,scale,shift) スケーリングと別のデータ型への変換
m.clone()
行列の深いコピーm.reshape(nch,nrows) データをコピーせずに，行列の次元，チャンネル
行列の基礎数を変更
行列の作成
m.row(i), m.col(i)行列の行と列Mat image(240, 320, CV 8UC3);
m.rowRange(Range(i1,i2)) 行列の行と列（範囲指定）
宣言済み行列の（再）配置
m.colRange(Range(j1,j2))
image.create(480, 640, CV 8UC3);
m.diag(i)行列の対角要素行列を定数で初期化
m(Range(i1,i2),Range(j1,j2)),
部分行列
Mat A33(3, 3, CV 32F, Scalar(5));
m(roi)Mat B33(3, 3, CV 32F); B33 = Scalar(5);m.repeat(ny,nx)小さい行列から大きな行列を作成
Mat C33 = Mat::ones(3, 3, CV 32F)*5.;
flip(src,dst,dir)
行列の行（または列）の順序を反転
Mat D33 = Mat::zeros(3, 3, CV 32F) + 5.;
split(...)
マルチチャンネル行列を各チャンネル毎に分離行列を特定の値で初期化
merge(...)
各チャンネル毎の行列からマルチチャンネル行列
double a = CV PI/3;
を作成
Mat A22 = (Mat <float>(2, 2) <<mixChannels(...)
split() と merge() の一般型
cos(a), -sin(a), sin(a), cos(a));
行列の要素をランダムにシャッフル
float B22data[] = {cos(a), -sin(a), sin(a), cos(a)}; randShuffle(...)
Mat B22 = Mat(2, 2, CV 32F, B22data).clone();
例1. 画像 ROI を平滑化します
行列を乱数で初期化
Mat imgroi = image(Rect(10, 20, 100, 100));
randu(image, Scalar(0), Scalar(256)); // 一様分布
GaussianBlur(imgroi, imgroi, Size(5, 5), 1.2, 1.2);
randn(image, Scalar(128), Scalar(10)); // 正規分布
例 2. 線形代数アルゴリズム
行列と他の構造体を互いに変換
m.row(i) += m.row(j)*alpha;（データコピーなし）
例 3. 画像 ROI を別の画像に，変換しながらコピーします
Mat image alias = image;
Rect r(1, 1, 10, 20);
float* Idata=new float[480*640*3];
Mat dstroi = dst(Rect(0,10,r.width,r.height));
Mat I(480, 640, CV 32FC3, Idata);
src(r).convertTo(dstroi, dstroi.type(), 1, 0);vector<Point> iptvec(10);SparseMat
Ptr

Mat iP(iptvec); // iP – 10x1 CV 32SC2 matrix
IplImage* oldC0 = cvCreateImage(cvSize(320,240),16,1);
Mat newC = cvarrToMat(oldC0);
シンプルな行列操作
IplImage oldC1 = newC; CvMat oldC2 = newC;
OpenCV には多くの一般的な，行列の算術演算，論理演算，その他の処理... (データコピーあり)が実装されています．例えば，
Mat newC2 = cvarrToMat(oldC0).clone();vector<Point2f> ptvec = Mat <Point2f>(iP);• add(), subtract(), multiply(), divide(), absdiff(),bitwise and(), bitwise or(), bitwise xor(), max(), min(),compare()行列の要素にアクセス– 和や差，要素毎の掛け算 ... 二つの行列の比較や行列とスカラの比較，などに相当する演算．
例. アルファ合成 関数:
void alphaCompose(const Mat& rgba1,const Mat& rgba2, Mat& rgba dest){
Mat a1(rgba1.size(), rgba1.type()), ra1;
Mat a2(rgba2.size(), rgba2.type());
int mixch[]={3, 0, 3, 1, 3, 2, 3, 3};
mixChannels(&rgba1, 1, &a1, 1, mixch, 4);
mixChannels(&rgba2, 1, &a2, 1, mixch, 4);
subtract(Scalar::all(255), a1, ra1);
bitwise or(a1, Scalar(0,0,0,255), a1);
bitwise or(a2, Scalar(0,0,0,255), a2);multiply(a2, ra1, a2, 1./255);
multiply(a1, rgba1, a1, 1./255);
multiply(a2, rgba2, a2, 1./255);
add(a1, a2, rgba dest);}• sum(), mean(), meanStdDev(), norm(), countNonZero(),minMaxLoc(),– 行列要素の様々な統計量．
• exp(), log(), pow(), sqrt(), cartToPolar(), polarToCart()– 古典的な算術関数．
• scaleAdd(), transpose(), gemm(), invert(), solve(),
determinant(), trace() eigen(), SVD,
– 代数関数 + SVD クラス．
• dft(), idft(), dct(), idct(),– 離散フーリエ変換，離散コサイン変換
さらに便利な 代数表記 が利用できる処理もあります．例えば：

Mat delta = (J.t()*J + lambda*
Mat::eye(J.cols, J.cols, J.type())).inv(CV SVD)*(J.t()*err);
これは，LeLevenberg-Marquardt 最適化アルゴリズムの要です．

画像処理
フィルタリング
filter2D()
sepFilter2D()
boxFilter(),
GaussianBlur(),medianBlur(),bilateralFilter()Sobel(), Scharr()
Laplacian()erode(), dilate()

非分離型線形フィルタ
分離型線形フィルタ
線形または非線形のフィルタを用いた画像の平滑化

微分画像の計算22∂ I∂ I
ラプラシアンの計算: ∆I = ∂x2 + ∂y 2
画像の収縮膨張例. 3x3 のハイパスフィルタを適用します(全体に 128 足して，負の値が失われないようにします):
filter2D(image, image, image.depth(), (Mat <float>(3,3)<<-1, -1, -1, -1, 9, -1, -1, -1, -1), Point(1,1), 128);

幾何学変換resize()getRectSubPix()
warpAffine()
warpPerspective()
remap()
convertMaps()

画像のリサイズ
画像パッチの抽出
画像のアフィン変換
画像の透視変換
汎用的な画像変換
remap() を高速に実行するためのマップ最適化√

例. 2 分の一に画像を縮小します:Mat dst; resize(src, dst, Size(), 1./sqrt(2), 1./sqrt(2));

様々な画像変換
cvtColor()
threshold(),
adaptivethreshold()floodFill()
integral()distanceTransform()watershed(),grabCut()

画像を別の色空間に変換
固定あるいは可変の閾値を用いて，グレースケー
ル画像を 2 値画像に変換
領域拡張アルゴリズムを用いた，連結成分の検出
インテグラルイメージの計算
2 値画像に対する，距離画像またはボロノイ図の構築
マーカベースの画像セグメンテーションアルゴリ
ズム watershed.cpp や grabcut.cpp のサンプルを参照してください．

ヒストグラムcalcHist()
calcBackProject()equalizeHist()compareHist()

画像のヒストグラムの計算
ヒストグラムの逆投影
画像の明るさとコントラストの正規化
2 つのヒストグラムの比較

例. 画像の色相-彩度ヒストグラムを計算します:Mat hsv, H; MatND tempH;
cvtColor(image, hsv, CV BGR2HSV);
int planes[]={0, 1}, hsize[] = {32, 32};
calcHist(&hsv, 1, planes, Mat(), tempH, 2, hsize, 0);
H = tempH;

輪郭<< 1969 << "}" << "]";
fs << "mystruct" << "{" << "x" << 1 << "y" << 2 <<"width" << 100 << "height" << 200 << "lbp" << "[:";
const uchar arr[] = {0, 1, 1, 0, 1, 1, 0, 1};
fs.writeRaw("u", arr, (int)(sizeof(arr)/sizeof(arr[0])));
fs << "]" << "}";<< 演算子を用いて，スカラ値 (整数，浮動小数点数，文字列)，行列，ス
カラ値やその他の型の STL vector をファイルストレージに書き込むことができます
データの読み出し// ファイルの種類は内容によって決められます
FileStorage fs("test.yml", FileStorage::READ);
int i1 = (int)fs["i"]; double r1 = (double)fs["r"];string str1 = (string)fs["str"];
Mat M; fs["mtx"] >> M;
FileNode tl = fs["mylist"];CV Assert(tl.type() == FileNode::SEQ && tl.size() == 3);
double tl0 = (double)tl[0]; string tl1 = (string)tl[1];int m = (int)tl[2]["month"], d = (int)tl[2]["day"];
int year = (int)tl[2]["year"];FileNode tm = fs["mystruct"];
Rect r; r.x = (int)tm["x"], r.y = (int)tm["y"];r.width = (int)tm["width"], r.height = (int)tm["height"];
int lbp val = 0;
FileNodeIterator it = tm["lbp"].begin();for(int k = 0; k < 8; k++, ++it)
lbp val |= ((int)*it) << k;シンプル GUI(highgui モジュール)namedWindow(winname,flags) 名前付き highgui ウィンドウを作成します
destroyWindow(winname) 指定したウィンドウを破棄します
imshow(winname, mtx) ウィンドウ内に画像を表示します
waitKey(delay)
指定時間だけ（あるいは永遠に）キーが押されるのを待ちます．待ち時間にイベントの処理を行います． この関数を，1 秒間に数回程度呼び出すのを忘れないように．
createTrackbar(...) 指定したウィンドウにトラックバー（スライダー）を追加します．
setMouseCallback(...) 指定したウィンドウ内でのマウスのクリックと移動に対して，コールバックを設定します．
GUI 関数の使い方については， camshiftdemo.cpp や OpenCV
samples を参照してください．

カメラキャリブレーション，姿勢推定，奥行き推定
calibrateCamera()

キャリブレーションパターンを写した複数枚の画像を用いて，カメラをキャリブレーションします．

findChessboardCorners() チェッカーボードキャリブレーションパター
ン上の特徴点を検出します．
solvePnP()
その特徴点を投影した結果から，元の物体の姿勢を求めます．
stereoCalibrate()
ステレオカメラをキャリブレーションします．
FileNode のキャスト演算子を用いて，スカラ値を読み込みます．行列やそ stereoRectify()
キャリブレーションされたステレオカメラ画像のの他の型は， >> 演算子を用いて読み込みます．リストを読み込む場合は，平行化を行います．
FileNodeIterator を利用します．
initUndistortRectifyMap()
ステレオカメラの各カメラに対する，（ remap() 用の ）平行化マップを計算します．
ラスタ画像の書き込みと読み込み
StereoBM, StereoSGBM 平行化されたステレオペア上で実行される，ステimwrite("myimage.jpg", image);
レオ対応点探索エンジンです．
Mat image color copy = imread("myimage.jpg", 1);
reprojectImageTo3D() 視差マップを 3 次元点群に変換します．
Mat image grayscale copy = imread("myimage.jpg", 0);
findHomography()2 次元点集合間の最適な透視変換を求めます．

カメラをキャリブレーションするには，サンプル calibration.cpp やこれらの関数が読み書き可能なフォーマット: BMP (.bmp), JPEG
stereo calib.cpp を利用できます．視差マップや 3 次元点群を得るには，(.jpg, .jpeg), TIFF (.tif, .tiﬀ ), PNG (.png), PBM/PGM/PPM(.p?m), Sun Raster (.sr), JPEG 2000 (.jp2). 各フォーマットは， サンプル stereo match.cpp を利用してください．
8 ビット，1- または 3-チャンネルの画像をサポートします．1 チャンネル
データの入出力が 16 ビットの画像をサポートするフォーマット (PNG, JPEG 2000) もXML/YAML ストレージ は（入れ子可能な）コレクションで，スカラ値， あります．
物体検出
構造体，様々なリストを含むことができます．
動画ファイルやカメラから画像を読み込みますmatchTemplate
入力テンプレートに対する一致度マップを求めまVideoCapture cap;
YAML（または XML）へのデータの書き込み
す．
if(argc > 1) cap.open(string(argv[1])); else cap.open(0);// ファイルの種類は拡張子によって決められます
CascadeClassifier
Viola が提唱した Haar や LBP 特徴量を利Mat frame; namedWindow("video", 1);
FileStorage fs("test.yml", FileStorage::WRITE);
用するブースティング分類器のカスケードです．
for(;;) {fs << "i" << 5 << "r" << 3.1 << "str" << "ABCDEFGH";
facedetect.cpp を参照してください．
cap>>
frame;
if(!frame.data)
break;
fs << "mtx" << Mat::eye(3,3,CV 32F);
HOGDescriptor
N. Dalal が提唱した HOG 特徴量を利用する物
imshow("video", frame); if(waitKey(30) >= 0) break;fs << "mylist" << "[" << CV PI << "1+1" <<体検出器です．peopledetect.cpp を参照してく}"{:" << "month" << 12 << "day" << 31 << "year"
ださい．
輪郭の意味や使い方については contours.cpp や squares.cpp のサンプルを参照してください．