28

我正在尝试使用常规网络摄像头确定骨骼关节(或至少能够跟踪单个手掌)。我已经浏览了整个网络,似乎无法找到这样做的方法。

我发现的每个示例都使用 Kinect。我想使用一个网络摄像头。

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

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

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

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

  • 给定一张图像(来自网络摄像头的一帧),计算可见关节的 X、Y 位置
  • [可选] 给定一个视频捕获流回调到我的代码中,其中包含关节位置的事件
  • 不必非常准确,但希望它非常快(每帧处理时间低于 0.1 秒)

如果有人可以帮助我解决这个问题,我将不胜感激。我已经坚持了几天了,没有明确的前进道路。

更新

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

4

8 回答 8

19

To track a hand using a single camera without depth information is a serious task and topic of ongoing scientific work. I can supply you a bunch of interesting and/or highly cited scientific papers on the topic:

  • M. de La Gorce, D. J. Fleet, and N. Paragios, “Model-Based 3D Hand Pose Estimation from Monocular Video.,” IEEE transactions on pattern analysis and machine intelligence, vol. 33, Feb. 2011.
  • R. Wang and J. Popović, “Real-time hand-tracking with a color glove,” ACM Transactions on Graphics (TOG), 2009.
  • B. Stenger, A. Thayananthan, P. H. S. Torr, and R. Cipolla, “Model-based hand tracking using a hierarchical Bayesian filter.,” IEEE transactions on pattern analysis and machine intelligence, vol. 28, no. 9, pp. 1372–84, Sep. 2006.
  • J. M. Rehg and T. Kanade, “Model-based tracking of self-occluding articulated objects,” in Proceedings of IEEE International Conference on Computer Vision, 1995, pp. 612–617.

Hand tracking literature survey in the 2nd chapter:

  • T. de Campos, “3D Visual Tracking of Articulated Objects and Hands,” 2006.

Unfortunately I don't know about some freely available hand tracking library.

于 2013-06-18T14:21:17.660 回答
9

有一种使用肤色检测手的简单方法。也许这会有所帮助......你可以在这个 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()

cv2.findContour 非常有用,您可以在找到轮廓后使用 cv2.moments 找到“blob”的质心。查看有关形状描述符的 opencv 文档。

我还没有弄清楚如何制作位于轮廓中间的骨架,但我正在考虑“侵蚀”轮廓直到它变成一条线。在图像处理中,该过程称为“骨架化”或“形态骨架”。这是有关骨架化的一些基本信息。

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

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

希望有帮助:)

- - 编辑 - -

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

  1. C.德赛,D.拉马南。“使用关系短语检测动作、姿势和对象”欧洲计算机视觉会议 (ECCV),意大利佛罗伦萨,2012 年 10 月。
  2. D. 公园,D. 拉马南。“零件模型的 N 最佳最大解码器”国际计算机视觉会议 (ICCV),西班牙巴塞罗那,2011 年 11 月。
  3. D.拉马南。“学习解析关节物体的图像”神经信息。过程。系统 (NIPS),加拿大温哥华,2006 年 12 月。
于 2013-06-28T23:47:21.613 回答
2

最常见的方法可以在以下 youtube 视频中看到。http://www.youtube.com/watch?v=xml2S6bvMwI

这种方法不是很可靠,因为如果手旋转太多(例如,如果相机正在查看手的侧面或部分弯曲的手),它往往会失败。

如果您不介意使用两台相机,您可以查看 Robert Wang 的作品。他目前的公司 ( 3GearSystems ) 使用这项技术,通过 kinect 增强,提供跟踪。他的原始论文使用了两个网络摄像头,但跟踪效果更差。

Wang、Robert、Sylvain Paris 和 Jovan Popović。“6d 手:用于计算机辅助设计的无标记手部跟踪。” 第 24 届 ACM 年度用户界面软件和技术研讨会论文集。ACM,2011 年。

另一种选择(同样,如果可以使用“更多”而不是单个网络摄像头),是使用 IR 发射器。您的手可以很好地反射红外光,而背景则不能。通过在网络摄像头中添加过滤正常光的过滤器(并移除相反的标准过滤器),您可以创建非常有效的手部跟踪。这种方法的优点是从背景中分割手部要简单得多。根据相机的距离和质量,您需要更多的 IR LED,以便将足够的光反射回网络摄像头。跳跃运动使用这项技术来跟踪手指和手掌(它使用 2 个红外摄像头和 3 个红外 LED 来获取深度信息)。

说了这么多;我认为 Kinect 是你最好的选择。是的,您不需要深度,但深度信息确实使检测手变得容易得多(使用深度信息进行分割)。

于 2013-06-20T15:36:04.787 回答
2

鉴于您的限制,我的建议是使用以下内容: http ://docs.opencv.org/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html

这是使用它进行人脸检测的教程:http: //opencv.willowgarage.com/wiki/FaceDetection ?highlight=%28facial%29|%28recognition%29

您描述的问题非常困难,我不确定尝试仅使用网络摄像头是否是一个合理的计划,但这可能是您最好的选择。正如这里所解释的(http://docs.opencv.org/modules/objdetect/doc/cascade_classification.html?highlight=load#cascadeclassifier-load),你需要用这样的东西训练分类器:

http://docs.opencv.org/doc/user_guide/ug_traincascade.html

请记住:即使您不需要使用深度信息,但拥有这些信息会使图书馆更容易识别手牌。

于 2013-06-24T15:28:08.383 回答
2

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

形状预测器在dlib 网站上的here中进行了描述

于 2017-04-08T22:54:02.107 回答
0

你听说过眼网吗

我一直在将它用于我的一个项目,但我认为它可能对您想要实现的目标有用。这是一些有趣的出版物 LNAI 3881 - 使用 EyesWeb 的手指跟踪方法使用手势的 Powerpointing-HCI

基本上工作流程是:

  1. 您在 EyesWeb 中创建补丁
  2. 使用网络客户端准备要发送的数据
  3. 在您自己的服务器(您的应用程序)上使用这些处理过的数据

但是,我不知道是否有办法将 Eyes Web 的实时图像处理部分嵌入到软件库中。

于 2013-07-01T00:26:10.857 回答
0

借助开源Blender 项目的运动跟踪功能,可以基于 2D 素材创建 3D 模型。不需要 kinect。由于 blender 是开源的,因此您可以在 blender 框架之外使用他们的 pyton 脚本来实现自己的目的。

于 2013-06-24T14:30:20.840 回答
0

我不知道可能的现有解决方案。如果有监督(或半监督)学习是一种选择,那么训练决策树或神经网络可能已经足够了(kinect 使用我所听到的随机森林)。在你走这条路之前,尽你所能找到一个现有的解决方案。让机器学习的东西正确需要大量的时间和实验。

OpenCV 有机器学习组件,你需要的是训练数据。

于 2013-06-24T13:34:44.010 回答