我正在尝试使用OpenCV库实现手语翻译。要做到这一点,我需要检测手势作为第一阶段。所以基本上我已经通过将RGB颜色空间转换为YCbCr来实现手的检测,然后阈值处理肤色范围。
ycc = cv2.cvtColor(img , cv2.COLOR_BGR2YCR_CB)
min_ycc = np.array([0,133,85], np.uint8)
max_ycc = np.array([255,170,125], np.uint8 )
skin = cv2.inRange(ycc, min_ycc, max_ycc)
opening = cv2.morphologyEx(skin, cv2.MORPH_OPEN, np.ones((5,5), np.uint8), iterations=3)
sure_bg = cv2.dilate(opening,np.ones((3,3),np.uint8), iterations=2)
_,contours,_ = cv2.findContours(sure_bg, cv2.RETR_LIST,cv2.CHAIN_APPROX_NONE)
这个代码可以很好地处理低细节背景,但如果我们有一个包含近乎肤色的详细背景,它会产生一些噪音 我唯一关心的是如何确定哪个轮廓是手形轮廓。我尝试了最大轮廓,但它没有非常准确地工作。
答案 0 :(得分:1)
您可以通过侵蚀和扩张(形态学操作)消除背景噪音。然后,您可以设置轮廓区域的阈值(area = cv2.contourArea(cnt))并过滤掉手轮廓。 另一种方法是使用直方图反投影。