Answers:
实际上,使用简单的RGB生成模型而不是HSV可能会更好。
是3 x 3
Edit2: 您获得的值似乎太大。要获得最大协方差,请创建以下矩阵:
255 255 255
0 0 0
并计算其协方差。您应该获得一个矩阵,其中每个值大约为32513。因此,请确保像素值的范围是0到255,并确保将其正确复制到float或double中。马氏距离以方差为单位,因此,该数字应较小。您的皮肤分类阈值应小于4。
到目前为止,您所获得的答案都指向了不错的替代方法,但是,如果您对使用诸如初始算法之类的东西感兴趣,则可能不难解决。您只需要针对OpenCV的HSV特性进行调整。鉴于结果古怪,我认为您可能在选择阈值和/或转换像素时使用了HSV的一种较常见的数字表示形式?
OpenCV代表HSV的方式与您可能发现的大多数其他来源不同:
可能为时已晚,无法为您提供帮助,但这是一个有趣的问题,其他人可能会遇到同样的问题。
import sys
import numpy
import cv2
cap = cv2.VideoCapture(0)
while(1):
_, im = cap.read()
im_ycrcb = cv2.cvtColor(im, cv2.COLOR_BGR2YCR_CB)
skin_ycrcb_mint = numpy.array((0, 133, 77))
skin_ycrcb_maxt = numpy.array((255, 173, 127))
skin_ycrcb = cv2.inRange(im_ycrcb, skin_ycrcb_mint, skin_ycrcb_maxt)
cv2.imshow("Second Image", skin_ycrcb) # Second image
contours, _ = cv2.findContours(skin_ycrcb, cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
for i, c in enumerate(contours):
area = cv2.contourArea(c)
if area > 1000:
cv2.drawContours(im, contours, i, (255, 0, 0), 3)
cv2.imshow("Final Image", im) # Final image
cv2.waitKey(1)