Python
 Computer >> コンピューター >  >> プログラミング >> Python

OpenCVを使用したPythonでの行検出?


この投稿では、ハフ変換と呼ばれる手法を使用して、画像内の線を検出する方法を学習します。

ハフ変換?

ハフ変換は、単純な形状を数学的な形式で表現できる場合に、その形状を検出するための特徴抽出方法です。少し壊れたり歪んだりしても、なんとか形を検出できます。ラインに対してどのように機能するかを見ていきます。

「単純な」形状とは、いくつかのパラメータで表現できる形状です。たとえば、線は2つのパラメータ(傾き、切片)のみで表すことができ、円には3つのパラメータ(中心の座標と半径(x、y、r))があります。

ハフ変換を使用して画像から線を検出する

線は方程式で表すことができます-またはパラメトリック形式で表すことができます。ここで、(ρ)は原点から線までの垂直距離であり、ϴはこの垂直線とカウンターで測定された水平軸によって形成される角度です。 -時計回り(この表現はOpenCVで使用されます)。下の画像を確認してください


OpenCVを使用したPythonでの行検出?

したがって、線が原点の下を通過する場合、正のrhoと180未満の角度になります。原点より上にある場合、角度を180より大きくする代わりに、角度を180未満とし、rhoを負にします。垂直線は0度、水平線は90度になります。

アキュムレータ

任意の線は、これらの2つの項(ρ、ϴ)で表すことができます。したがって、最初に2D配列またはアキュムレータ(2つのパラメータの値を保持するため)を作成し、最初は0に設定されます。ここで、行はρを示し、列はϴを示します。アレイのサイズは、必要な精度によって異なります。たとえば、角度の精度を1度にする必要がある場合は、180列とρが必要です。可能な最大距離は画像の対角線の長さであり、ρは可能な最大距離です。画像の対角線の長さです。したがって、1ピクセルの精度と行数を取得すると、画像の対角線の長さになります。

中央に水平線がある100*100の画像があるとします。線の最初の点を取ると、その(x、y)値がわかります。ここで、方程式で、値ϴ =0,1,2,3…180をpuし、取得したρ値を確認します。すべての(ρ、ϴ)ペアについて、値を1つインクリメントすると、対応する(ρ、ϴ)セルのアキュムレータになります。したがって、アキュムレータでは、セル(50,90)=1と他のいくつかのセルがあります。次に、ラインの2番目のスポットを取ります。最初のスポットで行ったのと同じ手順を繰り返します。取得した(ρ、ϴ)に対応するセルの値をインクリメントします。今回は、セル(50,90)=2です。したがって、実際には(ρ、ϴ)の値に投票しています。ライン上のすべてのポイントでこのプロセスを続行します。各スポットで、セル(50,90)がインクリメントまたは投票されますが、他のセルは投票されない場合があります。このようにして、最後に、セル(50,90)の投票数が最大になります。したがって、アキュムレータで最大投票数を検索すると、値(50,90)が得られます。これは、この画像の原点から距離50度、角度90度に線があることを示しています。これが、線のハフ変換の仕組みです。

OpenCVでのハフ変換

上で説明したものはすべて、OpenCV関数cv2.HoughLines()にカプセル化されています。単純に(ρ、ϴ)値の配列を返します。ここで、ρはピクセルで測定され、ϴはラジアンで測定されます。

以下は、openCVとハフライン変換を使用したライン検出のプログラムです。

以下は駐車場の実際の画像です。この画像で、ハフライン変換とOpenCVライブラリを使用してライン検出を行います。

OpenCVを使用したPythonでの行検出?

import cv2
import numpy as np
img = cv2.imread("parkingLot1.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 75, 150)
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 30, maxLineGap=250)
for line in lines:
   x1, y1, x2, y2 = line[0]
   cv2.line(img, (x1, y1), (x2, y2), (0, 0, 128), 1)
cv2.imshow("linesEdges", edges)
cv2.imshow("linesDetected", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

結果

OpenCVを使用したPythonでの行検出?

そして検出された線-

OpenCVを使用したPythonでの行検出?


  1. PythonOpenCvモジュールを使用して画像に幾何学的形状を描画します

    OpenCVの基本的な操作は、画像を描画することです。線、円、長方形などのさまざまな幾何学的形状を追加する機能。 多くの場合、画像分析を使用して、画像の一部を強調表示する必要があります。たとえば、その部分を定義する長方形を追加します。また、例として、何かを示す矢印。 cv2.line()-この関数は、画像に線を引くために使用されます。 cv2.rectangle()-この関数は、画像に長方形を描画するために使用されます。 cv2.circle()-この関数は、画像に円を描くために使用されます。 cv2.putText()-この関数は、画像にテキストを書き込むために使用されます。 c

  2. PythonOpenCvを使用してリバースモードでビデオを再生する

    OpenCvの完全な形式はオープンソースのコンピュータービジョンであり、このライブラリを使用して、画像やビデオに対してさまざまな操作を実行できます。 OpenCVのアプリケーション領域 顔認識システム モーショントラッキング 人工ニューラルネットワーク ディープニューラルネットワーク ビデオストリーミングなど Windowsにインストールする場合は、このコマンドラインを使用できます pip install opencv-python Linuxの場合- sudo apt-get install python-opencv タスクを完了するには、いくつかの手順に従う必要