有一种简单的方法可以使用肤色来检测手部。也许这可以帮助... 您可以在此 YouTube 视频 上查看结果。注意:背景不应包含像木材之类的肤色物品。
以下是代码:
''' Detect human skin tone and draw a boundary around it.
Useful for gesture recognition and motion tracking.
Inspired by: https://dev59.com/ZmUq5IYBdhLWcg3wJNHg#14756351
Date: 08 June 2013
'''
import cv2
import numpy
min_YCrCb = numpy.array([0,133,77],numpy.uint8)
max_YCrCb = numpy.array([255,173,127],numpy.uint8)
cv2.namedWindow('Camera Output')
videoFrame = cv2.VideoCapture(0)
keyPressed = -1
while(keyPressed < 0):
readSucsess, sourceImage = videoFrame.read()
imageYCrCb = cv2.cvtColor(sourceImage,cv2.COLOR_BGR2YCR_CB)
skinRegion = cv2.inRange(imageYCrCb,min_YCrCb,max_YCrCb)
contours, hierarchy = cv2.findContours(skinRegion, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for i, c in enumerate(contours):
area = cv2.contourArea(c)
if area > 1000:
cv2.drawContours(sourceImage, contours, i, (0, 255, 0), 3)
cv2.imshow('Camera Output',sourceImage)
keyPressed = cv2.waitKey(1)
cv2.destroyWindow('Camera Output')
videoFrame.release()
cv2.findContour非常有用,使用cv2.moments可以在找到轮廓后找到“blob”的质心。请查看关于形状描述符的opencv文档。
我还没有想出如何制作位于轮廓中间的骨架,但我正在考虑将轮廓“腐蚀”直到成为一条线。在图像处理中,这个过程称为“骨架化”或“形态学骨架”。这是一些关于骨架化的基本信息。
这里是一个实现opencv和c ++中的骨架化的链接。
这里是一个opencv和python中的骨架化的链接。
希望能对你有所帮助:)
---编辑----
我强烈建议您阅读Deva Ramanan的这些论文(访问链接后向下滚动):http://www.ics.uci.edu/~dramanan/
- C. Desai,D. Ramanan。“使用关系短语检测动作、姿势和物体”欧洲计算机视觉会议(ECCV),意大利佛罗伦萨,2012年10月。
- D. Park,D. Ramanan。“用于部件模型的N-Best最大解码器”国际计算机视觉会议(ICCV),西班牙巴塞罗那,2011年11月。
- D. Ramanan。“学习解析关节对象图像”神经信息处理系统(NIPS),加拿大温哥华,2006年12月。