import cv2
import mediapipe as mp
import time
cap = cv2.VideoCapture(0)
mp_drawing = mp.solutions.drawing_utils # ์ ์์ ๊ทธ๋ฆผ์ ๊ทธ๋ฆด ์ ์๋ ๋ฉ์๋
mp_hands = mp.solutions.hands # MediaPipe solution์์ ์ ๊ณตํ๋ ์ ๋ชจ๋ธ
hands = mp_hands.Hands(
max_num_hands = 1, # ์ธ์ํ ์๋ชจ์์ ๊ฐฏ์, ์๋ตํ๋ฉด 2๊ฐ ์ง์ ๋๋ค.
min_detection_confidence = 0.5, # ์ฑ๊ณต์ ์ธ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋ ์ต์ ์ ๋ขฐ๋ ๊ฐ. 0.0 ~1.0์ฌ์ด๋ก์ ๊ธฐ๋ณธ๊ฐ์ 0.5์ด๋ค.
min_tracking_confidence = 0.5) # ์ ๋๋๋งํฌ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ถ์ ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋ ์ต์ ์ ๋ขฐ๋ ๊ฐ. 0.0 ~1.0 ์ฌ์ด๋ก์ ๊ธฐ๋ณธ๊ฐ์ 0.5์ด๋ค. ์ด ๊ฐ์ ๋์ด๋ฉด ์๊ฐ์ด ๋ ์์๋์ง๋ง ์ข ๋ ์ ํํ ์๋์ด ๋ณด์ฅ๋๋ค.
while True:
success, img = cap.read()
if not success:
continue
# OpenCV ์์์ BGR ํ์์ธ๋ฐ MediaPipe์์๋ RGB ํ์์ ์ฌ์ฉํ๋ฏ๋ก ์์ํ์์ ๋ณํํด ์ค๋ค.
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# MediaPipe์ hands ๋ชจ๋์ ์ด์ฉํด์ ์๋์์ ์ธ์ํ๋ค. ์๋์ ์ธ์ AI๋ชจ๋ธ์ด ์๋๋๊ณ ๊ฒฐ๊ณผ ๊ฐ์ด result๋ก ์ ์ฅ๋๋ค.
results = hands.process(imgRGB)
# MediaPipe์ฉ RGB ํ์์ผ๋ก ๋ณํํ๋ ๊ฒ์ OpenCV ์์์ฒ๋ฆฌ๋ฅผ ์ํด ๋ค์ BGRํ์์ผ๋ก ๋๋๋ฆฐ๋ค.
imgRGB = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
# result๊ฐ์ด ์ ์์ธ ๊ฒฝ์ฐ์๋ง ํ์ ์์
์ฒ๋ฆฌํ๋ค.
if results.multi_hand_landmarks:
# ์ค์ ์์ด ์ธ์๋ ๋ ์ (๋๋๋งํฌ)์ ์ฐ๋๋ค.
for handLms in results.multi_hand_landmarks:
# results๋ก ๋ฐํ๋ landmark ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ค. ์ธ์๋ ์๊ฐ๋ฝ ๋ชจ์์ index๊ฐ์ ๊ฐ์ง๋ ๋ฐฐ์ด๋ก ์ ๊ณต๋๋ค.
for id, lm in enumerate(handLms.landmark):
h, w, c = img.shape
cx, cy = int(lm.x*w), int(lm.y*h)
print(id, " :" , cx, cy)
if id == 0:
cv2.circle(img, (cx,cy), 20, (255,0,0), cv2.FILLED)
# MediaPipe์ ๋ด์ฅ๋ ์ ํธ๋ฆฌํฐ ๊ธฐ๋ฅ์ ์ด์ฉํด์ ๊ตฌํด์ง ์๊ฐ๋ฝ ๋ชจ์์ ์๋ก ์ฐ๊ฒฐํ ๊ทธ๋ฆผ์ ๊ทธ๋ ค์ค๋ค.
mp_drawing.draw_landmarks(img, handLms, mp_hands.HAND_CONNECTIONS)
cv2.imshow("Gotcha", img)
cv2.waitKey(1)
์์ ์ฝ๋๋ฅผ ์คํ์ํจ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
๋ฐ์ํ