gologiusの巣

プログラミングなどの技術メモです。誰かの役に立てるとうれしいです。

Python cv2.connectedComponentsWithStats

返り値で迷った.というかOpenCVのリファレンスPythonに厳しくないですか?

OpenCVSample/Labeling.py at master · gologius/OpenCVSample · GitHub

# -*- coding: utf-8 -*-

import cv2
import numpy as np


img = np.zeros((500,500,3),dtype=np.uint8)
for i in xrange(1,5):
    img = cv2.circle(img, (i*80,i*80), 5, (255,255,255), -1)     
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

labelnum, labelimg, contours, GoCs = cv2.connectedComponentsWithStats(gray)

for label in xrange(1,labelnum):
    x,y = GoCs[label]
    img = cv2.circle(img, (int(x),int(y)), 1, (0,0,255), -1)    
    
    x,y,w,h,size = contours[label]
    img = cv2.rectangle(img, (x,y), (x+w,y+h), (255,255,0), 1)    
    
    
print "label num ", labelnum 
print "contours ", contours
print "Gravity of Centers ", GoCs
cv2.imshow("img", img)
cv2.waitKey(-1)
cv2.imwrite("labeling.png",img)

f:id:kamiwo_koete:20161119214434p:plain

これでラベル数,ラベル付けされた画像,各ラベルを包括する矩形たち,各ラベルの重心がとれる. contours(包括する矩形)は最後にsize(矩形の面積,ピクセル数)が入ってるので注意. またcv2.circleに突っ込む場合,座標はtupleかつintでないと死ぬ