Ручная идентификация - PullRequest
       19

Ручная идентификация

4 голосов
/ 03 июня 2011

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

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

1 Ответ

5 голосов
/ 03 июня 2011

Вот пример кода на python с использованием pymorph и mahotas.Воссоздание с opencv должно быть довольно тривиальным.Если возможно, я бы выбрал другой фон, что-то дальше от тона кожи упростило бы начальный порог.

import pymorph as m
import mahotas

def hsv_from_rgb(image):
    image = image/255.0 
    r, g, b = image[:,:,0], image[:,:,1], image[:,:,2]
    m, M = numpy.min(image[:,:,:3], 2), numpy.max(image[:,:,:3], 2)
    d = M - m

    # Chroma and Value
    c = d
    v = M

    # Hue
    h = numpy.select([c ==0, r == M, g == M, b == M], [0, ((g - b) / c) % 6, (2 + ((b - r) / c)), (4 + ((r - g) / c))], default=0) * 60

    # Saturation
    s = numpy.select([c == 0, c != 0], [0, c/v])

    return h, s, v

image = mahotas.imread('hand.jpg')

#downsample for speed
image = image[::10, ::10, :]

h, s, v = hsv_from_rgb(image)

# binary image from hue threshold
b1 = h<35

# close small holes
b2 = m.closerec(b1, m.sedisk(5))

# remove small speckle
b3 = m.openrec(b2, m.sedisk(5))

# locate space between fingers
b4 = m.closeth(b3, m.sedisk(10))

# remove speckle, artifacts from image frame
b5 = m.edgeoff(m.open(b4))

# find intersection of hand outline with 'web' between fingers
b6 = m.gradm(b3)*b5

# reduce intersection curves to single point (assuming roughly symmetric, this is near the center)
b7 = m.thin(m.dilate(b6),m.endpoints('homotopic'))

# overlay marker points on binary image
out = m.overlay(b3, m.dilate(b7, m.sedisk(3)))

mahotas.imsave('output.jpg', out)

enter image description here

...