所以我有一个肤色范围,我用来绘制我的相机看到的任何肤色的轮廓,即它会在手或脸等上画出轮廓。
然而,我用来绘制轮廓的颜色范围有红色范围0-255,因此它基本上围绕红色的所有部分绘制轮廓。然而,红色像素对于良好的皮肤检测很重要,所以我无法改变它。
所以我想知道如何调整轮廓代码,以便它不会在红色周围绘制轮廓。
我的代码如下:
min_YCrCb = np.array([0,133,77],np.uint8) # Create a lower bound for the skin color
max_YCrCb = np.array([255,173,127],np.uint8) # Create an upper bound for skin color
skinRegion = cv2.inRange(converted,min_YCrCb,max_YCrCb) # Create a mask with boundaries
contours, hierarchy = cv2.findContours(skinRegion, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # Find the contour on the skin detection
for i, c in enumerate(contours): # Draw the contour on the source frame
area = cv2.contourArea(c)
if area > 10000:
cv2.drawContours(img, contours, i, (255, 255, 0), 2)
答案 0 :(得分:0)
根据我使用OpenCV的经验以及其他许多人的建议,将RGB颜色方案转换为HSV。
HSV代表色调,饱和度和值,是白光光谱中表达不同颜色的另一种方式。在RGB中,很难找到明亮或暗淡的颜色,但在HSV颜色范围内并非如此。
在OpenCV的Python documentation中可以看到将BGR转换为HSV的示例,注意: HSV中的H范围为0-179,而其他范围为0-255。
您可以使用函数hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
切换到HSV,然后让代码找到该图像流中的轮廓而不是原始轮廓。要弄清楚你的HSV范围应该设置为什么,你可以谷歌RGB到HSV转换器such as this one - 注意: OpenCV通常使用BGR而不是RBG,所以要小心不要混淆它们
这可以帮助您找到确保程序正常运行所需的确切颜色范围。
min_YCrCb = np.array([0,0,0],np.uint8) # Create a lower bound HSV
max_YCrCb = np.array([179,255,255],np.uint8) # Create an upper bound HSV
hsv = cv2.cvtColor(converted, cv2.COLOR_BGR2HSV) # assuming converted is your original stream...
skinRegion = cv2.inRange(hsv,min_YCrCb,max_YCrCb) # Create a mask with boundaries
contours, hierarchy = cv2.findContours(skinRegion, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # Find the contour on the skin detection
for i, c in enumerate(contours): # Draw the contour on the source frame
area = cv2.contourArea(c)
if area > 10000:
cv2.drawContours(img, contours, i, (255, 255, 0), 2)