最終更新:
mikk_ni3_92 2008年10月24日(金) 11:17:37履歴
現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCV::射影幾何学
関連:OpenCV::ホモグラフィ
「ワールド座標系(X,Y,Z)」の点Pを「スクリーン座標系(x,y)」に対応させる事を
「投影変換(Projective Transform)」という。
一般に幾何変換をする時、同次座標(homogeneous座標)を使うと便利である。
つまり、
※ワールド座標系P(X,Y,Z)、スクリーン座標系p(x,y)、カメラの内部パラメータ行列M(3×3)とすると
![](https://image01.seesaawiki.jp/m/2/mikk_ni3_92/9ffb2ec4.JPG)
とまとまる(らしい)。(関連リンクHeikkila)
OpenCVでは、現在の座標の次元を1つあげる関数がある。
追加された次元には、「1」が設定される。
[例]:5つの点の2D座標を3D座標にあげる
関連:OpenCV::ホモグラフィ
「ワールド座標系(X,Y,Z)」の点Pを「スクリーン座標系(x,y)」に対応させる事を
「投影変換(Projective Transform)」という。
一般に幾何変換をする時、同次座標(homogeneous座標)を使うと便利である。
つまり、
- (x,y)→(x,y,w)
- (x,y,z)→(x,y,z,w)
※ワールド座標系P(X,Y,Z)、スクリーン座標系p(x,y)、カメラの内部パラメータ行列M(3×3)とすると
とまとまる(らしい)。(関連リンクHeikkila)
OpenCVでは、現在の座標の次元を1つあげる関数がある。
追加された次元には、「1」が設定される。
[例]:5つの点の2D座標を3D座標にあげる
#include <iostream> #include <cv.h> #include <highgui.h> //------------ 2D座標 -------------// double CoordIn[5][2]={ {100,100}, {50,50}, {200,200}, {400,400}, {30,30} }; const int N = 5;//(5点) //----------- ここからメイン関数 ---------------// int main(int argc, char *argv[]) { CvMat *Pin = cvCreateMat(N,2,CV_64FC1); cvSetData(Pin,CoordIn,Pin->step); CvMat *Pout = cvCreateMat(N,3,CV_64FC1); cvConvertPointsHomogeneous(Pin,Pout);//変換 for(int y = 0; y < N;++y){ for(int x = 0; x < 3;++x) { std::cout << CV_MAT_ELEM(*Pout,double,y,x) << " "; } std::cout << "\n"; } cvReleaseMat(&Pin); cvReleaseMat(&Pout); return EXIT_SUCCESS; }