領域の探索

OpenCVを使って、iPhoneのカメラから撮影した画像中にから条件に合致した四辺形を探したい。

OpenCVを使ったイディオムとしては処理は以下のようになるだろう。

1. 画像の前処理 (median, gausian等、フィルタによるノイズ除去等)
2. 画像の2値化 (threshold,adaptiveThreshold等)
3. 輪郭の抽出 (findContour+ approxPolyDPによる輪郭抽出)
4. 四辺形の抽出 (contourの辺数が4で一定のcontourAreaを持つものを選択)

問題は複数抽出されるであろう四辺形のうち、どうやって目的のものを探すかだ。

例えばこのように矩形や台形、円などの図形が描かれたポスターがあって、それをカメラで撮影するとしよう。

抽出したいのは右下の赤い線で描かれた四辺形である。(判りやすくするために色を付けているが、実際には2値化してしまうため、色は意味をなさない) このイメージでは長方形となっているが、実際には方形とは限らず平行四辺形や台形、不等四辺形の場合もある。

さて、特定の四辺形をどうやって抽出すれば良いのだろう。

ぱっと思いつくのはOpenCVで予め用意されたAPIを使って、対象の四辺形を特徴付けることだろう。

面積

contourAreaによって、四辺形の内側の面積を求めることができる。
この面積が合致する四辺形のみを抽出する。

フェレ径比率

boundingRectによって輪郭の集合を含む矩形情報(フェレ径)を取得できる。
このフェレ径の縦横比を特有の情報として抽出する
(画像は歪んでいる可能性があるので、輪郭情報の単なる縦横比では駄目)

構造

findContorsで収集された輪郭の集合は引数にもよるが、輪郭の階層構造を形作る。
この図で言うと赤い四辺形は一番外側の輪郭の一つ下の階層に位置しているので、他の輪郭との関係で特定できる。


これらの方法の良い所は単純で簡単な所だ。輪郭さえ取得できれば面積もフェレ径も構造もAPI一発で取得できることだ。

逆にシンプルな方法ならではの弱点もある。
上の画像はカメラで撮影されるため、撮影された際の様々な条件(明るさ、背景の色、フォーカス、画素数、etc.)によってイメージの品質に影響を受ける。従って上記の特徴を得るための情報に曖昧さが発生することだ。

例えばカメラとの距離や位置によって画像の大きさや輪郭にひずみが出来れば面積に狂いが出るし、認識できない輪郭が出れば構造も変わってしまうのである。

うーん。難しいなぁ。