手の検出
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
while cap.isOpened():
ret, img = cap.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5, 5), 0)
ret, thresh1 = cv2.threshold(blur, 50, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
image, contours, hierarchy = cv2.findContours(thresh1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
drawing = np.zeros(img.shape, np.uint8)
# 輪郭の検出
ci, max_area = -1, 0
for i in range(len(contours)):
cnt = contours[i]
area = cv2.contourArea(cnt)
# 最大の輪郭を見つける?
if area > max_area:
max_area = area
ci = i
cnt = contours[ci]
# 輪郭の凸包(convex hull)を求める
hull = cv2.convexHull(cnt)
# 輪郭の重心を求める
# http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_contours/py_contour_features/py_contour_features.html
moments = cv2.moments(cnt)
if moments['m00'] != 0:
cx = int(moments['m10'] / moments['m00'])
cy = int(moments['m01'] / moments['m00'])
center = (cx, cy)
cv2.circle(img, center, 5, [0, 0, 255], 2)
# 最大の輪郭と凸包を描画
cv2.drawContours(drawing, [cnt], 0, (0, 255, 0), 2)
cv2.drawContours(drawing, [hull], 0, (0, 0, 255), 2)
# 凹状欠損(convexity defects)の検出
cnt = cv2.approxPolyDP(cnt, 0.01 * cv2.arcLength(cnt, True), True)
hull = cv2.convexHull(cnt, returnPoints=False)
# 凹状欠損の点を描画
defects = cv2.convexityDefects(cnt, hull)
for i in range(defects.shape[0]):
s, e, f, d = defects[i, 0]
start = tuple(cnt[s][0])
end = tuple(cnt[e][0])
far = tuple(cnt[f][0])
dist = cv2.pointPolygonTest(cnt, center, True)
cv2.line(img, start, end, [0, 255, 0], 2)
cv2.circle(img, far, 5, [0, 0, 255], -1)
cv2.imshow('input', img)
cv2.imshow('gray', gray)
cv2.imshow('blur', blur)
cv2.imshow('thresh1', thresh1)
cv2.imshow('drawing', drawing)
k = cv2.waitKey(10)
if k == 27:
break