如果您不担心手的速度或精确轮廓,下面是一个简单的解决方案。
方法是这样的:您获取每个轮廓并找到与其他轮廓的距离。如果距离小于50,则它们在附近,您将它们放在一起。如果不是,则将它们放在不同的位置。
因此,检查到每个轮廓的距离是一个耗时的过程。需要几秒钟。因此,您无法实时进行操作。
另外,为了连接轮廓,我将它们放在一个集合中,并为该集合绘制了一个凸包。因此,您得到的结果实际上是凸形的手壳,而不是真实的手。
以下是我在OpenCV-Python中的代码。我还没有进行任何优化,只是希望它能正常工作,仅此而已。如果它解决了您的问题,请进行优化。
import cv2
import numpy as np
def find_if_close(cnt1,cnt2):
row1,row2 = cnt1.shape[0],cnt2.shape[0]
for i in xrange(row1):
for j in xrange(row2):
dist = np.linalg.norm(cnt1[i]-cnt2[j])
if abs(dist) < 50 :
return True
elif i==row1-1 and j==row2-1:
return False
img = cv2.imread('dspcnt.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray,127,255,0)
contours,hier = cv2.findContours(thresh,cv2.RETR_EXTERNAL,2)
LENGTH = len(contours)
status = np.zeros((LENGTH,1))
for i,cnt1 in enumerate(contours):
x = i
if i != LENGTH-1:
for j,cnt2 in enumerate(contours[i+1:]):
x = x+1
dist = find_if_close(cnt1,cnt2)
if dist == True:
val = min(status[i],status[x])
status[x] = status[i] = val
else:
if status[x]==status[i]:
status[x] = i+1
unified = []
maximum = int(status.max())+1
for i in xrange(maximum):
pos = np.where(status==i)[0]
if pos.size != 0:
cont = np.vstack(contours[i] for i in pos)
hull = cv2.convexHull(cont)
unified.append(hull)
cv2.drawContours(img,unified,-1,(0,255,0),2)
cv2.drawContours(thresh,unified,-1,255,-1)
以下是我得到的结果: