Подтвердить что ты не робот

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

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

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

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

До сих пор я смотрел:

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

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

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

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

UPDATE

Спустя 2 года было найдено решение: http://dlib.net/imaging.html#shape_predictor

4b9b3361

Ответ 1

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

Прогнозирование формы описано здесь на dlib website

Ответ 2

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

  • M. de La Gorce, D. J. Fleet и N. Paragios, "Оценка 3D-позиционной оценки 3D-модели из монокулярного видео". "IEEE-транзакции по анализу рисунка и машинного интеллекта", том. 33, февраль 2011 г.
  • R. Wang and J. Popović, "Ручное отслеживание в реальном времени с цветной перчаткой", ACM Transactions on Graphics (TOG), 2009.
  • В. Stenger, A. Thayananthan, P. H. S. Torr и R. Cipolla, "Моделирование на основе модели с использованием иерархического байесовского фильтра". "IEEE-транзакции по анализу моделей и машинным интеллектам, том. 28, вып. 9, стр. 1372-84, сентябрь 2006 г.
  • J. М. Рех и Т. Канадэ, "Моделирование отслеживания самозакрывающихся артикулированных объектов", в "Трудах Международной конференции IEEE по компьютерному видению", 1995, стр. 612-617.

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

  • Т. de Campos, "3D визуальное отслеживание артикулированных объектов и рук", 2006 г.

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

Ответ 3

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

вот код:

''' 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.moments после того, как u найдет контуры. посмотрите документацию opencv на дескрипторы формы.

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

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

здесь ссылка на скелетонирование в opencv и python

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

--- EDIT ----

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

  • С. Десаи, Д. Раманан. "Обнаружение действий, позы и объектов с помощью Relational Phraselets "Европейская конференция по компьютерному видению (ECCV), Флоренция, Италия, октябрь 2012 года.
  • D. Парк, Д. Раманан. Международная конференция "Наилучшие максимальные декодеры для моделей деталей" на Computer Vision (ICCV), Барселона, Испания, ноябрь 2011 года.
  • D. Раманана. "Изучение анализа изображений сочлененных объектов" Neural Info. Proc. Systems (NIPS), Ванкувер, Канада, декабрь 2006 г.

Ответ 4

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

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

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

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

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

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

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

  • Вы создаете свой патч в EyesWeb
  • Подготовьте данные, которые вы хотите отправить с помощью сетевого клиента
  • Используйте обработанные данные тезисов на вашем собственном сервере (ваше приложение)

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