使用网络摄像头确定骨架关节(不是Kinect)

YeP*_*IcK 26 webcam opencv tracking gesture-recognition human-interface

我正在尝试使用常规网络摄像头确定骨架关节(或者至少能够跟踪单个手掌).我在网上看了一遍,似乎无法找到办法.

我发现的每个例子都是使用Kinect.我想使用一个网络摄像头.

我不需要计算关节的深度 - 我只需要能够识别它们在框架中的X,Y位置.这就是我使用网络摄像头而不是Kinect的原因.

到目前为止,我已经看过了:

  • OpenCV(其中的"骨架"功能是简化图形模型的过程,但它不是人体的检测和/或骨架化).
  • OpenNI(使用NiTE) - 获得关节的唯一方法是使用Kinect设备,因此这不适用于网络摄像头.

我正在寻找一个C/C++库(但此时会查看任何其他语言),最好是开源(但同样,会考虑任何许可),可以执行以下操作:

  • 给定图像(来自网络摄像头的帧)计算可见关节的X,Y位置
  • [可选]给定视频捕获流回调到我的代码中,并显示关节位置的事件
  • 不一定非常准确,但更喜欢它非常快(每帧0.1秒的处理时间)

如果有人可以帮我解决这个问题,我将非常感激.我已经被困在这几天了,没有明确的道路可以继续.

UPDATE

2年后,找到了一个解决方案:http://dlib.net/imaging.html#shape_predictor

Pal*_*rom 19

使用没有深度信息的单个摄像机跟踪手是一项严肃的任务和正在进行的科学工作的主题.我可以为您提供一系列有趣和/或被高度引用的关于该主题的科学论文:

  • M. de La Gorce,DJ Fleet和N. Paragios,"基于模型的单眼视频3D手姿态估计.",IEEE关于模式分析和机器智能的交易,第一卷.2011年2月33日.
  • R. Wang和J.Popović,"使用彩色手套进行实时手动跟踪",ACM Transactions on Graphics(TOG),2009.
  • B. Stenger,A.Thayananthan,PHS Torr和R. Cipolla,"基于模型的手动跟踪使用分层贝叶斯过滤器.",IEEE交易模式分析和机器智能,第一卷.28,不.9,pp.1332 - 84,2006年9月.
  • JM Rehg和T. Kanade,"基于模型的自封闭关节对象的跟踪",载于IEEE国际计算机视觉会议论文集,1995年,第612-617页.

第二章手部跟踪文献调查:

  • T. de Campos,"关节和物体的三维视觉跟踪",2006年.

不幸的是,我不知道一些免费提供的手部跟踪库.

  • 我不需要深度信息 - 只需要摄像机视图中对象的像素位置(或中心). (2认同)

sam*_*n13 7

有一种简单的方法来检测使用肤色的手.也许这可以帮助...你可以在这个YouTube 视频上看到结果.警告:背景不应包含像木头一样的肤色.

这是代码:

''' Detect human skin tone and draw a boundary around it.
Useful for gesture recognition and motion tracking.

Inspired by: http://stackoverflow.com/a/14756351/1463143

Date: 08 June 2013
'''

# Required moduls
import cv2
import numpy

# Constants for finding range of skin color in YCrCb
min_YCrCb = numpy.array([0,133,77],numpy.uint8)
max_YCrCb = numpy.array([255,173,127],numpy.uint8)

# Create a window to display the camera feed
cv2.namedWindow('Camera Output')

# Get pointer to video frames from primary device
videoFrame = cv2.VideoCapture(0)

# Process the video frames
keyPressed = -1 # -1 indicates no key pressed

while(keyPressed < 0): # any key pressed has a value >= 0

    # Grab video frame, decode it and return next video frame
    readSucsess, sourceImage = videoFrame.read()

    # Convert image to YCrCb
    imageYCrCb = cv2.cvtColor(sourceImage,cv2.COLOR_BGR2YCR_CB)

    # Find region with skin tone in YCrCb image
    skinRegion = cv2.inRange(imageYCrCb,min_YCrCb,max_YCrCb)

    # Do contour detection on skin region
    contours, hierarchy = cv2.findContours(skinRegion, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # Draw the contour on the source image
    for i, c in enumerate(contours):
        area = cv2.contourArea(c)
        if area > 1000:
            cv2.drawContours(sourceImage, contours, i, (0, 255, 0), 3)

    # Display the source image
    cv2.imshow('Camera Output',sourceImage)

    # Check for user input to close program
    keyPressed = cv2.waitKey(1) # wait 1 milisecond in each iteration of while loop

# Close window and camera after exiting the while loop
cv2.destroyWindow('Camera Output')
videoFrame.release()
Run Code Online (Sandbox Code Playgroud)

cv2.findContour非常有用,你可以在找到轮廓后使用cv2.moments找到"blob"的质心.看一下有关形状描述符的opencv文档.

我还没弄明白如何制作位于轮廓中间的骷髅,但我想要"蚀刻"轮廓,直到它是一条线.在图像处理过程中,该过程称为"骨架化"或"形态骨架".这里有一些关于骨架化的基本信息.

这是一个在opencv和c ++中实现骨架化的链接

这是opencv和python中骨架化的链接

希望有帮助:)

---编辑----

我强烈建议您阅读Deva Ramanan的这些文章(访问链接页面后向下滚动):http://www.ics.uci.edu/~dramanan/

  1. C. Desai,D.Ramanan."检测具有关系短语的动作,姿势和对象"欧洲计算机视觉会议(ECCV),意大利佛罗伦萨,2012年10月.
  2. D. Park,D.Ramanan."部分模型的N最佳最大解码器"计算机视觉国际会议(ICCV)西班牙巴塞罗那,2011年11月.
  3. D. Ramanan."学习解析关节对象的图像"神经信息.PROC.系统(NIPS),加拿大温哥华,2006年12月.


YeP*_*IcK 2

最后我找到了解决方案。事实证明,一个dlib开源项目有一个“形状预测器”,一旦经过适当的训练,它就能完全满足我的需要:它猜测(以相当令人满意的精度)“姿势”。“姿势”被宽泛地定义为“通过使用一组图像对其进行训练来训练它识别为姿势的任何内容”,并用从中提取的形状进行注释。

形状预测器在dlib 网站上有描述