OpenGL de プログラミング - OpenCV::離散フーリエ変換
現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCV::離散フーリエ変換

問題


OpenCVのライブラリを利用して、以下のデータ(複素数列)に対し離散フーリエ変換を行い、
その結果を出力せよ。

(0,0),(0,0),(1,0),(1,0),
(1,0),(1,0),(0,0),(0,0)

OpenCV::離散フーリエ変換2 (2次元離散フーリエ変換)

答え


#include <cv.h>
#include <highgui.h>
#include <cstdio>

using namespace std;

float data[8][2] =
{
{0,0},
{0,0},
{1,0},
{1,0},
{1,0},
{1,0},
{0,0},
{0,0}
};

int main( int argc, char **argv)
{

CvMat f = cvMat (1,8, CV_32FC2, &data[0][0]);


for(int i = 0;i<16;i+=2)
printf("%f,%f \n",f.data.fl[i],f.data.fl[i+1]);

puts("------ DFT -------");


cvDFT(&f,&f,CV_DXT_FORWARD);


for(int i = 0;i<16;i+=2)
printf("%f,%f \n",f.data.fl[i],f.data.fl[i+1]);

return 0;
}

メモ


このプログラムは、1次元離散フーリエ変換。

CvMatは以下のような構造体
http://opencv.jp/opencv/document/opencvref_cxcore_...

よってデータのアクセスは、

f.data.fl[i]   (←「構造体」の中にある「共用体のfloat型のデータ」にアクセス)

のようになる。



cvDFT関数
http://opencv.jp/opencv/document/opencvref_cxcore_...


※DFTを高速に計算するには、cvGetOptimalDFTSize()で最適なDFTのサイズを得るようだ。
http://opencv.jp/opencv/document/opencvref_cxcore_...