给定一张手的照片,我正在尝试确定最合适的方法来定位连接手指的手掌的位置。 (即,手掌上距手掌中心最远的位置,基本上在手指之间)。
我一直在思考一些可能的编码方式,特别是主动形状建模。但是,主动形状建模似乎是过大的,因为我所需要的只是找到这些关键点,而不是跟踪它们的运动。我想知道是否有人熟悉特征识别可以建议一种更合适的技术。谢谢。
最佳答案
这是一些使用pymorph和mahotas的python示例代码。用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)