-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdata.py
More file actions
93 lines (75 loc) · 3.65 KB
/
Copy pathdata.py
File metadata and controls
93 lines (75 loc) · 3.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import cv2
import mediapipe as mp
import numpy as np
import csv
import os
# --- PENGATURAN ---
mp_hands = mp.solutions.hands
# Pastikan max_num_hands=2 untuk mendeteksi dua tangan
hands = mp_hands.Hands(max_num_hands=2, min_detection_confidence=0.7, min_tracking_confidence=0.7)
mp_draw = mp.solutions.drawing_utils
# Nama file untuk menyimpan data
NAMA_FILE_DATA = 'gestur_data_kalimat.csv'
JUMLAH_LANDMARK = 21 # Landmark per tangan
# Buat header untuk file CSV jika belum ada
if not os.path.exists(NAMA_FILE_DATA):
with open(NAMA_FILE_DATA, mode='w', newline='') as f:
writer = csv.writer(f)
header = ['label']
# Total 126 kolom untuk koordinat (2 tangan * 21 landmark * 3 koordinat [x,y,z])
for i in range(1, (JUMLAH_LANDMARK * 2) + 1):
header += [f'x{i}', f'y{i}', f'z{i}']
writer.writerow(header)
print("--- Program Pengumpul Data (1 atau 2 Tangan) ---")
print("Tunjukkan gestur, lalu tekan tombol yang sesuai:")
print(" - Huruf 'a' - 'z' untuk alfabet.")
print(" - 'Spasi' untuk gestur HAPUS (tangan menyilang).")
print(" - 'q' untuk keluar.")
cap = cv2.VideoCapture(0)
while cap.isOpened():
success, image = cap.read()
if not success:
continue
image = cv2.flip(image, 1)
img_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
results = hands.process(img_rgb)
if results.multi_hand_landmarks:
for hand_landmarks in results.multi_hand_landmarks:
mp_draw.draw_landmarks(image, hand_landmarks, mp_hands.HAND_CONNECTIONS)
cv2.imshow('Pengumpul Data', image)
key = cv2.waitKey(10) & 0xFF
if key == ord('0'):
break
# Simpan data jika tombol huruf (a-z) atau spasi ditekan
if (97 <= key <= 122) or (key == 32): # ASCII untuk a-z dan Spasi
label = chr(key) if key != 32 else 'hapus'
print(f"Mencoba menyimpan data untuk: '{label.upper()}'")
# --- PERBAIKAN LOGIKA UTAMA ADA DI SINI ---
# KONDISI: Simpan jika SETIDAKNYA SATU tangan terdeteksi
if results.multi_hand_landmarks:
jumlah_tangan = len(results.multi_hand_landmarks)
print(f"--> Sukses! {jumlah_tangan} tangan terdeteksi, data disimpan.")
temp_row = []
# Proses Tangan Pertama (pasti ada jika masuk blok ini)
tangan_1_lm = results.multi_hand_landmarks[0].landmark
base_x_1, base_y_1, base_z_1 = tangan_1_lm[0].x, tangan_1_lm[0].y, tangan_1_lm[0].z
for lm in tangan_1_lm:
temp_row.extend([lm.x - base_x_1, lm.y - base_y_1, lm.z - base_z_1])
# Proses Tangan Kedua jika ada, jika tidak isi dengan nol
if jumlah_tangan == 2:
tangan_2_lm = results.multi_hand_landmarks[1].landmark
base_x_2, base_y_2, base_z_2 = tangan_2_lm[0].x, tangan_2_lm[0].y, tangan_2_lm[0].z
for lm in tangan_2_lm:
temp_row.extend([lm.x - base_x_2, lm.y - base_y_2, lm.z - base_z_2])
else:
# Jika hanya 1 tangan, isi sisa 63 kolom (21 landmark * 3 [x,y,z]) dengan nol
temp_row.extend([0.0] * JUMLAH_LANDMARK * 3)
# Simpan ke CSV
with open(NAMA_FILE_DATA, mode='a', newline='') as f:
writer = csv.writer(f)
writer.writerow([label] + temp_row)
else:
# Beri feedback di terminal jika tidak ada tangan sama sekali
print(f"--> Gagal! Tidak ada tangan terdeteksi. Tunjukkan setidaknya SATU tangan untuk menyimpan data.")
cap.release()
cv2.destroyAllWindows()