Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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