El Kontrolü ile Mouse Kullanmak – Kamera – Python

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:

  1. Öncelikle Python’u bilgisayarınıza kurun (eğer yoksa)
  2. Şu kütüphaneleri cmd kullanarak yükleyin:
    pip install opencv-python
    pip install mediapipe
    pip install pyautogui
    pip install numpy
  3. Kodu bir Python dosyasına (örneğin el_kontrolu.py) kaydedip çalıştırın
  4. Çı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()