OpenCVでボールの輪郭描画

前回の色抽出に引き続き、OpenCVを使って輪郭描画を行います。

動画の中からボールを認識して、円で囲います。

環境・バージョン

Windows10
Python 3.6.1
OpenCV 3.3.1

輪郭描画の流れ

独学&初心者で正しいか分かりませんが・・・輪郭描画の流れを書きます。
コードは最後に掲載。

前回、白色の抽出をした画像を元に加工します。

白と黒の2色にしてしまいます。

このままでは、余計なノイズも検出されてしまいます。

対策として、一番大きい領域だけ検出するようにします。

そして、検出した領域の輪郭に接する円を描画して、元画像と合成。

うまく、囲ってくれました。

輪郭描画コード

import cv2
import numpy as np

cap = cv2.VideoCapture('xxxxx.mp4') # 任意の動画
while(1):
    _, frame = cap.read()
    # HSVに変換
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    # 白のHSV範囲
    lower_white = np.array([0,0,100])
    upper_white = np.array([180,45,255])

    # 白以外にマスク
    mask_white = cv2.inRange(hsv, lower_white, upper_white)
    res_white = cv2.bitwise_and(frame,frame, mask= mask_white)

    # 輪郭抽出
    gray = cv2.cvtColor(res_white, cv2.COLOR_RGB2GRAY)
    ret, thresh = cv2.threshold(gray, 45, 255, cv2.THRESH_BINARY)
    imgEdge, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

    # 一番大きい輪郭を抽出
    contours.sort(key=cv2.contourArea, reverse=True)
    cnt = contours[0]

    # 最小外接円を描く
    (x,y), radius = cv2.minEnclosingCircle(cnt)
    center = (int(x),int(y))
    radius = int(radius)
    img = cv2.circle(frame,center,radius,(0,255,0),2)

    # 再生
    cv2.imshow('video',img)
    k = cv2.waitKey(25) & 0xFF

    #Q で終了
    if k == ord('q'):
        break

cv2.destroyAllWindows()

今回も「OpenCV-Python チュートリアル文書」を参考とさせて頂きました。

ありがとうございました。

“OpenCVでボールの輪郭描画” への2件の返信

  1. ピンバック: [OpenCV] 円の検出

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)