最終更新: mikk_ni3_92 2008年06月18日(水) 15:28:01履歴
現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCV::極座標変換
#include <iostream>
#include <cstdio>
#include <cv.h>
#include <cxcore.h>
int main()
{
using namespace std;
CvMat *Xp = cvCreateMat(1,1,CV_64FC1); //x座標の配列
CvMat *Yp = cvCreateMat(1,1,CV_64FC1); //y座標の配列
cout << "input x : "; cin >> Xp->data.db[0];
cout << "input y : "; cin >> Yp->data.db[0];
printf("(%.1f, %.1f) から大きさと角度を計算します\n",Xp->data.db[0] , Yp->data.db[0]);
CvMat *Size = cvCreateMat(1,1,CV_64FC1); //大きさを格納する
CvMat *Angle = cvCreateMat(1,1,CV_64FC1); //角度を格納する
cvCartToPolar(Xp,Yp,Size,Angle,0);
printf("(大きさ,角度[rad]) = (%f, %f) \n",Size->data.db[0] , Angle->data.db[0]);
cvReleaseMat(&Xp);
cvReleaseMat(&Yp);
cvReleaseMat(&Size);
cvReleaseMat(&Angle);
return 0;
}
「cvCartToPolar()関数」の入力引数が「CvArr型」なので、「CvMat型」を使用した。
(この関数は、複数のデータをまとめて変換したい時に便利かも)
1つの(x,y)座標ならば、「cvFastArctan()関数」で十分かもしれない。
[例]
#include <iostream>
#include <cstdio>
#include <cv.h>
#include <cxcore.h>
int main()
{
using namespace std;
CvMat *Xp = cvCreateMat(1,1,CV_64FC1); //x座標の配列
CvMat *Yp = cvCreateMat(1,1,CV_64FC1); //y座標の配列
cout << "input x : "; cin >> Xp->data.db[0];
cout << "input y : "; cin >> Yp->data.db[0];
printf("(%.1f, %.1f) から大きさと角度を計算します\n",Xp->data.db[0] , Yp->data.db[0]);
CvMat *Size = cvCreateMat(1,1,CV_64FC1); //大きさを格納する
CvMat *Angle = cvCreateMat(1,1,CV_64FC1); //角度を格納する
cvCartToPolar(Xp,Yp,Size,Angle,0);
printf("(大きさ,角度[rad]) = (%f, %f) \n",Size->data.db[0] , Angle->data.db[0]);
cvReleaseMat(&Xp);
cvReleaseMat(&Yp);
cvReleaseMat(&Size);
cvReleaseMat(&Angle);
return 0;
}
「cvCartToPolar()関数」の入力引数が「CvArr型」なので、「CvMat型」を使用した。
(この関数は、複数のデータをまとめて変換したい時に便利かも)
1つの(x,y)座標ならば、「cvFastArctan()関数」で十分かもしれない。
[例]
#include <iostream> #include <cv.h> #include <cxcore.h> int main() { using namespace std; float x,y; cout << "input x :"; cin >> x; cout << "input y :"; cin >> y; float theta = cvFastArctan(y,x); cout << "角度は " << theta << "°です\n"; cout << "四捨五入して " << cvRound(theta) << "°です\n"; cout << "大きさは " << cvSqrt(x*x+y*y) << "です\n"; return 0; }