我试图使mediapipe的手部检测能够真实的地在戴着蓝色手套的手上工作。但它不能正常工作。如果颜色与肤色相似,则检测仍然可以在手套上工作。所以,我尝试做一些预处理,其中我改变了蓝色像素上发现的帧到裸色。结果是它无法准确地检测到手-有时它可以,但它后来会消失。
请帮我解决这个问题。我在某个地方读到过,这种手部检测可以通过将手套的颜色改变为肤色,同时保留手部的阴影来真实的工作在蓝色手套上。但我不知道该怎么做。如果你能帮助我,我将不胜感激。
def findHands(self, img, draw=True, flipType=True):
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
blue = [0,0,255]
nude=[225, 190, 160]
#Make mask
Bmask = np.all(imgRGB == blue, axis=-1)
#Replace blue pixel into nude
imgRGB[Bmask] = nude
img_res=imgRGB
#Send frame to mediapipe
self.results = self.hands.process(img_res)
1条答案
按热度按时间8wigbo561#
最简单的解决方案是省略
cv2.cvtColor()
,这将导致图像通道交换,有效地使blue
看起来像orange
。下面是一个例子(对于mediapipe==0.9.0):这应该足以让MediaPipe识别手牌:
或者,您也可以使用HSV模式(adapted from here)中的色调偏移对颜色变化进行微调。这将是一个“更好”的解决方案,因为它只改变色调,但不交换通道。
**编辑:**我创建了一个简单的色调调整“类似GUI”的脚本,可以帮助找到合适的色调偏移:
再来一个demo: