現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCV::極座標変換

問題


キーボードから、x,y座標をそれぞれ入力し、
極座標に変換した時の大きさと角度(ラジアン)を出力せよ

答え


#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;
}

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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