2016-04-03 10 views
0

私はOpenCVを学んでいるだけで、ライン検出について質問があります。私は、白い背景上に水平の黒い線を検出する必要がある状況があります。私はラインが常に水平(数度以内)で表示され、カメラからの画像内の位置を検出する必要があることが保証されています。OpenCVの最も基本的なライン検出方法は何ですか

私は水平なので、イメージ上のいくつかの列を通して "エッジ"を垂直方向に検索し、それを良いと呼ぶことができます。私がカメラからキャプチャしているピクセルの量を、スピードの余分なブーストとして狭めることさえあるかもしれません。

このタイプのライン検出には組み込み関数がありますか?

私は余分な力を必要とせず、CannyやHoughの処理時間がありません。できるだけ早く保証された水平線を見つけたいだけです。 (私の解決策が動作している)

イメージは次のようになります。

Left is thresholded image, right is solution running. Green bars are horizontal edges, red mark the tape strips I'm interested in tracking.

+0

私は右のあなたを理解していれば、私はhttp://stackoverflow.com/questions/21675509/finding-theに似た何かを実装しました-fitline-of-contours-in-opencv/21677214#21677214 – Micka

+0

いくつかの画像を表示できますか? – Miki

答えて

0

私が行った方法はforループです。画像を閾値処理した後、2つの列に沿ってすべての「エッジ」または値の変化を検索します。次に、このリストを処理して、エッジの水平ペアだけを見つけます。

私は十分に近くにあるすべての行を見つけて、目的のインフィル(しきい値付きイメージとのブール比較)を行います。これは、追跡に興味のあるテープのストリップのみを効果的に見つけます。

これは、必要とされるfindContoursなどを除いて、Canny JUSTの時間の約1/50を要します。しかし、私はHoughに対してテストしていませんが、これはまだかなり速いと信じています。

処理速度が最大の問題であったため、私はいくつかの他の最適化も行った。

コードは(それは非常によくコメントしています、私は約束する)ここで見つけることができます:Code as a gist

+0

ハフ変換に精通している必要があります。それでは、それについて考える必要はありません:) – Piglet

+0

ピグレット、私は今それに精通していますが、処理速度が問題であるため、簡単な解決策が必要です。私は基本的にカスタムエッジ検出器を一緒にハックすることができるとき、 "エッジ検出 - >ハフ変換 - >デハウジング"をしたくない、ということは、水平線がどこにあるかを教えてくれる。再び、私はハフが動作すると確信していますが、このアプリケーションでは、それは圧倒されており、遅すぎます。 – DweebsUnited

+0

だからこそ、私はあなたがそれを考慮する必要はないと言った – Piglet

0

あなたはあなたがして良くなる解決策を示唆して話して画像の種類を提供する場合。

また、計算上高価ではないCanny Detectorを使用できないのはなぜですか?さらに、イメージを下げて、エッジを計算し、水平エッジをフィルタリングすることができます。

一方、画像の水平エッジが常に水平であることを知っている場合、テンプレートマッチングを使用できます。

関連する問題