From e5bd88afd65ac67bcaf57675de3fd964c08a486d Mon Sep 17 00:00:00 2001
From: Starboy <46487497+SumSumCorn@users.noreply.github.com>
Date: Sun, 10 Sep 2023 12:33:54 +0900
Subject: [PATCH 1/2] Create readme.txt

---
 project/readme.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 project/readme.txt

diff --git a/project/readme.txt b/project/readme.txt
new file mode 100644
index 0000000..6e4f73a
--- /dev/null
+++ b/project/readme.txt
@@ -0,0 +1 @@
+여기에 프로젝트

From 997d5f5ecc1408cf1464a1309edd825ab5109af0 Mon Sep 17 00:00:00 2001
From: Starboy <46487497+SumSumCorn@users.noreply.github.com>
Date: Sun, 10 Sep 2023 12:34:11 +0900
Subject: [PATCH 2/2] Add files via upload

---
 project/FingerCounting.py     | 58 ++++++++++++++++++++++++++++
 project/HandTrackingModule.py | 73 +++++++++++++++++++++++++++++++++++
 project/handTracking.py       | 21 ++++++++++
 project/poseTracking.py       | 34 ++++++++++++++++
 4 files changed, 186 insertions(+)
 create mode 100644 project/FingerCounting.py
 create mode 100644 project/HandTrackingModule.py
 create mode 100644 project/handTracking.py
 create mode 100644 project/poseTracking.py

diff --git a/project/FingerCounting.py b/project/FingerCounting.py
new file mode 100644
index 0000000..703edad
--- /dev/null
+++ b/project/FingerCounting.py
@@ -0,0 +1,58 @@
+# Mediapipe의 Hand모듈을 통해 손가락 숫자를 인식해 보자. 
+# 앞서 작성한 HandTrackingModule.py를 import하여 사용
+# 반드시 손을 세워서 영상을 획득해야 함
+
+import cv2
+import time
+import os
+import HandTrackingModule as htm
+
+wCam, hCam = 640, 480  # 웹캠 영상의 폭과 높이 픽셀수
+cap = cv2.VideoCapture(0)         ###### 영상 획득 기본 코드 ###### 0:첫번째 캠
+cap.set(3, wCam)
+cap.set(4, hCam)
+
+pTime = 0
+
+detector = htm.handDetector(detectionCon=0.75)
+
+tipIDs = [4, 8, 12, 16, 20]
+
+while True:
+    success, img = cap.read()       ###### 영상 획득 기본 코드 ######
+    img = detector.findHands(img)
+    lmList = detector.findPosition(img, draw=False)
+    
+    if len(lmList) != 0:
+        fingers = []
+        
+        # Thumb (엄지): 오른손일 경우는 if문의 부등호를 반대로 할 것 
+        if lmList[tipIDs[0]][1] > lmList[tipIDs[0]-1][1]: 
+            fingers.append(1)              # 엄지가 펴지면 1
+        else:                                             
+            fingers.append(0)              # 엄지가 접히면 0
+
+        # 4 Fingers (검지, 중지, 약지, 소지)
+        for id in range(1, 5):    # index, middle, ring, pinky
+            if lmList[tipIDs[id]][2] < lmList[tipIDs[id]-2][2]:
+                # print("Finger Opened")  # 손가락이 펴지면
+                fingers.append(1)
+            else:   # If finger is Closed # 손가락이 접히면
+                fingers.append(0)
+
+        # 엄지부터 소지까지, 펴지면 1, 접히면 0으로 표시
+        totalFingers = fingers.count(1)  # 펼쳐진 손가락의 갯수
+
+        cv2.rectangle(img, (20,225), (170,425), (0,255,0), cv2.FILLED) # 사각형안에 숫자 표시
+        cv2.putText(img, str(totalFingers), (45,375), cv2.FONT_HERSHEY_PLAIN, 10, (255,0,0), 25)
+
+    cTime = time.time()             # 현재 시간
+    if cTime != pTime:
+        fps = 1 / (cTime - pTime)       # fps 계산
+        pTime = cTime                   # 현재시간을 전시간으로 세팅
+
+    cv2.putText(img, f'FPS:{int(fps)}', (400,70), cv2.FONT_HERSHEY_PLAIN, 3, (255,0,0), 3)
+
+    cv2.imshow("Image", img)        ###### 영상 획득 기본 코드 ######
+    if cv2.waitKey(1) & 0xFF ==ord('q'):     # 키보드의 q 키가 입력되면 정지
+        break
\ No newline at end of file
diff --git a/project/HandTrackingModule.py b/project/HandTrackingModule.py
new file mode 100644
index 0000000..776c182
--- /dev/null
+++ b/project/HandTrackingModule.py
@@ -0,0 +1,73 @@
+# Mediapipe에서 제공하는 Hands함수를 통해 손의 21개 랜드마크를 획득
+# HandTracking_LandMarkPosition.py를 개조하여 사용하기 쉽도록 모듈화하였음
+# 랜드마크에 대해서는 Hand_Landmarks.png 참조
+
+import cv2
+import mediapipe as mp          # 손과 랜드마크 인식용
+import time                     # 영상 프레임 속도 (FPS) 체크용
+
+class handDetector():    # Hands클래스의 Property 참조할 것
+    def __init__(self, mode=False, maxHands=2, detectionCon=0.5, trackCon=0.5):
+        self.mode = mode
+        self.maxHands = maxHands
+        self.detectionCon = detectionCon
+        self.trackCon = trackCon
+
+        self.mpHand = mp.solutions.hands          # Mediapipe를 통한 손 검출
+        self.hands = self.mpHand.Hands(self.mode,self.maxHands,self.detectionCon,self.trackCon)
+        self.mpDraw = mp.solutions.drawing_utils  # 영상위에 그림을 그려주기 위한 모듈
+
+    def findHands(self, img, draw=True):
+        imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # BGR을 RGB로 변환
+        self.results = self.hands.process(imgRGB)  # RGB영상으로 바꾸고 hands모듈 수행
+
+        if self.results.multi_hand_landmarks:    # 두개의 손의 랜드마크가 잡힌다면
+            for handLms in self.results.multi_hand_landmarks:  # 랜드마크와 연결선을 표시
+                if draw:
+                    self.mpDraw.draw_landmarks(img, handLms, self.mpHand.HAND_CONNECTIONS)
+        return img
+
+    def findPosition(self, img, handNo=0, draw=True):
+
+        lmList = []
+        if self.results.multi_hand_landmarks:
+            myHand = self.results.multi_hand_landmarks[handNo]
+            for id, lm in enumerate(myHand.landmark):
+                h, w, c = img.shape  # 전체 영상 이미지의 높이, 폭, 채널 획득
+                cx, cy = int(lm.x*w), int(lm.y*h) # 영상에서 랜드마크의 위치점 획득
+                # print(id, cx, cy)  # 랜드마크 번호, x위치, y위치 표시      
+                lmList.append([id, cx, cy])     
+                if draw:       
+                # if id == 0:  # id 0번(손목)의 위치에 핑크색 원을 표시
+                    cv2.circle(img, (cx,cy), 15, (255,0,255), cv2.FILLED)
+
+        return lmList
+
+def main():
+    pTime = 0
+    cTime = 0
+    cap = cv2.VideoCapture(0)       ###### 영상 획득 기본 코드 ###### 0:첫번째 캠
+
+    detector = handDetector()  # handDetector class의 instance 생성
+    while True:
+        success, img = cap.read()   ###### 영상 획득 기본 코드 ######    
+        img = detector.findHands(img)
+        # img = detector.findHands(img, draw=False)  # 랜드마크 기본 마킹이 사라짐
+        lmList = detector.findPosition(img)
+        # lmList = detector.findPosition(img, draw=False) # 랜드마크 추가 마킹이 사라짐
+        if len(lmList) != 0:
+            print(lmList[4])    # 엄지 끝점(랜드마크 4번) 위치 표시 
+
+        cTime = time.time()     # time함수를 써서 현재시간 체크
+        while cTime != pTime:
+            fps = 1/(cTime-pTime)   # 현재 프레임과 전 프레임의 시간간격으로 fps계산 
+            pTime = cTime           # 현재시간을 전시간으로 설정
+
+        cv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 255), 3)
+
+        cv2.imshow("Image", img)    ###### 영상 획득 기본 코드 ######
+        if cv2.waitKey(1) & 0xFF ==ord('q'):     # 키보드의 q 키가 입력되면 정지
+            break
+
+if __name__ == "__main__":
+    main()
\ No newline at end of file
diff --git a/project/handTracking.py b/project/handTracking.py
new file mode 100644
index 0000000..d0c3e83
--- /dev/null
+++ b/project/handTracking.py
@@ -0,0 +1,21 @@
+import cv2
+import mediapipe as mp # 손과 손가락 마디를 인식하기 위한 라이브러리
+
+cap = cv2.VideoCapture(0) # 카메라를 통해 영상을 불러옵니다
+mpHands = mp.solutions.hands # Mediapipe를 통한 손 검출
+hands = mpHands.Hands() # Hands()함수 안의 내용을 가져옵니다
+mpDraw = mp.solutions.drawing_utils # 영상위에 그림을 그리기 위한 모듈입니다
+
+while True:
+    success, img = cap.read() # 영상을 img에 저장합니다
+    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 영상을 RGB로 변환합니다
+    results = hands.process(imgRGB) # RGB영상으로 hand모듈을 실행합니다
+
+    if results.multi_hand_landmarks: # 손이 인식되면 실행합니다
+        for handLMS in results.multi_hand_landmarks: # 마디와 선을 연결합니다
+            mpDraw.draw_landmarks(img, handLMS, mpHands.HAND_CONNECTIONS)
+            #각 손가락 마디를 표시하고 선을 연결합니다
+
+        cv2.imshow("IMAGE", img) # 영상을 보여줍니다
+    if cv2.waitKey(1) & 0xFF == ord('q'):
+        break # "q" 키가 눌리면 종료합니다
\ No newline at end of file
diff --git a/project/poseTracking.py b/project/poseTracking.py
new file mode 100644
index 0000000..cae317f
--- /dev/null
+++ b/project/poseTracking.py
@@ -0,0 +1,34 @@
+# Mediapipe를 통해 몸의 포즈를 잡아내는 기본 프로그램
+# https://www.youtube.com/watch?v=CvuwMqhFtbc 댄스영상으로 테스트 
+
+import cv2
+import mediapipe as mp   # py -m pip install mediapipe
+import time
+
+mpDraw = mp.solutions.drawing_utils  # 랜드마크와 연결선 그리기
+mpPose = mp.solutions.pose           # 포즈 잡아내기 클래스
+pose = mpPose.Pose()                 # 포즈를 잡아내기 위한 함수
+
+cap = cv2.VideoCapture(0)           ###### 영상 획득 기본 코드 ######
+
+pTime =0
+
+while True:
+    success, img = cap.read()       ###### 영상 획득 기본 코드 ######
+    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # BGR을 RGB로 변환
+    results = pose.process(imgRGB)  # RGB이미지로 포즈를 잡아냄
+    # print(results.pose_landmarks)
+    if results.pose_landmarks:  # 포즈 랜드마크가 잡히면 랜드마크와 연결선 표시
+        mpDraw.draw_landmarks(img, results.pose_landmarks,
+                                mpPose.POSE_CONNECTIONS)
+    
+    # 아래쪽 4줄은 FPS연산 및 표시를 위한 코드
+    cTime = time.time()
+    fps = 1 / (cTime-pTime)
+    pTime = cTime
+    cv2.putText(img, str(int(fps)), (70,50), cv2.FONT_HERSHEY_PLAIN,
+                                                     3, (255,0,0), 3)
+
+    cv2.imshow("Image", img)        ###### 영상 획득 기본 코드 ######
+    if cv2.waitKey(1) & 0xFF ==ord('q'): # 키보드의 q 키가 입력되면 정지
+        break
\ No newline at end of file
