2

以下のようにOpenCVでCanny()関数を使用しています

Mat detected_edges = GetImage...;
Canny( detected_edges, detected_edges, 20, 20*3, kernel_size );

私の問題は、この関数の結果が白黒画像のみであることです。検出されたエッジのセットを取得したいと考えています。

OpenCVのドキュメントに書いた

この関数は、入力イメージ イメージ内のエッジを検出し、Canny アルゴリズムを使用して出力マップ エッジ内でそれらをマークします。エッジ リンクには、しきい値 1 としきい値 2 の間の最小値が使用されます。最大値は、強いエッジの最初のセグメントを見つけるために使用されます。

しかし、結果の画像から線を抽出する方法がわかりません。誰かが助けてくれます。

更新以下のテストに使用した画像。この画像にはキャニー関数の結果が含まれています

ここに画像の説明を入力

4

4 に答える 4

2

キャニー アルゴリズムは、エッジの実際の形状を認識しません。これらの派手な 1 ピクセル幅の線は、実際には単純なエッジ検出ソーベル演算子のピークであり、非最大値抑制で抽出されています。Canny は、ピクセルをチェーンまたはセグメントに接続しません。ヒステリシスしきい値を適用するために内部的に接続されたコンポーネントを形成する場合がありますが、これは実装の詳細です。

自分で行う必要があります。可能なルーチンについては、berak の回答を参照してください。

于 2013-09-09T12:11:44.047 に答える
2

berak が言ったように、findContours を使用して、エッジ検出後に接続されたコンポーネントを見つけることができます。それについて別のスタックオーバーフローの質問があります: OpenCV の接続されたコンポーネント

例を次に示し ます。

この場合、描画に使用していますが、どのような目的にも使用できます。

于 2013-10-05T20:26:54.467 に答える