Определение суставов скелета с помощью веб-камеры (не Kinect)

Я пытаюсь определить скелет суставы (или, по крайней мере, чтобы иметь возможность отслеживать одной ладони) с помощью обычная веб-камера. Я просмотрел всю сеть и, похоже, не могу найти способ сделать это.

каждый пример, который я нашел, использует Kinect. Я хочу использовать одну веб-камеру.

Мне не нужно вычислять глубину стыков - мне просто нужно уметь распознавать их положение X, Y в кадре. Вот почему я использую веб-камера, а не Кинект.

до сих пор я смотрел на:

  • OpenCV (функциональность "скелета" в нем-это процесс упрощения графических моделей, но это не обнаружение и/или скелетирование человеческого тела).
  • OpenNI (с NiTE) - единственный способ получить суставы-использовать устройство Kinect, поэтому это не работает с веб-камерой.

Я ищу библиотеку C / C++ (но на данный момент будет смотреть на любой другой язык), предпочтительно с открытым исходным кодом (но, опять же, рассмотрит любую лицензию), которая может сделать следующее:

  • учитывая изображение (кадр с веб-камеры) вычислить X, Y позиции видимых соединений
  • [необязательно] учитывая поток видеозахвата, перезвоните в мой код с событиями для позиций суставов
  • не должен быть супер точным, но предпочел бы, чтобы это было очень быстро (sub-0.1 сек время обработки на кадр)

действительно спасибо, если кто-нибудь поможет мне с этим. Я застрял на этом в течение нескольких дней, не имея четкого пути для продолжения.

обновление

через 2 года было найдено решение:http://dlib.net/imaging.html#shape_predictor

8 ответов


отслеживать руку с помощью одной камеры без информации о глубине является серьезной задачей и темой текущей научной работы. Я могу предоставить вам кучу интересных и / или высоко цитируемых научных работ по теме:

  • M. de La Gorce, D. J. Fleet и N. Paragios, " оценка 3D-позы руки на основе модели из монокулярного видео., "IEEE transactions on pattern analysis and machine intelligence, vol. 33, февраля. 2011.
  • Р. Ван И Дж. Попович, " в режиме реального времени отслеживание вручную с помощью цветной перчатки, " ACM Transactions on Graphics (TOG), 2009.
  • Б. Stenger, А. Thayananthan, П. С. Х. Торр, Р. Чиполла, на основе модели "отслеживание рук с помощью иерархический Байесовский фильтр., "IEEE transactions on pattern analysis and machine intelligence, vol. 28, Нет. 9, стр. 1372-84, сентября. 2006.
  • J. М. Rehg и T. Kanade, "модельное отслеживание самозакрывающихся сочлененных объектов", в трудах Международной конференции IEEE по компьютерному зрению, 1995, с. 612-617.

обзор литературы по отслеживанию рук во 2-й главе:

  • T. де Кампос, "3D визуальное отслеживание артикулированных объектов и рук", 2006.

к сожалению, я не знаю о какой-то свободно доступной библиотеке отслеживания рук.


существует простой способ обнаружения руки с помощью тона кожи. возможно, это поможет... вы можете увидеть результаты на этом 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 довольно полезен, вы можете найти центроид "blob" с помощью cv2.мгновения после u найти контуры. посмотрите документацию opencv на формы дескрипторы.

основная информация о подсыханием.

вот ссылка, которая реализует скелетизация в opencv и c++

вот ссылка на скелетонизация в opencv и питон

надеюсь, что помогает :)

--- редактировать ----

Я настоятельно рекомендую вам просмотреть эти документы Дэвы Раманана (прокрутите вниз после посещения связанной страницы):http://www.ics.uci.edu / ~драманан/

  1. С. Десаи, Д. Раманан. "Обнаружение действий, поз и объектов с помощью Реляционные Фразелеты " Европейская конференция по компьютерному зрению (ECCV), Florence, Italy, Oct. 2012.
  2. Д. Парк, Д. Раманан. Международная конференция "N-лучшие максимальные декодеры для моделей деталей" on Computer Vision (ICCV) Barcelona, Spain, November 2011.
  3. Д. Раманан. "Обучение разбору изображений артикулированных объектов" нейронная информация. Процесс. Systems (NIPS), Vancouver, Canada, Dec 2006.

наиболее распространенный подход можно увидеть в следующем видео youtube. http://www.youtube.com/watch?v=xML2S6bvMwI

этот метод не совсем надежен, так как он имеет тенденцию терпеть неудачу, если рука сильно повернута (например, если камера смотрит на сторону руки или на частично согнутую руку).

Если вы не возражаете, используя две камеры, вы можете посмотреть на работу Роберта Ванга. Его нынешняя компания (3GearSystems) использует эту технологию, дополнен kinect, чтобы обеспечить отслеживание. Его оригинальная статья использует две веб-камеры, но имеет гораздо худшее отслеживание.

Ван, Роберт, Сильвен Пэрис и Йован Попович. "6д руками: безмаркерной ручной отслеживания для системы автоматизированного проектирования."Материалы 24-го ежегодного симпозиума ACM по программному обеспечению и технологии пользовательского интерфейса. ACM, 2011.

другой вариант (опять же, если можно использовать "больше", чем одна веб-камера) - использовать ИК-излучатель. Ваша рука отражает ИК свет довольно хорошо, в то время как фон не делает. Добавив фильтр к веб-камере, который фильтрует нормальный свет (и удалив стандартный фильтр, который делает обратное), вы можете создать довольно эффективное отслеживание рук. Преимущество этого метода заключается в том, что сегментация руки от фона намного проще. В зависимости от расстояния и качества камеры вам понадобится больше ИК-светодиодов, чтобы отразить достаточный свет обратно в веб-камеру. Движение leap использует это технология для отслеживания пальцев и ладоней (она использует 2 ИК-камеры и 3 ИК-светодиода, чтобы также получить информацию о глубине).

все, что было сказано; Я думаю, что Kinect - ваш лучший вариант в этом. Да, вам не нужна глубина, но информация о глубине облегчает обнаружение руки (используя информацию о глубине для сегментации).


мое предложение, учитывая ваши ограничения, будет использовать что-то вроде этого: 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

помните: даже если вам не требуется информация о глубине для вашего использования, наличие этой информации делает его проще для библиотеки для идентификации силы.


наконец-то я нашел решение. Получается dlib проект с открытым исходным кодом имеет "предиктор формы", который, будучи должным образом обучен, делает именно то, что мне нужно: он угадывает (с довольно удовлетворительной точностью)"позу". "Поза "свободно определяется как" то, что вы тренируете его распознавать как позу", обучая его набору изображений, аннотированных формами, чтобы извлечь из них.

предиктором формы является описано здесь on dlib по сайт


Я не знаю о возможных существующих решений. Если под присмотром (или, Котор Semi-наблюдали) обучение-это возможность обучения деревьев решений, или нейронных сетей может уже хватит (Kinect использует случайные леса от того, что я слышал). Прежде чем идти по такому пути, сделайте все возможное, чтобы найти существующее решение. Получение машинного обучения занимает много времени и экспериментов.

OpenCV имеет компоненты машинного обучения, что вам нужно, это данные обучения.


с функции отслеживания движения из открытого источника проект Blender можно создать 3D-модель на основе 2D-кадров. Нет необходимости в kinect. Поскольку blender является открытым исходным кодом, вы можете использовать свои скрипты pyton вне рамок blender для своих собственных целей.


вы когда-нибудь слышали о Eyesweb

Я использовал его для одного из моих проектов, и я подумал, что это может быть полезно для того, что вы хотите достичь. Вот некоторые интересные публикации LNAI 3881-методы отслеживания пальцев с помощью EyesWeb и Powerpointing - HCI с помощью жестов

в основном рабочий процесс:

  1. вы создаете свой патч в EyesWeb
  2. подготовить данные, которые вы хотите отправить с сетевым клиентом
  3. используйте обработанные данные тезисов на своем собственном сервере (ваше приложение)

однако я не знаю, есть ли способ встроить часть обработки изображений в реальном времени Eyes Web в мягкую, как библиотека.