Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

Python3.6 + OpenCV3.1.1で対象物を円で囲ってみる

実際のところ

黒背景、対象物は白という状況を作った場合を想定します。

import numpy as np
import cv2
import sys

def function(target_file):
  #画像の読み込み
  img = cv2.imread(target_file)
  gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 
  #二値化による輪郭の抽出
  ret,thresh = cv2.threshold(gray,127,255,0)
  imgEdge,contours,hierarchy = cv2.findContours(thresh, 1, 2)
 
  #抽出された輪郭群をひとつひとつ処理
  i = 0
  for c in contours :
    cnt = c
    M = cv2.moments(cnt)
    #面積を求める
    area = cv2.contourArea(cnt)
    #ゴミを除外
    if area < 1000 : 
        continue

    # 円描画に必要な情報を計算
    (x,y),radius = cv2.minEnclosingCircle(cnt)
    center = (int(x),int(y))
    radius = int(radius)

    #外接円の描画
    img = cv2.circle(img,center,radius,(0,255,0),2)
    print(str(i) + "番目:")
    print(" 面積:" + str(area))
    i = i + 1
 
  cv2.imshow("TEST", img)
  cv2.waitKey(0)
  cv2.imwrite("resutl2.png", img)

if __name__ == '__main__':
  args = sys.argv
  function(args[1])

実行

f:id:shuzo_kino:20180109202143p:plain

実行すると、こんな感じになります

$ python sample_opencv_area.py base.png

f:id:shuzo_kino:20180109202159p:plain
端末出力にはこんな感じで

0番目:
 面積:5284.0
1番目:
 面積:2390.5