OpenCVHowTos

OpenCVについてのHOWTO集

リンク


目次


Linux版とWindows版の違い

  • カメラからcvQueryFrame()またはcvRetrieveFrame()で取得した画像の座標系
Linux
画像に向かって左上角が原点,右方向がX軸正方向,下方向がY軸正方向
Windows
画像に向かって左下角が原点,右方向がX軸正方向,上方向がY軸正方向

OpenCV内部ではIplImageのメンバ変数originにより,上記の2種類の座標系が区別される.
例えばcvShowImage()で画像を描画するときに,ピクセルデータを参照する順序は,
メンバ変数originにより決定される.originがピクセルデータの順序と一致していない
場合,上下反転した画像が描画される.

Intel Integrated Performance Primitives (IPP)をインストールする

IPP,MKLは非商用利用に関しては無償で提供されている.ただし,
Intelの利用許諾条項によると学術利用は非商用利用に含まれていない.
( [http://www.intel.com/cd/software/products/asmo-na/eng/download/download/219771.htm] )


Intel Math Kernel Library (MKL)をインストールする


画像から特徴点を抽出する

cvGoodFeaturesToTrack()を使う.Reference Manualに明記されていないが,呼び出しの時点で,引数corner_countには見つけたい特徴点の個数の最大値を格納していなければならない.

行列の固有値,固有ベクトルを求める

行列の種類 適用可能な関数
対称かつ正定 cvSVD()
対称 cvEigenVV()
(3x3)以下のサイズ cvSolveCubic()とcvSVD()の併用

同次線形方程式を解く

cvSolve()では同次線形方程式A*X = 0を解けないので,
cvSVD()でAを特異値分解して,その結果を用いて求める.具体的には,ゼロである特異値に
対応する右特異ベクトル(複数ある場合はそれらの線形結合)が
同次方程式の解となる.


部分行列へのアクセス

ある行列Mの部分行列にアクセスする(読み書きを行う)には次のようにする

CvMat *M = cvCreateMat(4, 4, CV_32FC1);
CvMat A;  //      [A | B]
CvMat B;  //  M = [-----]
CvMat C;  //      [C | D]
CvMat D;  //

cvSetZero(M);

cvGetSubRect(M, &A, cvRect(0, 0, 2, 2)); // cvCreateMat()と異なり列-行の順で記す
cvGetSubRect(M, &B, cvRect(2, 0, 2, 2));
cvGetSubRect(M, &C, cvRect(0, 2, 2, 2));
cvGetSubRect(M, &D, cvRect(2, 2, 2, 2));

// Aの内容を変更すると,Mの内容も変更される(AとMが同じデータを参照しているため)
cvmSet(&A, 0, 0, 1); //                 [1 2 0 0]
cvmSet(&A, 0, 1, 2); //A = [1  2]   M = [3 4 0 0]
cvmSet(&A, 1, 0, 3); //    [3  4]       [0 0 0 0]
cvmSet(&A, 1, 1, 4); //                 [0 0 0 0]

ラベリングを行う

cvblobslibを使う(OpenCVに含まれていない).
実装に誤りあり.BlobExtraction.cppの以下の行
       delete Transition;
       delete ThisRegion;
       delete LastRegion;
は,正しくは,
       delete[] Transition;
       delete[] ThisRegion;
       delete[] LastRegion;
誤ったdeleteの実行結果は不定(予期しない箇所でのSEGVなど).
最終更新:2009年01月05日 17:12
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。