現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCV::ホモグラフィ
関連:OpenCV::射影幾何学

ホモグラフィ


3次元空間のある平面から、別の平面へ投影する時にホモグラフィー行列が使われる。

例えば、3次元空間上のある点Q(X,Y,Z)が何らかの平面上にあるとする。
そして、それを別の平面へ投影し、その点がq(x,y)である場合、



と書く事ができる。

ここで、
  • s → スケール係数
  • H → ホモグラフィ行列
である。

ホモグラフィ行列


ホモグラフィ行列は2つの要素から成り立つ
  1. 「回転、並行移動」の要素
  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引数に変更されている。

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます