Elinizle havada işaretler yaparak bilgisayarınızın faresini kontrol edebileceğiniz harika bir Python projesi!
Neler Yapabileceksiniz?
- Elinizi gösterdiğinizde: Ekranda yeşil çizgiler
- İşaret parmağını kaldırdığınızda: Fare imleci hareketi
- Baş parmak ve işaret parmağı birleşince: Sürükleme
- Elinizi açtığınızda: Sürüklemeyi bırakma
- İşaret ve orta parmak yan yana: Tıklama
- Yumruk + serçe parmak: Sağ tıklama
Gerekli Malzemeler
- Bilgisayar ve kamera
- Python
- OpenCV, MediaPipe ve PyAutoGUI kütüphaneleri
Kurulum
Projeyi çalıştırmak için şu adımları izleyin:
- Öncelikle Python’u bilgisayarınıza kurun (eğer yoksa)
- Şu kütüphaneleri cmd kullanarak yükleyin:
pip install opencv-python pip install mediapipe pip install pyautogui pip install numpy
- Kodu bir Python dosyasına (örneğin
el_kontrolu.py
) kaydedip çalıştırın - Çıkmak için ‘q’ tuşuna basın
Haydi Kodlamaya Başlayalım!
import cv2
import numpy as np
import mediapipe as mp
import pyautogui
import math
# Ekran boyutlarını al
screen_width, screen_height = pyautogui.size()
# Pencere kontrolü için gerekli değişkenler
is_dragging = False
prev_hand_position = None
# MediaPipe modellerini yükle
mp_hands = mp.solutions.hands
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
# El işaretlerini algılama modelini başlat
hands = mp_hands.Hands(
model_complexity=1,
min_detection_confidence=0.5,
min_tracking_confidence=0.5,
max_num_hands=1
)
# Kamera yakalama
cap = cv2.VideoCapture(0)
def calculate_distance(point1, point2):
"""İki nokta arasındaki mesafeyi hesapla"""
return math.sqrt((point1.x - point2.x)**2 + (point1.y - point2.y)**2)
def is_thumb_index_touching(hand_landmarks):
"""Baş parmak ve işaret parmağı dokunuyor mu kontrol et"""
thumb_tip = hand_landmarks.landmark[mp_hands.HandLandmark.THUMB_TIP]
index_tip = hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_TIP]
distance = calculate_distance(thumb_tip, index_tip)
return distance < 0.05
def is_fist_with_pinky_up(hand_landmarks):
"""Yumruk yapılmış ve sadece serçe parmak yukarıda mı kontrol et"""
pinky_tip = hand_landmarks.landmark[mp_hands.HandLandmark.PINKY_TIP]
pinky_pip = hand_landmarks.landmark[mp_hands.HandLandmark.PINKY_PIP]
ring_tip = hand_landmarks.landmark[mp_hands.HandLandmark.RING_FINGER_TIP]
ring_pip = hand_landmarks.landmark[mp_hands.HandLandmark.RING_FINGER_PIP]
middle_tip = hand_landmarks.landmark[mp_hands.HandLandmark.MIDDLE_FINGER_TIP]
middle_pip = hand_landmarks.landmark[mp_hands.HandLandmark.MIDDLE_FINGER_PIP]
index_tip = hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_TIP]
index_pip = hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_PIP]
# Serçe parmak yukarıda mı?
pinky_up = pinky_tip.y < pinky_pip.y
# Diğer parmaklar kapalı mı?
other_fingers_down = (
ring_tip.y > ring_pip.y and
middle_tip.y > middle_pip.y and
index_tip.y > index_pip.y
)
return pinky_up and other_fingers_down
def is_index_middle_together(hand_landmarks):
"""İşaret ve orta parmak yan yana mı kontrol et"""
index_tip = hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_TIP]
middle_tip = hand_landmarks.landmark[mp_hands.HandLandmark.MIDDLE_FINGER_TIP]
index_pip = hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_PIP]
middle_pip = hand_landmarks.landmark[mp_hands.HandLandmark.MIDDLE_FINGER_PIP]
# İki parmak da yukarıda mı?
fingers_up = index_tip.y < index_pip.y and middle_tip.y < middle_pip.y
# Parmaklar birbirine yakın mı?
horizontal_distance = abs(index_tip.x - middle_tip.x)
return fingers_up and horizontal_distance < 0.04
def is_single_finger_up(hand_landmarks):
"""Sadece tek parmak yukarıda mı kontrol et (işaret parmağı)"""
index_tip = hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_TIP]
index_pip = hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_PIP]
middle_tip = hand_landmarks.landmark[mp_hands.HandLandmark.MIDDLE_FINGER_TIP]
middle_pip = hand_landmarks.landmark[mp_hands.HandLandmark.MIDDLE_FINGER_PIP]
ring_tip = hand_landmarks.landmark[mp_hands.HandLandmark.RING_FINGER_TIP]
ring_pip = hand_landmarks.landmark[mp_hands.HandLandmark.RING_FINGER_PIP]
pinky_tip = hand_landmarks.landmark[mp_hands.HandLandmark.PINKY_TIP]
pinky_pip = hand_landmarks.landmark[mp_hands.HandLandmark.PINKY_PIP]
# İşaret parmağı yukarıda mı?
index_up = index_tip.y < index_pip.y
# Diğer parmaklar aşağıda mı?
others_down = (
middle_tip.y > middle_pip.y and
ring_tip.y > ring_pip.y and
pinky_tip.y > pinky_pip.y
)
return index_up and others_down
def is_open_palm(hand_landmarks):
"""El açık mı kontrol et"""
fingers_tips = [
hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_TIP],
hand_landmarks.landmark[mp_hands.HandLandmark.MIDDLE_FINGER_TIP],
hand_landmarks.landmark[mp_hands.HandLandmark.RING_FINGER_TIP],
hand_landmarks.landmark[mp_hands.HandLandmark.PINKY_TIP]
]
fingers_pips = [
hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_PIP],
hand_landmarks.landmark[mp_hands.HandLandmark.MIDDLE_FINGER_PIP],
hand_landmarks.landmark[mp_hands.HandLandmark.RING_FINGER_PIP],
hand_landmarks.landmark[mp_hands.HandLandmark.PINKY_PIP]
]
all_fingers_up = all(tip.y < pip.y for tip, pip in zip(fingers_tips, fingers_pips))
return all_fingers_up
try:
while cap.isOpened():
success, image = cap.read()
if not success:
print("Kamera görüntüsü alınamadı.")
continue
# Görüntüyü yatay olarak çevir (ayna etkisi)
image = cv2.flip(image, 1)
# BGR'dan RGB'ye dönüştür
results = hands.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
# Görüntü boyutlarını al
image_height, image_width, _ = image.shape
# Eli gösterdiğimde yeşil renklendir
if results.multi_hand_landmarks:
for hand_landmarks in results.multi_hand_landmarks:
# Eli yeşil renkle çiz
mp_drawing.draw_landmarks(
image,
hand_landmarks,
mp_hands.HAND_CONNECTIONS,
mp_drawing_styles.get_default_hand_landmarks_style(),
mp_drawing_styles.get_default_hand_connections_style())
# İmleci hareket ettirmek için el pozisyonu
index_tip = hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_TIP]
hand_x = int(index_tip.x * image_width)
hand_y = int(index_tip.y * image_height)
# Ekran koordinatlarına dönüştür (daha yumuşak hareket için)
smooth_x = np.interp(hand_x, (100, image_width-100), (0, screen_width))
smooth_y = np.interp(hand_y, (100, image_height-100), (0, screen_height))
# El hareketlerini kontrol et
# 1. Sadece işaret parmağı: imleci hareket ettir
if is_single_finger_up(hand_landmarks):
# İmleci hareket ettir
pyautogui.moveTo(smooth_x, smooth_y)
# 2. Baş parmak ve işaret parmağı birleşince: sürükleme başlat
elif is_thumb_index_touching(hand_landmarks):
if not is_dragging:
pyautogui.mouseDown()
is_dragging = True
# El pozisyonu değiştikçe pencereyi taşı (imleç zaten hareket ediyor)
pyautogui.moveTo(smooth_x, smooth_y)
# 3. Açık el: sürüklemeyi bırak
elif is_open_palm(hand_landmarks):
if is_dragging:
pyautogui.mouseUp()
is_dragging = False
# 4. İşaret ve orta parmak yan yana: tıkla
elif is_index_middle_together(hand_landmarks):
pyautogui.click()
# Çift tıklamayı önlemek için kısa bir bekleme
cv2.waitKey(500)
# 5. Yumruk + serçe parmak: sağ tıklama
elif is_fist_with_pinky_up(hand_landmarks):
pyautogui.rightClick()
# Çift tıklamayı önlemek için kısa bir bekleme
cv2.waitKey(500)
# FPS ve kontrol bilgilerini göster
cv2.putText(image, "El Kontrolu Aktif", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
# Komutları ekranda göster
commands = [
"Eli Goster: Yesil Cizimler",
"Tek Parmak: Imlec Hareketi",
"Bas ve Isaret Parmagi Birlesik: Surukle",
"Acik El: Birak",
"Isaret ve Orta Parmak Yan Yana: Tikla",
"Yumruk + Serce Parmak: Sag Tikla"
]
y_offset = 60
for cmd in commands:
cv2.putText(image, cmd, (10, y_offset),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)
y_offset += 25
# Pencereyi göster
cv2.imshow('El Haraketleri ile Kontrol', image)
# Çıkış için 'q' tuşuna bas
if cv2.waitKey(5) & 0xFF == ord('q'):
break
finally:
hands.close()
cap.release()
cv2.destroyAllWindows()