これは、皮膚の検出に理想的なソリューションの1つです。
上記の回答のほとんどは、濃い赤、明るい黄色、明るいオレンジなどのさまざまな肌の色で機能します。ただし、これらの色は、画像ではほとんど見られないため、肌の色ではありません。
この写真でわかるように、赤い範囲は350から20の間のどこかにあります。
したがって、スキンの色相には2つの可能な範囲があります。
HSV範囲
#1st range of Hue
lower -> [0, 30, 53]
upper -> [20, 150, 255]
#2nd range of Hue (OpenCV converts 360 to 180)
lower2 -> [172, 30, 53]
upper2 -> [180, 180, 210]
完全なコード:
import os, cv2
import numpy as np
image = cv2.imread(os.path.join('skin.png'))
# Covers both range
lower = np.array([0, 30, 53], dtype = "uint8")
upper = np.array([20, 180, 255], dtype = "uint8")
lower2 = np.array([172, 30, 53], dtype = "uint8")
upper2 = np.array([180, 180, 210], dtype = "uint8")
converted = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
skinMask = cv2.inRange(converted, lower, upper)
skinMask2 = cv2.inRange(converted, lower2, upper2)
#Gaussian Blur
skinMask = cv2.GaussianBlur(skinMask, (3, 3), 0)
skinMask2 = cv2.GaussianBlur(skinMask2, (3, 3), 0)
skin1 = cv2.bitwise_and(image, image, mask = skinMask)
skin2 = cv2.bitwise_and(image, image, mask = skinMask2)
skin = cv2.bitwise_or(skin1,skin2) #adding both ranges
# show the skin in the image along with the mask
cv2.imshow("images", np.hstack([frame, skin]))
cv2.waitKey(0)