6_oHji
6_oHji
ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค☺
GitHub   Gmail
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (62)
    • ๐Ÿ’ก DEEP DIVE (17)
      • PATTERN (17)
    • ๐Ÿ“ ๋„์ ๋„์  (4)
    • ๐ŸŒˆ EXPERIENCE (3)
    • ๐Ÿ’ป PROJECT (3)
    • ๐Ÿ“’ STUDY (34)
      • ALGORITHM (1)
      • JAVA (5)
      • FRONT-END (7)
      • BACK-END (10)
      • SPRING (7)
      • NETWORK (3)
      • CLOUD (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

๊ฐœ์ธ์ •๋ณด

  • ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ
  • ์Šคํ† ๋ฆฌ
  • ํฌ๋Ÿผ
  • ๋กœ๊ทธ์ธ
hELLO ยท Designed By ์ •์ƒ์šฐ.
6_oHji
6_oHji
๐Ÿ’ป PROJECT

์‚ฌ์šฉ์ž ์† ์ œ์Šค์ฒ˜ ์ธ์‹ ๊ธฐ๋ฐ˜ ํ‚ค์˜ค์Šคํฌ ์ œ์–ด ์‹œ์Šคํ…œ ์„ค๊ณ„ ๐Ÿ–

2022. 12. 20. 10:42

๐Ÿ”— ๊นƒํ—ˆ๋ธŒ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ๋งํฌ

https://github.com/jiholee0/2022-IDPCD

 

GitHub - jiholee0/2022-IDPCD: 2022๋…„ 2ํ•™๊ธฐ ๊ฐœ๋ณ„์—ฐ๊ตฌ(Independant Capstone Design)

2022๋…„ 2ํ•™๊ธฐ ๊ฐœ๋ณ„์—ฐ๊ตฌ(Independant Capstone Design). Contribute to jiholee0/2022-IDPCD development by creating an account on GitHub.

github.com

 

๐Ÿ’ก ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

์ •์ „์‹ ํ„ฐ์น˜ํŒจ๋“œ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ธฐ์กด์˜ ํ‚ค์˜ค์Šคํฌ๋Š” ์‹œ๋ ฅ ์ €ํ•˜์™€ ๊ฐ™์€ ์‹ ์ฒด์  ๋…ธํ™”, ๊ธฐ๊ณ„์— ๋Œ€ํ•œ ๋ถ€์ •์  ์ธ์‹ ๋“ฑ์œผ๋กœ ์ธํ•ด ๋…ธ์ธ์—๊ฒŒ ๋ถˆํŽธํ•จ์„ ์ดˆ๋ž˜ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์† ์ œ์Šค์ฒ˜๋กœ ํ‚ค์˜ค์Šคํฌ๋ฅผ ์ œ์–ดํ•จ์œผ๋กœ์จ ๋…ธ์ธ์ด๋‚˜ ์‹œ๊ฐ์žฅ์• ์ธ์„ ํฌํ•จํ•œ ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ํ‚ค์˜ค์Šคํฌ๋ฅผ ๋ถ€๋‹ด ์—†์ด ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•˜๊ณ ์ž ํ•˜์˜€๋‹ค. ํ‚ค์˜ค์Šคํฌ๋งˆ๋‹ค ์ฃผ๋ฌธ ์‹œ ํ•„์š”ํ•œ ๋™์ž‘์ด ์ฒœ์ฐจ๋งŒ๋ณ„์ด๋ฏ€๋กœ, ๋…ธ์ธ์—๊ฒŒ ์ ํ•ฉํ•œ ํ‚ค์˜ค์Šคํฌ ๋ชจ๋‹ˆํ„ฐ ํ™”๋ฉด์„ ๊ฐ€์ƒ์œผ๋กœ ๊ตฌ์„ฑํ•˜๊ณ , ๊ฐ ๋™์ž‘์„ ์ œ์Šค์ฒ˜์™€ ๋งค์นญํ•˜์˜€๋‹ค. ํ‚ค์˜ค์Šคํฌ ์ œ์–ด์˜ ๊ฒฝ์šฐ ์†Œ์ผ“ ํ†ต์‹ ๊ณผ openCV ์ด๋ฏธ์ง€ ์ถœ๋ ฅ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์ธ์‹ํ•œ ์ œ์Šค์ฒ˜์— ๋”ฐ๋ผ ์ด๋ฏธ์ง€(ํ‚ค์˜ค์Šคํฌ ํ™”๋ฉด)๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ํ™˜๊ฒฝ์„ ๊ฐ€์ƒ์œผ๋กœ ๊ตฌ์„ฑํ•˜์˜€๋‹ค.

 

 

๐Ÿ’ก ์‚ฌ์šฉ ๊ธฐ์ˆ 

Python, MediaPipe, OpenCV, K-NN ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

 

๐Ÿ’ก ์ฐธ๊ณ  ์˜คํ”ˆ์†Œ์Šค

https://github.com/kairess/Rock-Paper-Scissors-Machine

 

GitHub - kairess/Rock-Paper-Scissors-Machine: Rock Paper Scissors Machine using MediaPipe Hands model and KNN.

Rock Paper Scissors Machine using MediaPipe Hands model and KNN. - GitHub - kairess/Rock-Paper-Scissors-Machine: Rock Paper Scissors Machine using MediaPipe Hands model and KNN.

github.com

 

 

๐Ÿ’ก ๊ตฌํ˜„

1. ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋‹จ๊ณ„

import cv2
import mediapipe as mp
import numpy as np

max_num_hands = 1
gesture = {
    0:'zero', 1:'one', 2:'two', 3:'five', 4:'ok', 5:'good'
}

# MediaPipe hands model
mp_hands = mp.solutions.hands
mp_drawing = mp.solutions.drawing_utils
hands = mp_hands.Hands(
    max_num_hands=max_num_hands,
    min_detection_confidence=0.5,
    min_tracking_confidence=0.5)

# Gesture recognition data
file = np.genfromtxt('C:/Users/LJH/Desktop/2022-IDPCD/project/data/my_gesture_train.csv', delimiter=',')
print(file.shape)

cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

def click(event, x, y, flags, param):
    global data, file
    if event == cv2.EVENT_LBUTTONDOWN:
        file = np.vstack((file, data))
        print(file.shape)

cv2.namedWindow('Dataset')
cv2.setMouseCallback('Dataset', click)

while cap.isOpened():
    ret, img = cap.read()
    if not ret:
        continue

    img = cv2.flip(img, 1)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

    result = hands.process(img)

    img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)

    if result.multi_hand_landmarks is not None:
        for res in result.multi_hand_landmarks:
            joint = np.zeros((21, 3))
            for j, lm in enumerate(res.landmark):
                joint[j] = [lm.x, lm.y, lm.z]

            # Compute angles between joints
            v1 = joint[[0,1,2,3,0,5,6,7,0,9,10,11,0,13,14,15,0,17,18,19],:] # Parent joint
            v2 = joint[[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],:] # Child joint
            v = v2 - v1 # [20,3]
            # Normalize v
            v = v / np.linalg.norm(v, axis=1)[:, np.newaxis]

            # Get angle using arcos of dot product
            angle = np.arccos(np.einsum('nt,nt->n',
                v[[0,1,2,4,5,6,8,9,10,12,13,14,16,17,18],:],
                v[[1,2,3,5,6,7,9,10,11,13,14,15,17,18,19],:])) # [15,]

            angle = np.degrees(angle) # Convert radian to degree

            data = np.array([angle], dtype=np.float32)

            data = np.append(data, 5) # ์ˆ˜์ง‘ํ•  ์ œ์Šค์ฒ˜์˜ INDEX

            mp_drawing.draw_landmarks(img, res, mp_hands.HAND_CONNECTIONS)

    resize = cv2.resize(img, (200, 150), interpolation=cv2.INTER_CUBIC)
    cv2.imshow('Dataset', resize)
    if cv2.waitKey(1) == ord('q'):
        break

np.savetxt('C:/Users/LJH/Desktop/2022-IDPCD/project/data/my_gesture_train.csv', file, delimiter=',')

 

2. ์ œ์Šค์ฒ˜ ์ธ์‹ ๋‹จ๊ณ„

import cv2 # ์›น์บ  ์ œ์–ด ๋ฐ ML ์‚ฌ์šฉ
import mediapipe as mp # ์† ์ธ์‹์„ ํ•  ๊ฒƒ
import numpy as np
import time
from scipy import stats

def recog_gesture() -> str :
    result_list = []
    # ์ œ์Šค์ฒ˜ ์ธ์‹
    max_num_hands = 1 # ์†์€ ์ตœ๋Œ€ 1๊ฐœ๋งŒ ์ธ์‹
    kiosk_gesture = {
        0:'zero', 1:'one', 2:'two', 3:'five', 4:'ok', 5:'good'
    }

    # MediaPipe hands model
    mp_hands = mp.solutions.hands # ์›น์บ  ์˜์ƒ์—์„œ ์†๊ฐ€๋ฝ ๋งˆ๋””์™€ ํฌ์ธํŠธ๋ฅผ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ1
    mp_drawing = mp.solutions.drawing_utils # ์›น์บ  ์˜์ƒ์—์„œ ์†๊ฐ€๋ฝ ๋งˆ๋””์™€ ํฌ์ธํŠธ๋ฅผ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ2

    # ์†๊ฐ€๋ฝ detection ๋ชจ๋“ˆ์„ ์ดˆ๊ธฐํ™”
    hands = mp_hands.Hands(
        max_num_hands=max_num_hands, # ์ตœ๋Œ€ ๋ช‡ ๊ฐœ์˜ ์†์„ ์ธ์‹?
        min_detection_confidence=0.5, # 0.5๋กœ ํ•ด๋‘๋Š” ๊ฒŒ ์ข‹๋‹ค!
        min_tracking_confidence=0.5)

    # ์ œ์Šค์ฒ˜ ์ธ์‹ ๋ชจ๋ธ
    file = np.genfromtxt('C:/Users/LJH/Desktop/2022-IDPCD/project/data/my_gesture_train.csv', delimiter=',') # ๊ฐ ์ œ์Šค์ฒ˜๋“ค์˜ ๋ผ๋ฒจ๊ณผ ๊ฐ๋„๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ์Œ, ์ •ํ™•๋„๋ฅผ ๋†’์ด๊ณ  ์‹ถ์œผ๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ด๋ณด์ž!**
    angle = file[:,:-1].astype(np.float32) # ๊ฐ๋„
    label = file[:, -1].astype(np.float32) # ๋ผ๋ฒจ
    knn = cv2.ml.KNearest_create() # knn(k-์ตœ๊ทผ์ ‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜)์œผ๋กœ
    knn.train(angle, cv2.ml.ROW_SAMPLE, label) # ํ•™์Šต!

    cap = cv2.VideoCapture(1, cv2.CAP_DSHOW)

    if cap.isOpened():
        number = 0
        # target_tick = time.time() + 2

        # while time.time() < target_tick :
        while True :
            if number > 50 : break

            ret, img = cap.read()
            if not ret:
                continue
            img = cv2.flip(img, 1)
            img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

            result = hands.process(img)
            img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)

            # ๊ฐ๋„๋ฅผ ์ธ์‹ํ•˜๊ณ  ์ œ์Šค์ฒ˜๋ฅผ ์ธ์‹ํ•˜๋Š” ๋ถ€๋ถ„
            if result.multi_hand_landmarks is not None: # ๋งŒ์•ฝ ์†์„ ์ธ์‹ํ•˜๋ฉด
                number += 1
                for res in result.multi_hand_landmarks:
                    joint = np.zeros((21, 3)) # joint == ๋žœ๋“œ๋งˆํฌ์—์„œ ๋นจ๊ฐ„ ์ , joint๋Š” 21๊ฐœ๊ฐ€ ์žˆ๊ณ  x,y,z ์ขŒํ‘œ๋‹ˆ๊นŒ 21,3
                    for j, lm in enumerate(res.landmark):
                        joint[j] = [lm.x, lm.y, lm.z] # ๊ฐ joint๋งˆ๋‹ค x,y,z ์ขŒํ‘œ ์ €์žฅ

                    # Compute angles between joints joint๋งˆ๋‹ค ๊ฐ๋„ ๊ณ„์‚ฐ
                    # **๊ณต์‹๋ฌธ์„œ ๋“ค์–ด๊ฐ€๋ณด๋ฉด ๊ฐ joint ๋ฒˆํ˜ธ์˜ ์ธ๋ฑ์Šค๊ฐ€ ๋‚˜์˜ด**
                    v1 = joint[[0,1,2,3,0,5,6,7,0,9,10,11,0,13,14,15,0,17,18,19],:] # Parent joint
                    v2 = joint[[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],:] # Child joint
                    v = v2 - v1 # [20,3]๊ด€์ ˆ๋ฒกํ„ฐ
                    # Normalize v
                    v = v / np.linalg.norm(v, axis=1)[:, np.newaxis] # ๋ฒกํ„ฐ ์ •๊ทœํ™”(ํฌ๊ธฐ 1 ๋ฒกํ„ฐ) = v / ๋ฒกํ„ฐ์˜ ํฌ๊ธฐ

                    # Get angle using arcos of dot product **๋‚ด์  ํ›„ arcos์œผ๋กœ ๊ฐ๋„๋ฅผ ๊ตฌํ•ด์คŒ**
                    angle = np.arccos(np.einsum('nt,nt->n',
                        v[[0,1,2,4,5,6,8,9,10,12,13,14,16,17,18],:],
                        v[[1,2,3,5,6,7,9,10,11,13,14,15,17,18,19],:])) # [15,]

                    angle = np.degrees(angle) # Convert radian to degree

                    # Inference gesture ํ•™์Šต์‹œํ‚จ ์ œ์Šค์ฒ˜ ๋ชจ๋ธ์— ์ฐธ์กฐ๋ฅผ ํ•œ๋‹ค.
                    data = np.array([angle], dtype=np.float32)
                    ret, results, neighbours, dist = knn.findNearest(data, 3) # k๊ฐ€ 3์ผ ๋•Œ ๊ฐ’์„ ๊ตฌํ•œ๋‹ค!
                    idx = int(results[0][0]) # ์ธ๋ฑ์Šค๋ฅผ ์ €์žฅ!

                    # Draw gesture result
                    if idx in kiosk_gesture.keys():
                        cv2.putText(img, text=kiosk_gesture[idx].upper(), org=(int(res.landmark[0].x * img.shape[1]), int(res.landmark[0].y * img.shape[0] + 20)), fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=1, color=(255, 255, 255), thickness=2)
                        rst = kiosk_gesture[idx].upper()
                        result_list.append(rst)

                    # Other gestures ๋ชจ๋“  ์ œ์Šค์ฒ˜๋ฅผ ํ‘œ์‹œํ•œ๋‹ค๋ฉด
                    # cv2.putText(img, text=gesture[idx].upper(), org=(int(res.landmark[0].x * img.shape[1]), int(res.landmark[0].y * img.shape[0] + 20)), fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=1, color=(255, 255, 255), thickness=2)

                    mp_drawing.draw_landmarks(img, res, mp_hands.HAND_CONNECTIONS) # ์†์— ๋žœ๋“œ๋งˆํฌ๋ฅผ ๊ทธ๋ ค์คŒ

            resize = cv2.resize(img, (200, 150), interpolation=cv2.INTER_CUBIC)
            cv2.imshow('gesture', resize)
            if cv2.waitKey(1) == ord('q'):
                break
    # print('--------------\n total number : ', number)
    # print('result list : ', result_list, '\n')
    mode = stats.mode(result_list)[0]
    if len(mode) == 0 : return 'fail'
    else : return mode[0]

# print(recog_gesture())

 

3. ์†Œ์ผ“ ํ†ต์‹  ๋‹จ๊ณ„

- ์„œ๋ฒ„

# server
# ์—ญํ•  : client๋กœ๋ถ€ํ„ฐ ์ œ์Šค์ฒ˜ ์ธ์‹ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„ ํ‚ค์˜ค์Šคํฌ ํ™”๋ฉด์„ ์ œ์–ดํ•œ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ์ „์†กํ•œ๋‹ค.

import socket, threading
from flask import render_template
import json, datetime, cv2

orders = []
pickUpYn = False
cashYn = False
def ctrlKiosk(recvData) -> json :
    global orders
    global pickUpYn
    global cashYn
    global openImage
    curPageNum = int(recvData.get('curPageNum'))
    nextPageNum = curPageNum + 1
    result = recvData.get('result')
    src = ""

    if curPageNum == 0 : # ์ดˆ๊ธฐ ํ™”๋ฉด ๋„์šฐ๊ธฐ
        if result == 'SERVER' :
            src = "C:/Users/LJH/Desktop/2022-IDPCD/project/kiosk/image/001.png"
    elif curPageNum == 1 : # ์ดˆ๊ธฐ ํ™”๋ฉด
        if result == 'OK' : # ๋‹ค์Œ ํ™”๋ฉด์œผ๋กœ
            src = "C:/Users/LJH/Desktop/2022-IDPCD/project/kiosk/image/002.png"
    elif curPageNum == 2 : # ์ฃผ๋ฌธ ๋ฉ”๋‰ด์˜ ์ข…๋ฅ˜ ์„ ํƒ
        if result == 'ZERO' :
            src = "C:/Users/LJH/Desktop/2022-IDPCD/project/kiosk/image/003.png"
    elif curPageNum == 3 :
        if result == 'ZERO' :
            order = {
                'menu': '์น˜์ฆˆ๋ฒ„๊ฑฐ',
                'count' : 1,
                'price' : 3900
            }
            orders.append(order)
            src = "C:/Users/LJH/Desktop/2022-IDPCD/project/kiosk/image/004.png"
    elif curPageNum == 4 :
        if result == 'OK' :
            order = {
                'menu': '์ฝœ๋ผ, ๊ฐ์žํŠ€๊น€',
                'count' : 1,
                'price' : 2000
            }
            orders.append(order)
            src = "C:/Users/LJH/Desktop/2022-IDPCD/project/kiosk/image/005.png"
        elif result == 'FIVE' :
            src = "C:/Users/LJH/Desktop/2022-IDPCD/project/kiosk/image/005.png"
    elif curPageNum == 5 :
        if result == 'OK' :
            src = "C:/Users/LJH/Desktop/2022-IDPCD/project/kiosk/image/002.png"
            nextPageNum = 2
        elif result == 'FIVE' :
            src = "C:/Users/LJH/Desktop/2022-IDPCD/project/kiosk/image/006.png"
    elif curPageNum == 6 :
        if result == 'ONE' :
            src = "C:/Users/LJH/Desktop/2022-IDPCD/project/kiosk/image/007.png"
        elif result == 'TWO' :
            pickUpYn = True
            src = "C:/Users/LJH/Desktop/2022-IDPCD/project/kiosk/image/007.png"
    elif curPageNum == 7 :
        if result == 'ONE' :
            src = "C:/Users/LJH/Desktop/2022-IDPCD/project/kiosk/image/008.png"
        elif result == 'TWO' :
            cashYn = True
            src = "C:/Users/LJH/Desktop/2022-IDPCD/project/kiosk/image/008.png"
    elif curPageNum == 8 :
        if result == 'OK' :
            print('์ฃผ๋ฌธ ๋‚ด์—ญ :',orders)
            recvData.update(isComplete=True)

    image = cv2.imread(src, cv2.IMREAD_UNCHANGED)
    if image is None :
        print('Image load failed...Please gesture one more time.')
        recvData.update(result='FAIL')
    else :
        cv2.destroyAllWindows
        openImage = cv2.resize(image, dsize=(300,420), interpolation=cv2.INTER_AREA)
        recvData.update(curPageNum=int(nextPageNum))
        cv2.imshow("kiosk", openImage)
        cv2.waitKey(1)
    return recvData

def binder(client_socket, addr):
    # ์ปค๋„ฅ์…˜์ด ๋˜๋ฉด ์ ‘์† ์ฃผ์†Œ๊ฐ€ ๋‚˜์˜จ๋‹ค.
    print('Connected by', addr)
    try:
        initData = {
            'isComplete' : False,
            'curPageNum' : 0,
            'result' : 'SERVER'
        }
        ctrlKiosk(initData)
        while True :

            # ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ์ดํ„ฐ ๋ฐ›์Œ
            data = client_socket.recv(1024)
            recvData = json.loads(data)
            print('recvData : ',recvData, datetime.datetime.now())

            # ํ‚ค์˜ค์Šคํฌ ํ™”๋ฉด ์ œ์–ด
            servData = ctrlKiosk(recvData)

            # ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ์ดํ„ฐ ์ „์†ก
            sendData = json.dumps(servData)
            client_socket.send(bytes(sendData, 'utf-8'))

    except:
    # ์ ‘์† ํ•ด์ œ์‹œ except
        print("except : " , addr)
    finally:
    # ์ข…๋ฃŒ
        client_socket.close()


# ์†Œ์ผ“ ์ƒ์„ฑ
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# 10000๋ฒˆ ํฌํŠธ ์‚ฌ์šฉ
server_socket.bind(('127.0.0.1',10000))

server_socket.listen(1)

try:
    # ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ‘์†ํ•˜๊ธฐ ์ „๊นŒ์ง€ ์„œ๋ฒ„๋Š” ์‹คํ–‰๋˜์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌดํ•œ ๋ฃจํ”„ ์‚ฌ์šฉ
    while True:
        client_socket, addr = server_socket.accept()
    # ์“ฐ๋ ˆ๋“œ ์‚ฌ์šฉํ•ด์„œ ๋Œ€๊ธฐ
        th = threading.Thread(target=binder, args = (client_socket,addr))
        th.start()
except:
    print("server")
finally:
    # ์ข…๋ฃŒ
    server_socket.close()

- ํด๋ผ์ด์–ธํŠธ

# client
# ์—ญํ•  : server๋กœ๋ถ€ํ„ฐ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ์™€ ์ „ํ™˜ ์—ฌ๋ถ€๋ฅผ ๋ฐ›์•„ ์˜ฌ๋ฐ”๋ฅธ ์ œ์Šค์ฒ˜๋ฅผ ์ธ์‹ํ•œ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ์ „์†กํ•œ๋‹ค.

import socket, datetime, json

import sys
sys.path.append("/recog_gesture")
import recog_gesture as recog_gesture

HOST = '127.0.0.1' # local ํ˜ธ์ŠคํŠธ ์‚ฌ์šฉ
PORT = 10000 # 10000๋ฒˆ ํฌํŠธ ์‚ฌ์šฉ
# ์†Œ์ผ“ ์ƒ์„ฑ
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# ์ ‘์†
client_socket.connect((HOST, PORT))

cliData = {
    'isComplete' : False,
    'curPageNum' : 1,
    'result' : ''
}
while cliData.get('isComplete') == False :
    # ์ œ์Šค์ฒ˜ ์ธ์‹ ๊ฒฐ๊ณผ ๊ฐ€์ ธ์˜ค๊ธฐ
    result = recog_gesture.recog_gesture()

    # ๋ฐ์ดํ„ฐ ์„œ๋ฒ„์— ์ „์†ก
    cliData.update(result=result)
    sendData = json.dumps(cliData)
    client_socket.send(bytes(sendData, 'utf-8'))

    # ์„œ๋ฒ„์—๊ฒŒ ๋ฐ์ดํ„ฐ ๋ฐ›์Œ
    data = client_socket.recv(1024)
    print(data)
    recvData = json.loads(data)
    print('recvData : ',recvData, datetime.datetime.now())
    cliData.update( isComplete=bool(recvData.get('isComplete')), curPageNum=int(recvData.get('curPageNum')))


client_socket.close()

 

 

๋ฐ˜์‘ํ˜•
์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋™์ผ์กฐ๊ฑด (์ƒˆ์ฐฝ์—ด๋ฆผ)
    '๐Ÿ’ป PROJECT' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • SpringBoot ํ”„๋กœ์ ํŠธ๋ฅผ Docker๋กœ EC2์— ๋ฐฐํฌํ•˜๊ธฐ
    • MediaPipe๋ฅผ ์ด์šฉํ•ด ์† ์ธ์‹ํ•˜๊ธฐ ๐Ÿ–
    6_oHji
    6_oHji
    ๋„์ ๋„์ 

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”