最終更新: mikk_ni3_92 2008年10月24日(金) 14:44:00履歴
現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCV::ホモグラフィ
関連:OpenCV::射影幾何学
ホモグラフィ行列は2つの要素から成り立つ
ここで、
と書ける。
なお、「Q」のZ座標を無視しても一般性は失われないので、計算上は2次元としてよい。
つまり、変換は以下の式で書くことができ、3×3の行列となる。
[例]:ホモグラフィ行列Hを求める
配列「first」と「second」の要素が対応するとしている。
■リファレンス ※このリファレンスは「OpenCV1.0ver」(08.10.24時点)。「ver1.1」以上では、3引数から6引数に変更されている。
関連:OpenCV::射影幾何学
ホモグラフィ行列は2つの要素から成り立つ
- 「回転、並行移動」の要素
- 「投影変換」の要素
ここで、
- 回転・並行の要素をもつ行列を「W = [R t]」
- 投影変換の要素をもつ行列をM(カメラの内部行列)
と書ける。
なお、「Q」のZ座標を無視しても一般性は失われないので、計算上は2次元としてよい。
つまり、変換は以下の式で書くことができ、3×3の行列となる。
[例]:ホモグラフィ行列Hを求める
配列「first」と「second」の要素が対応するとしている。
#include <iostream> #include <cv.h> //------------ 各種外部変数 ----------// double first[12][2] = { {488.362, 169.911}, {449.488, 174.44}, {408.565, 179.669}, {364.512, 184.56}, {491.483, 122.366}, {451.512, 126.56}, {409.502, 130.342}, {365.5, 134}, {494.335, 74.544}, {453.5, 76.5}, {411.646, 79.5901}, {366.498, 81.6577} }; double second[12][2] = { {526.605, 213.332}, {470.485, 207.632}, {417.5, 201}, {367.485, 195.632}, {530.673, 156.417}, {473.749, 151.39}, {419.503, 146.656}, {368.669, 142.565}, {534.632, 97.5152}, {475.84, 94.6777}, {421.16, 90.3223}, {368.5, 87.5} }; //------------ メイン関数 ---------------// int main(int argc,char *argv[]) { CvMat *firstM = cvCreateMat(12,2,CV_64FC1); cvSetData(firstM,first,firstM->step); CvMat *secondM = cvCreateMat(12,2,CV_64FC1); cvSetData(secondM,second,secondM->step); CvMat *Homography = cvCreateMat(3,3,CV_64FC1); cvFindHomography(firstM,secondM,Homography); for(int y = 0; y < 3;++y){ for(int x = 0; x < 3;++x) { std::cout << CV_MAT_ELEM(*Homography,double,y,x) << " "; } std::cout << "\n"; } cvReleaseMat(&firstM); cvReleaseMat(&secondM); cvReleaseMat(&Homography); return EXIT_SUCCESS; }
- ホモグラフィ行列Hの計算には、最低4つの点が必要である。
- スケーリングはホモグラフィ行列Hの最後の要素で可能だが、普通は「スケール係数s」で行う。
■リファレンス ※このリファレンスは「OpenCV1.0ver」(08.10.24時点)。「ver1.1」以上では、3引数から6引数に変更されている。