-
손가락 개수를 이용한 가위바위보 놀이영상처리(Opencv) 2022. 4. 16. 23:39
import cv2
import numpy as np
vid = cv2.VideoCapture("images/rock3.mp4")
while (True):
ret, frame = vid.read()
hsvimg = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
lower = np.array([0, 48, 80], dtype="uint8")
upper = np.array([20, 255, 255], dtype="uint8")
hsv = cv2.inRange(hsvimg, lower, upper) #손 색상영역에 따른 검출
blurred = cv2.blur(hsv, (2, 2)) #블러처리
ret, thresh = cv2.threshold(blurred, 0, 255, cv2.THRESH_BINARY) #이진화
# 컨투어 찾기
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = max(contours, key=lambda x: cv2.contourArea(x))
# 볼록 선체 찾고 그리기(좌표기준)
hull = cv2.convexHull(contours)
cv2.drawContours(frame, [hull], -1, (57,255,20), 1)
hull = cv2.convexHull(contours, returnPoints=False)#볼록 선체 찾기(인덱스 기준)
defects = cv2.convexityDefects(contours, hull) #볼록 선체 결함 찾기
if defects is not None:
cnt = 0 #개수 초기화
for i in range(defects.shape[0]): # 각도 계산하기
s, e, f, d = defects[i][0] #시작,종료,가장 먼 지점, 거리
start = tuple(contours[s][0]) #시작점 좌표 구하기
end = tuple(contours[e][0]) #끝지점 좌표 구하기
far = tuple(contours[f][0]) #가장 먼 지점 좌표 구하기
a = np.sqrt((end[0] - start[0]) ** 2 + (end[1] - start[1]) ** 2)
b = np.sqrt((far[0] - start[0]) ** 2 + (far[1] - start[1]) ** 2)
c = np.sqrt((end[0] - far[0]) ** 2 + (end[1] - far[1]) ** 2)
angle = np.arccos((b ** 2 + c ** 2 - a ** 2) / (2 * b * c)) # 코사인 정리
if angle <= np.pi / 2: # 90도 미만의 각도이면 손가락 인식하여 개수 추가
cnt += 1
cv2.circle(frame, far, 4, [255,255,0], -1) #가장 먼 지점 원표시
if cnt > 0: #개수에 따른 가위바위보 정하기
cnt = cnt + 1
if(cnt == 0):
rps = 'rock'
if(cnt == 2):
rps = 'scissors'
if(cnt == 5):
rps = 'paper'
#결과 문자로 출력
cv2.putText(frame, rps, (100, 80), cv2.FONT_HERSHEY_SIMPLEX, 2, (150,100,150), 1, cv2.LINE_AA)
cv2.imshow('result', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
vid.release()
cv2.destroyAllWindows()결과'영상처리(Opencv)' 카테고리의 다른 글
opencv 포토샵 도구 만들기 (0) 2022.04.16