4

前景が黒で背景が白のバイナリ画像で作業しているとします。頂点座標のリストで指定されたポリゴン内の黒いピクセルを見つける効率的な方法はありますか?

ポリゴンからバウンディングボックスを計算することは理想的ではありません。バウンディングボックスがオーバーラップする可能性のある、近接して変位したポリゴンが多数存在する可能性があるためです。

もちろん、力ずくの方法は、最初に画像全体から黒のピクセルを見つけてから、各黒のピクセルに対してポリゴンテストを実行することです。これは、タスクには時間がかかりすぎます。

どんな提案でも大歓迎です!

ありがとうございました!

4

2 に答える 2

6

ワークフローまたは最終目標に応じて、次のことが役立つ場合があります。

を使用cvFillPolyしてポリゴンのバイナリマスクを作成し、を使用cvCopyして、白く塗りつぶされた配列に作成されたマスクを使用して画像のコピーを作成します。したがって、黒いピクセルはポリゴンにあったピクセルのみです。

または、を使用する代わりに、レイキャスティングアルゴリズムpointPolygonTestを使用して、交差の数が奇数の場合にのみピクセルが黒であるかどうかを確認できます。

レイキャスティングアルゴリズムを自分で実行すると、pointPolygonTestを呼び出すよりも多くの時間を節約できます。

ポイントが存在するスキャンラインに、ライン全体を占めるポリゴンが含まれている場合があります。

レイキャスティングアルゴリズムは、テスト対象のポイントに到達するまで、片側からポリゴンラインの交差をカウントします。m個の線分がある場合は、m個の線分光線の交差を実行し、それらを並べ替えて、発生した数をカウントします。

pointPolygonTestを使用する場合は、すべてのポイントに対してこれを実行する必要がありますが、このライン上のnポイントに対してテストするすべての光線は、すべてラインと交差し、ラインセグメントとの交差はすべて同じ場所で発生するため、アルゴリズムを自分で作成し、交差の数が奇数の場合に黒いピクセルをチェックするようにアルゴリズムを拡張することで、この再計算をすべて節約できます。

于 2012-07-03T04:00:31.003 に答える
3

findContours機能はどうですか?お役に立ちそうです。

于 2012-07-03T06:14:10.027 に答える