円を検出する
十字マークの検出ができて、結構使えると思っていたら、最近の極少加工では「丸」マーク、「円」マークがはやっているらしい。何とかして認識しないといけないのですが、モノが「丸」だけに「角」がない。よって「角」検出では認識できません。
円とはどのようなモノか?
円を認識するためには、まず円を知る必要があります。一般的な画像処理では、円認識にもハフ変換を用いることが多いのですが、前述の通り、ハフ変換嫌いの私としては、何とか別の方法をデッチあげたいところです。
円には、さまざまな特徴があります。エッジ検出して、エッジのベクトルを集めてみると、0度から360度までまんべんなく見つかるハズです。四角形なら90度ごとにピークがありますが、そのようなピークは真円であれば検出されないハズです。ただこれだと認識すべきエッジ点が多くなり、高速に解くことは難しそうです。
そこで、工業製品のパターンに通常でてくる0度、90度、45度など、8方向をフィルタリングし、16分の奇数方向(1分の1、16分の3・・・)でピークが出るような関数を作り足きりすれば、円が発見できるのではないかと考えました。手がかりさえ発見すれば、明るさ方向ベクトルから仮想中心を求め、ズレの範囲を規定することで円の位置を判定できそうです。
都合のいい画像を用意する
円検出前の画像
円検出結果の画像
これは随分いい加減な実験で、発見できるように都合よく製作した画像から発見しています。したがって自己満足的なモノともいえるのですが、実際に現場で使用しても、ある程度の成績を得ることができましたので、まったく無謀というわけでもないようです。640ドット×480ドット(上記画像)の場合、特徴点を発見するのにかかった時間は7.5mSでした。
22.5度方向から多少歪んだ箇所を認識しているのは、整数で説くために、tan(22.5度)を41/99で代用していることが主な原因と思われます。整数比で角度を表すことにより、外積の絶対値を整数演算で解くことができるため高速化が期待できます。まあ、32ビットあるんだし、明るさベクトルのXY各方向の理論上最高値は1536、つまりベクトル絶対値の取りうる最高値は2173ですので、もう少し大きな整数比にしても解を求めることができます。「手がかり」としては、これで十分と思われますが。
点と直線の距離
扱いやすい角度を考えるの項でも使っていますが、ベクトル系画像処理を行うのに、ベクトルの内積・外積は避けて通ることができません。2次元ですし、最終的な計算は、四則演算・・・でてきても三角関数どまりです。
点と直線の距離
原点と点A(ax,ay)を通る直線がある。点B(bx,by)と直線の距離・・・つまり点Bから直線に垂線を下ろしたときの交点までの長さは、
になります。分母の部分は、点Aと原点の距離になります。分子の部分は、ベクトルの外積絶対値になります。どうしてそうなるのかについては、ベクトル 外積 あたりで検索してみてください。
今回の場合、22.5度で引いた線に近ければ近いほど良いという値を求めることが命題ですから、ax,ayは原点を通って22.5度になるような任意の組み合わせでOKです。分母部分は、計算して最終的に定数になります。前述の通り ax=99,ay=41として(この場合22.49度)分母部分は小数点を四捨五入して107としました。分母の誤差は0.5%程度ですので問題ないと思われます。
無作為研究所トップページに戻る