손의 속도 또는 정확한 윤곽에 대해 걱정하지 않는 경우 다음은 간단한 해결책입니다.
방법은 다음과 같습니다. 각 형상을 취하고 다른 형상까지의 거리를 찾습니다. 거리가 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)
내가 얻은 결과는 다음과 같습니다.