import cv2
import mediapipe as mp
# Inisialisasi MediaPipe Hands
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(static_image_mode=False, max_num_hands=2, min_detection_confidence=0.7)
mp_drawing = mp.solutions.drawing_utils
# Fungsi untuk mendeteksi jari yang terangkat
def fingers_up(hand_landmarks):
tips_ids = [
mp_hands.HandLandmark.THUMB_TIP,
mp_hands.HandLandmark.INDEX_FINGER_TIP,
mp_hands.HandLandmark.MIDDLE_FINGER_TIP,
mp_hands.HandLandmark.RING_FINGER_TIP,
mp_hands.HandLandmark.PINKY_TIP
]
pip_ids = [
mp_hands.HandLandmark.THUMB_IP,
mp_hands.HandLandmark.INDEX_FINGER_PIP,
mp_hands.HandLandmark.MIDDLE_FINGER_PIP,
mp_hands.HandLandmark.RING_FINGER_PIP,
mp_hands.HandLandmark.PINKY_PIP
]
fingers = []
for tip, pip in zip(tips_ids, pip_ids):
if hand_landmarks.landmark[tip].y < hand_landmarks.landmark[pip].y:
fingers.append(1)
else:
fingers.append(0)
# Deteksi khusus untuk ibu jari
thumb_tip = hand_landmarks.landmark[mp_hands.HandLandmark.THUMB_TIP]
thumb_ip = hand_landmarks.landmark[mp_hands.HandLandmark.THUMB_IP]
if (thumb_tip.x > thumb_ip.x and hand_landmarks.landmark[mp_hands.HandLandmark.WRIST].x < thumb_tip.x) or \
(thumb_tip.x < thumb_ip.x and hand_landmarks.landmark[mp_hands.HandLandmark.WRIST].x > thumb_tip.x):
fingers[0] = 1
return fingers
# Buka kamera
cap = cv2.VideoCapture(0)
# Pesan untuk setiap jari
finger_messages = {
0: "AKU",
1: "SANGAT",
2: "MENCINTAI",
3: "KAMU",
4: "......."
}
# Warna untuk tangan kiri dan kanan
hand_colors = [(0, 0, 255), (255, 0, 0)] # Merah dan Biru
while cap.isOpened():
ret, frame = cap.read()
if not ret:
continue
# Konversi warna BGR ke RGB
image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
image.flags.writeable = False
# Deteksi tangan
results = hands.process(image)
# Kembalikan ke BGR untuk ditampilkan
image.flags.writeable = True
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
if results.multi_hand_landmarks:
for hand_idx, hand_landmarks in enumerate(results.multi_hand_landmarks):
# Gambar landmark tangan dengan warna berbeda
mp_drawing.draw_landmarks(
image,
hand_landmarks,
mp_hands.HAND_CONNECTIONS,
mp_drawing.DrawingSpec(color=hand_colors[hand_idx % 2], thickness=2, circle_radius=2),
mp_drawing.DrawingSpec(color=hand_colors[hand_idx % 2], thickness=2, circle_radius=2)
)
# Deteksi jari yang terangkat
fingers = fingers_up(hand_landmarks)
# Tampilkan pesan untuk tangan ini
for i, is_up in enumerate(fingers):
if is_up:
# Posisi y berbeda untuk setiap tangan
y_position = 50 + hand_idx * 150 + i * 30
cv2.putText(image, finger_messages[i],
(50 + hand_idx * 300, y_position),
cv2.FONT_HERSHEY_SIMPLEX, 0.8,
hand_colors[hand_idx % 2], 2, cv2.LINE_AA)
# Tampilkan gambar
cv2.imshow('Pesan dengan Dua Tangan', image)
# Keluar dengan menekan 'q'
if cv2.waitKey(10) & 0xFF == ord('q'):
break
# Bersihkan
cap.release()
cv2.destroyAllWindows()
-
Notifications
You must be signed in to change notification settings - Fork 0
ByteBreakerGhost-69/LoveSign
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
About
A finger gesture detection program using MediaPipe and OpenCV that translates hand gestures into romantic love messages.
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published