皆さん。明けましておめでとうございます❗


今回は前回のカメラモジュール(ov7670)の続きで、、取得した画像データから画像解析をしてみました。

ただ単に画像解析をすると言っても意味が曖昧なので今回は簡単な目標を立てました。
それは、




1. 取得した画像から特定の物体のみを検出し追跡に必要なデータ(主に重心、面積)を生成する







2. なるべく処理時間は短縮させる








、、、、、、と言ったところです。





まず、1. の『特定の物体を検出する』ということですが簡単に言えば特定の色だけを取得した画像から抜き出すということです。
つまり………まず最初に特定の色を検出し2値化データを生成する事が必要です。




では、取得した画像から特定の色を検出するためにはどうすればいいのでしょうか?
方法としては、



シンプルにRGBそれぞれの値から判断する方法
と、


RGBからHSVを生成し判断する方法があります。



前者はプログラム的には非常にシンプルですが
閾値の調整等が非常に大変で地味になかなか苦労します。



後者はプログラム的には少し面倒な変換式を書く必要がありますがH(色相),S(彩度),V(明度)なので閾値の調整が簡単で直感的に扱う事ができます。



なので今回はHSVを用いて色検出をしました。



そしてこちらが取得した画像(下)から色検出をした後の2値化画像(上)です。
(今回は緑を検出対象にしました)

image





検出はできていますがこれではノイズ(ごま塩ノイズ)が多く、これから処理をしていく過程において大きなハンデを伴います。なので、
オープンニングとクロージングをしてノイズを除去します。



そしてこちらがノイズ除去後(上)です

image








これで色検出はバッチリです。しかし実は、物体検出という意味ではこれではまだ不十分です。

何故なら検出した色全てのものをひとまとまりの物体と捉えてしまっているからです。
つまり、白の連続した画素同士で区別をつける必要があります。
その方法がラベリングというものです。

ラベリングは連続した白(high)に同じ数値(ラベル)を割り当てるので物体同士で区別をつける事ができるようになります。


種類は8近傍と4近傍がありますが今回は8方近傍でラベリングをしました。



そしてこちらが2値化画像(下)からラベリングをした後の画像(上)です。
image




ラベリングが出来れば重心(つまり面積)は簡単に求める事ができます。(上)

image




速度的にはこのような感じです(https://youtu.be/cLSvlq4CYpM)


これぐらいのフレームレートなら支障なさそうですね、
ラベリングは実に優秀で円形度を求める事もでき円検出も可能のようです。
それはまた、暇があればやっていきたいと思います
プログラムは要望があればmbedにて公開します。





……………………と画像解析はここらへんまでにして次回は遂にクアッドコプター(半)自律制御のミソである姿勢制御の準備等について書いていけたらなと思います()






ではまた、、