頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


iOSでPOCに挑戦(2) フーリエ変換その前に

iOSでPOCに挑戦(1) 位相限定相関法をやってみる
の続きだよ。

位相限定相関法をやるなら避けて通れないのがフーリエ変換なんだ。
あー、やだね、なんだか気が滅入るよね、フーリエ変換って聞くだけで。離散だの高速だのいろいろあってさ。俺も未だにあまり理解できていないんだよね。
まあ位相限定相関法というのは置いといて、まずはフーリエ変換をiOSでやってみようか。もちろん画像を扱うので二次元のフーリエ変換だよ。

なにか適当な画像が欲しいよね、、、

lena

どういうわけか知らないんだけどさ、ネットで文献とか漁ると画像処理関連でよく出てくるサンプル画像がこの女性。誰なんだろうね?
二次元離散フーリエ変換 – AS3.0 « Rest Term
まあ誰でもいいんだけど、↑このページにフーリエ変換した結果も乗っているからこれを使うことにするね。

ありがたいことにフーリエ変換するためのライブラリがすでにあってね。それを使えば一撃なんだよ。Accelerateってフレームワークが必要だよ。
void vDSP_fft2d_zip (
   FFTSetup __vDSP_setup,
   DSPSplitComplex *__vDSP_ioData,
   vDSP_Stride __vDSP_strideInRow,
   vDSP_Stride __vDSP_strideInCol,
   vDSP_Length __vDSP_log2nInCol,
   vDSP_Length __vDSP_log2nInRow,
   FFTDirection __vDSP_direction
);
↑FFTするのにこれを使っているよ。リファレンスにこんな風に書いてるけどなにがなんだかって感じだよね。ここは落ち着いて順番に必要な引数を確認していこうか。

再確認するけど、画像は256x256pxで、データが256x256個あるってことだよ。正方形じゃなくてもいいけど、ここはたまたま正方形というだけだからね。
ただ、画像データの一辺は2^nでないとだめだってのはFFT(高速フーリエ変換)をやろうとすればどこかで聞いたことがあると思う。だから自分のアプリで256は大きいなってことならその一つ下は128ってことになるし、もっと大きいのが欲しいとその上は512ってことになる。
ここでは 256 = 2^8 という数字を覚えておいてね。

最初の引数'FFTSetup __vDSP_setup'はFFTSetupという型の構造体を予め作っておく必要があるんだ。
作り方はこんな感じで:
{
    FFTSetup fftSetup = vDSP_create_fftsetup(8 , FFT_RADIX2);
}
ここで8というのは256が2の8乗だからその8を入れてる。radix(基数)は2なのでそれを意味する定数FFT_RADIX2が二つ目に入れてる。
これはFFTに必要な数値を予め計算しておくものだから、最初に一度やっておけばいいよ。というかFFTのたびにこのセットアップをするなんて時間とバッテーリーの無駄使いになっちゃうので注意しようね(と言ってる俺は最初そうしててデバイスがとても熱くなったもんだよ)。
あと、この構造体は上の例では256(=2^8)でセットアップしてるけど、それ以下のなら使い回しができるからわざわざ作り直す必要ないよ。

そうそう、コード内に数字の8をそのまま入れてるけど、これは説明しやすいからそうしてるんだ。自分でコードを書く時には、潰しが効くように変数なんかを使うことをオススメするよ。

次の'DSPSplitComplex *__vDSP_ioData'って二つ目の引数には画像データを入れるんだけど、長くなったから今回はこの辺りで。



<< Pixelmatorでもベジェ曲線が使える!   TopPage  行動に点数を付けるmyAction Point >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/726-500e1cee




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad