前回の記事『iOS で物体の向きをリアルタイムに計算①【2D FFTでパワースペクトル画像生成】』の続きです。
パワースペクトルから方向を抽出して表示します。
左上の赤い線が抽出した方向を表しています。
前回の記事のでは上半分の画像はFFTに入力する画像(周囲を暗くした画像)を表示していましたが、今回は暗くする前の画像を表示しています。
コードはGithubに置いています。
次の方法でパワースペクトルが格納された配列を処理することで、エッジがはっきりしている、且つ、他の物体と混在していないという限定的な場面あれば概ね向きの判別ができています。
- 弱い振幅は捨てる
- 方向別に振幅の値を合計する
- 合計値が一番多い方向を物体の向きとする
1. 弱い振幅は捨てる
単純に角度別の振幅の合計値で向きを判別するので、なるべく物体としての特徴がない成分(=ここでは振幅が弱い部分)をゼロにしておきます。今回作成したサンプルは100dB以下を削除しています。
これは100dB以下の振幅値をゼロにしてそれをスペクトル画像にした場合の画像です。
方向成分が抽出できていると思います。
2. 方向別に振幅の値を合計する
一番強い方向を判別するため、ここでは扇状の各領域の振幅の大きさを足し込む方法をとります。
※モーメント特徴で主軸方向を求める方法等、他にも方法はあると思います。
次のイメージのように原点(直流部分)を中心として10度刻みの扇状の領域の振幅値を合計します。
画像解像度が低いことにより、個々の扇状の領域に差異が生じるため、ここでは差異を補正する係数も計算しておきます。本サンプルプログラムでは一番大きな領域に合わせるように係数を算出しています(Spectrum
構造体の配列angleCorrectionValue
)。
ちなみに、今回のサンプルでは扇の半径はFFTの出力の横幅と同じにしています。「1. 弱い振幅は捨てる」の動作画像のように低周波領域に特徴が表れているので半径を絞ることもできそうです。
3. 合計値が一番多い方向を物体の向きとする
2で計算した合計値と補正係数を使って、一番大きな値となる角度を物体の向きとします。
周波数成分はエッジに直交するので、取得した角度に90度足します。
以上です。