Я работаю над проектом по обнаружению рук. Для этого есть много хороших проектов в сети, но мне нужно специальное определение позы рук. Нужна полностью открытая ладонь и вся ладонь наружу, как на изображении ниже:
Первая рука обращена внутрь, поэтому она не будет обнаружена, а правая обращена наружу, она будет обнаружена. Теперь я могу обнаружить руку с помощью OpenCV. но как сказать ориентацию руки?
Этот вопрос как бы не по теме. Я бы порекомендовал вам, если вы не возражаете, поделиться кодом, который у вас есть до сих пор, показывая, что вы не просто просите нас реализовать что-то для вас.
Посмотрите, что сделала чехарда с Oculus rift. Я не уверен, что они используют внутри для сегментации поз рук, но есть другая бумага, которая эффективно воспроизводит позы рук. Если у вас есть установка стереокамеры, вы можете использовать методы из этой статьи: https://arxiv.org/pdf/1610.07214.pdf.
Единственные многообещающие решения, которые я видел для монокамеры, тренируются на больших наборах данных.
хорошо, если вы пойдете по пути МакГайвера, вы можете заметить, что кости левой руки торчат в определенном направлении, в то время как на правой руке есть все линии пальцев и несколько линий на ладонях.
Эти линии всегда одинаковы, поэтому вы можете попытаться обнаружить их с помощью обнаружения краев opencv или линий hough. Из-за темного цвета линий, возможно, вы даже сможете выделить их порогом. Затем соберите информацию из этих линий, например углы, регрессии, посмотрите, какие функции вы можете собрать, и обучите простое дерево решений.
Это предполагало, что у вас недостаточно данных, если у вас есть, то вы переходите к глубокому обучению, просто берете базовую модель InceptionV3 и переобучаете последний плотный слой, чтобы классифицировать два класса с помощью softmax или предсказать вероятность, если рука будет вверх /вниз по сигмовидной. Проверьте эта ссылка, Tensorflow вернулся к обучению этого, чистого уже готового кода для выполнения.
Вопросы? Спрашивай
Задача сопоставления с передом относится к классификации текстур, это классическая задача распознавания образов. Я предлагаю вам попробовать один из следующих способов:
Текстура Haralick: я читал, что она отлично работает, когда набор функций дает количественную оценку всего изображения (глобальные дескрипторы функций). это не реализовано в opencv, но его легко реализовать, проверьте этот полезный учебник
Модели обучения: я уже предложил классификатор SVM в сочетании с некоторым дескриптором, который может отлично работать. В Opencv есть интересный класс FaceRecognizer для распознавания лиц, может быть интересной идеей использовать его, заменяя изображения лица изображениями ладони (измените размер и поверните, чтобы получить уникальную позу ладони), этот класс имеет три метода, которые можно использовать , один из них — Local Binary Patterns Histograms, рекомендуемый для распознавания текстур. а почему бы не попробовать другие модели (Eigenfaces и Fisherfaces), проверьте это руководство
использовать классификатор Haar-Cascade, вы можете получить файл модели классификатора, а затем использовать его здесь. Просто найдите «Обнаружение Palm Haarcascade в Google» или используйте приведенный ниже код.
import cv2
cam=cv2.VideoCapture(0)
ccfr2=cv2.CascadeClassifier('haar-cascade-files-master/palm.xml')
while True:
retval,image=cam.read()
grey=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
palm=ccfr2.detectMultiScale(grey,scaleFactor=1.05,minNeighbors=3)
for x,y,w,h in palm:
image=cv2.rectangle(image,(x,y),(x+w,y+h),(256,256,256),2)
cv2.imshow("Window",image)
if cv2.waitKey(1) & 0xFF==ord('q'):
cv2.destroyAllWindows()
break
del(cam)
Удачи вам в использовании HaarCascade.
Я бы порекомендовал обучить модель (возможно, нейронную сеть со сверточными слоями), и это означало бы, что вам сначала нужно иметь «достаточно большой и правильный» набор данных, вам нужно будет решить, как определить «правильный» и насколько большой достаточно .