ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 손가락 개수를 이용한 가위바위보 놀이
    영상처리(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
Designed by Tistory.