2012-11-22 15 views
6

私はopencv(C++で)には新しく、ライン検出を実装しようとしています。一般的なOpenCVラインの検出

私は2本の線で写真を撮っていますが、線の間隔を調べようとしています。私はハフ、キャニーなどがあることを知っていますが、どのように線の間の距離を計算するために異なる線の座標を得ることができますか? opencv輪郭関数を使うべきか、それとも良い方法があるのでしょうか?私は完全なコードサンプルは必要ありませんが、誰でも私に仕事をやり遂げる最良の方法を教えてもらえますか?

+0

投稿に署名を追加する必要はありません。ユーザーカードが自動的に追加されます。 – Artemix

答えて

13

ライン検出は、ハフ変換を頻繁に使用します。キャニーエッジ検出器と輪郭検出は、必要に応じて便利なプリプロセッサとしてのみ機能します。 - ラインの出力ベクトル

ライン:あなたは平行線をお持ちの場合は

は、2番目のパラメータは検出が含まれていますラインを検出するための

void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0) 

を使用しています。各線は、 2要素ベクトル(ρ、θ)で表されます。 ρは座標 の原点(0、0)(画像の左上隅)からの距離です。 θはラジアン単位のラインの回転角度(0〜垂直ライン、π/ 2〜水平ライン)である。
[opencv2refman.pdf]

これは、2つのライン間の距離は、距離がlinesの最初の列内のピクセル値の間の絶対差があることを、​​なければならないことを意味します。 (注意:!方法はこちらCV_HOUGH_STANDARDする必要があります)

非平行線についてあなたは距離として考えるものを定義する必要がありますが、その後、OpenCVのはまだ検出された各ラインの端点の座標を提供することがあります。
method = CV_HOUGH_PROBABILISTICを使用してください。

CV_HOUGH_PROBABILISTIC確率ハフ変換(画像が少数の長い線形セグメントが含まれている場合場合に より効率的)。 は、行全体ではなく線分を返します。各セグメントは開始点と終了点によって表される であり、マトリックスはCV_32SC4タイプの( 作成されたシーケンスとなる)でなければなりません。
[opencv2refman.pdf]

あなたはまた、あなたのインストールのOpenCVのドキュメント内opencv_tutorials.pdfでチュートリアルを見つけることができます。

+0

あなたの答えに感謝します!次のステップでは、自分の写真の線の品質を見積もりたいと思います。線は溝の縁であり、平行でなければならない。いくつかの場所では、グルービングはデメリットされ、エッジはもはや平行ではありません。直線からの実際のエッジの偏差を得る簡単な方法はありますか? – marc

+0

ええ、わかりません。別の質問として投稿する価値があると思います。 –

+0

私の回答が助けてくれたら投票してください/受け入れてもらえますか? –

関連する問題