【Python】 opencvを利用した円検出に挑戦してみる

今回はopencvを利用して、画像から円検出をしてみたので
皆さんに共有していきます!

このような画像から

 

こんな感じで円を検出できます!




opencvとは

intelが提供するオープンソースの画像処理ライブラリで
Python以外にも、Java, C++,matlab 等いくつかの言語で利用できます。

https://docs.opencv.org/master/
こちらに公式のドキュメントがあるので、仕様など細かい点を知りたい方は読んでみて下さい。

コード紹介

import cv2

# 引数に画像のパス(path)を受け取り、円を検出する
def DetectCircle(path):
    # 画像を読込
    img = cv2.imread(path)
    # グレースケール画像へ変換
    grayImg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # ハフ変換で円検出
    circles = cv2.HoughCircles(grayImg, cv2.HOUGH_GRADIENT, 1, 20,
                               param1=500, param2=55, minRadius=100, maxRadius=0)

    # 元の画像をコピー
    cloneImg = img.copy()

    for cx, cy, r in circles.squeeze(axis=0).astype(int):
        # 円の円周を描画
        cv2.circle(cloneImg, (cx, cy), r, (0, 255, 0), 6)
        # 円の中心を描画
        cv2.circle(cloneImg, (cx, cy), 2, (0, 255, 0), 4)

    # 画像を表示
    cv2.imshow('GrayImg', grayImg)
    cv2.imshow('DetectImg', cloneImg)
    # ウインドウが消えるので、キーを押すまで待機
    cv2.waitKey(0)

    # 終了処理
    cv2.destroyAllWindows()

if __name__ == '__main__':
    img_folder = "C:\\Users\\Shinmai\\Documents\\Python\\opencv"
    img_name = "billiard balls.png"
    
    # 画像のフルパス
    img_path = img_folder + "\\" + img_name
    
    DetectCircle(img_path)

10行目でHoughCircles()を呼び出して円検出を行っていますが
こいつが曲者でして、画像に合わせてパラメタを上手く設定してやらないと円を誤検出しまくります。

今回使用した画像はこちらです。

同じ画像を使えば上のコードで上手く検出できますが、違う画像を使う場合はHoughCircles()のパラメタを設定する必要があります。

ここに各引数の仕様が記載されているので、色々設定してみて下さい。
https://docs.opencv.org/master/dd/d1a/group__imgproc__feature.html#ga47849c3be0d0406ad3ca45db65a25d2d

最後に

いかがだったでしょうか。

今回は画像処理ができるopencvライブラリを紹介しました。

少し扱い方が難しいですが、一緒に学んでいきましょう!



コメント

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