2

キャニー エッジ検出から抽出された細い輪郭の終点を取得する方法を探しています。これは組み込みの方法で可能かどうか疑問に思っていました。等高線を歩いて、互いに最大の距離を持つ 2 つのポイントを見つける予定です (等高線に沿ってのみ移動します) が、既にウェイが存在する場合ははるかに簡単です。輪郭の周囲を取得するために cvarcLength が存在することがわかったので、これを達成するための組み込みの方法がある可能性があります。端点について何らかの情報を知ることができるように並べられた輪郭内の点ですか? 他のアイデアはありますか?どうもありがとう!

4

3 に答える 3

0

近隣距離チェックに基づくソリューションは、私にとってはうまくいきませんでした (Python + opencv 3.0.0-beta)。画像上で一見「開いた」輪郭に見えるものは、実際には「閉じた」輪郭が折りたたまれています。

そのため、Python の例のように、各輪郭のシーケンスで「u ターン」を探す必要がありました。

import numpy as np

def draw_closing_lines(img, contours):
    for cont in contours:
        v1 = (np.roll(cont, -2, axis=0) - cont)
        v2 = (np.roll(cont, 2, axis=0) - cont)
        dotprod = np.sum(v1 * v2, axis=2)
        norm1 = np.sqrt(np.sum(v1 ** 2, axis=2))
        norm2 = np.sqrt(np.sum(v2 ** 2, axis=2))
        cosinus = (dotprod / norm1) / norm2
        indexes = np.where(0.95 < cosinus)[0]
        if len(indexes) == 1:
            # only one u-turn found, mark in yellow
            cv2.circle(img, tuple(cont[indexes[0], 0]), 3, (0, 255, 255))
        elif len(indexes) == 2:
            # two u-turns found, draw the closing line
            cv2.line(img, tuple(tuple(cont[indexes[0], 0])), tuple(cont[indexes[1], 0]), (0, 0, 255))
        else:
            # too many u-turns, mark in red
            for i in indexes:
                cv2.circle(img, tuple(cont[i, 0]), 3, (0, 0, 255))

汚染カスプに対して完全に堅牢というわけではなく、かなり時間がかかりますが、それが始まりです。もちろん、他のアイデアにも興味があります:)

于 2014-12-14T12:48:20.943 に答える