Python OpenCV / 円を検出する

プラグラミング言語「PYTHON」を使ってみよう!!

業務自動化・効率化の実例を踏まえ、解説できればと思っています。対象は、プログラムを学び始めた初心者向けとなります。

今回の内容

  • openCVを用いて画像内の円を検出する
  • 検出した円を描く



使用するのはopenCV

使用するのは、画像処理ライブラリのopenCVです。ここではopenCVがインストールされているのを前提として書き進めていきます。

サンプルコード

import cv2
import numpy as np

img = cv2.imread('circletest.jpg',0)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,10,param1=50,param2=30,minRadius=0,maxRadius=0)

circles = np.uint16(np.around(circles))

for i in circles[0,:]:
    cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
    cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
    cv2.imwrite('detected-circles.jpg',cimg)

コメント

  • 1行目 OpenCVをインポート
  • 4行目「img = imread〜」jpgファイルを読み込み
  • 7行目「circles = 〜」で円を検出する
  • 9行目「circles = 〜」で16ビットの整数型に変換する
  • 11行目「for i in〜」で検出した円と中心点を画像に描く

元画像


元画像はこちら。ここに描かれている円を検出します。

処理後


上のプログラムを実行すると、円だけを検出することができました。赤い点は中心点です。

引数の値を変更

7行目、cv2.HoughCirclesの引数の値を変更した場合の検出精度をみていきましょう。

cv2.HoughCirclesは、(image, method, dp, minidist, param1, param2, miniRadius, maxRadius)の順に並んでいます。

miniDistを50から10へ


miniDistを50から10へ変更したところ、円が重複されて検出されました。

miniDistでは、検出される円の距離を指定します。この数値を高くすれば、近い円は検出されないため重複を防ぐことができます。

param2を30から10へ


param2を30から10へ変更したところ、誤検出が多くなりました。

param2は、円の中心を検出する閾値です。この値を高くすれば、誤検出を防ぐことができます。ただし高く設定しすぎると、未検出が発生する可能性があります。



タイトルとURLをコピーしました