조잡하지만 색깔로 피부색을 인식시켰다. 이 인식시킨 손바닥으로 가상 키보드를 입력받아야 한다.
아, 그리고 저번 코드와 많이 바뀐점도 있다.
1. 면적 하나로 키보드를 입력받아야 하므로 가장 큰 면적만 남겨둔다.
if len(line):
cnt=None
max_area = 0
max_cnt = 0
for it in line:
M = cv2.moments(it)
if max_area < M['m00']:
max_area = M['m00']
max_cnt = it
(에디터가 바뀐 이후로 배경색과 색을 그대로 가져오질 못해 아쉽다)
2. 가상 키보드를 생성한다. 엄청 조잡한 키보드 출력문이다. 좌표를 잘 이용해서 네모를 수십개 출력시키고 숫자도 11개 출력시켜야 한다.
(grabbed, frame) = camera.read()
(grabbed, frame2) = camera.read()
cv2.rectangle(frame2,(20,20),(350,450),(255,0,0),3)
cv2.rectangle(frame2,(20,20),(240,343),(255,0,0),3)
cv2.rectangle(frame2,(20,20),(130,236),(255,0,0),3)
cv2.rectangle(frame2,(20,20),(350,127),(255,0,0),3)
cv2.rectangle(frame2,(130,236),(350,450),(255,0,0),3)
cv2.rectangle(frame2,(240,343),(350,450),(255,0,0),3)
cv2.putText(frame2, '1', (65,73), font, fontScale, blue, 2)
cv2.putText(frame2, '2', (175,73), font, fontScale, blue, 2)
cv2.putText(frame2, '3', (285,73), font, fontScale, blue, 2)
cv2.putText(frame2, '4', (65,180), font, fontScale, blue, 2)
cv2.putText(frame2, '5', (175,180), font, fontScale, blue, 2)
cv2.putText(frame2, '6', (285,180), font, fontScale, blue, 2)
cv2.putText(frame2, '7', (65,287), font, fontScale, blue, 2)
cv2.putText(frame2, '8', (175,287), font, fontScale, blue, 2)
cv2.putText(frame2, '9', (285,287), font, fontScale, blue, 2)
cv2.putText(frame2, 'open', (35,394), font, 1.0, blue, 2)
cv2.putText(frame2, '0', (175,394), font, fontScale, blue, 2)
cv2.putText(frame2, 'close', (245,394), font, 1.0, blue, 2)
엄청난 노가다성 코드...
3. 키보드의 좌표를 입력해둔 후 해당 좌표에 손가락이 위치해 있다면 그 숫자를 입력하는 것으로 간주한다.
키보드 판이 많이 작기 때문에 특정 시간 동안 가만히 머물러 있을 경우 입력하는 것으로 설정해준다.
y_index = [20,127,236,343,450]
x_index = [20,130,240,350]
key_pad = [ [1,2,3],
[4,5,6],
[7,8,9],
['open',0,'close']]
for y in range(4):
for x in range(3):
if x_index[x]<=(minpoint[0]) and minpoint[0]<=x_index[x+1] and y_index[y]<=minpoint[1] and minpoint[1]<=y_index[y+1]:
cv2.putText(frame2, str(key_pad[y][x]), (455,73), font, fontScale, blue, 2)
if prev == key_pad[y][x]:
accumulate += 1
else:
accumulate = 0
if flag is False:
prev = key_pad[y][x]
if flag is False:
ratio = int(accumulate/0.3)
cv2.putText(frame2, "ing.. . "+str(ratio)+"%", (455,223), font, fontScale, blue, 2)
if ratio>=100 :
cv2.putText(frame2, str(prev)+" selected!", (425,373), font, fontScale, blue, 2)
입력후 실행시키면 가상 키보드가 화면에 뜨고 손바닥을 계속 찾는 contour 가 보일 것이다.
'OpenCv > 손가락 모션 인식' 카테고리의 다른 글
OpenCV python/ hsv 를 이용한 Skin 탐지 (2) | 2019.01.19 |
---|---|
OpenCv python 도전기 (0) | 2019.01.19 |