Takip et

Python ile El Hareketiyle Fare Kontrolü: Adım Adım Rehber

Python kullanarak kendi el hareketiyle fare kontrol sisteminizi nasıl kuracağınızı merak ediyor musunuz? Bu kapsamlı rehberde, bilgisayar görüşü temellerinden ileri düzey optimizasyonlara kadar her şeyi adım adım öğreneceksiniz. Kendi sanal farenizi oluşturun ve etkileşimin geleceğine adım atın!

Günümüz dijital dünyasında, bilgisayarlarla etkileşim yöntemlerimiz sürekli gelişiyor. Geleneksel klavye ve fare ikilisi, her ne kadar verimli olsa da, bazı durumlarda yetersiz kalabiliyor veya yeni nesil kullanıcı deneyimlerini kısıtlayabiliyor. İşte bu noktada el hareketiyle fare kontrolü, yeni ufuklar açan, son derece yenilikçi bir alternatif olarak karşımıza çıkıyor. Peki, el hareketleriyle bilgisayarımızı kontrol etmek neden bu kadar büyük bir potansiyele sahip?

Öncelikle, erişilebilirlik açısından bu teknolojinin sunduğu faydalar göz ardı edilemez. Fiziksel engelleri olan bireyler için, standart bir fare kullanmak zorlu hatta imkansız olabilir. El hareketleri ile kontrol, bu kişilerin bilgisayar erişimini kolaylaştırarak onlara daha bağımsız bir deneyim sunar. Bir kamera ve basit jestlerle tüm bilgisayarı yönetmek, yaşam kalitelerini önemli ölçüde artırabilir. Ayrıca, uzun süreli fare kullanımından kaynaklanan bilek ağrısı veya karpal tünel sendromu gibi sağlık sorunları yaşayanlar için de ergonomik bir çözüm sunabilir. Bu, yalnızca bir konfor meselesi değil, aynı zamanda sağlığı destekleyici bir yaklaşımdır.

İkinci olarak, sunumlar ve eğitim ortamları gibi senaryolarda el hareketiyle fare kontrolü, etkileşimi çok daha dinamik hale getirir. Bir sunum yaparken, klavye veya fareye bağlı kalmadan sahnenin ortasında serbestçe dolaşarak slaytları değiştirmek, içerikleri vurgulamak veya sanal bir işaretleyici kullanmak mümkündür. Bu, dinleyicilerle daha doğal ve akıcı bir bağlantı kurmayı sağlar. Eğitimde ise, öğrencilerin interaktif panolar veya sanal nesnelerle doğrudan el hareketleriyle etkileşime girmesi, öğrenme sürecini daha ilgi çekici ve akılda kalıcı kılabilir. Özellikle uzaktan eğitim platformlarında, bu tür bir etkileşim, fiziksel sınıf ortamının dinamizmini bir nebze de olsa dijital ortama taşıyabilir.

Üçüncüsü, sanal ve artırılmış gerçeklik (VR/AR) teknolojilerinin yükselişiyle birlikte, doğal kullanıcı arayüzlerine olan ihtiyaç giderek artıyor. Geleneksel denetleyiciler, bu sürükleyici deneyimlerde çoğu zaman “gerçeklik hissini” bozabilir. El hareketleriyle kontrol, VR/AR ortamlarında nesnelerle etkileşime girmek, menülerde gezinmek veya karakterleri yönlendirmek için çok daha sezgisel ve doğal bir yöntem sunar. Bu, sanal dünyalarla olan bağımızı güçlendirir ve deneyimi daha da sürükleyici hale getirir. Son olarak, ev otomasyonu ve akıllı ev sistemlerinde de el hareketleri, ışıkları açıp kapama, termostatı ayarlama veya medya oynatıcıyı kontrol etme gibi günlük görevleri kolaylaştırmak için kullanılabilir. Görüldüğü üzere, el hareketiyle fare kontrolü sadece bir teknolojik yenilik olmaktan öte, hayatımızın birçok alanında bize daha doğal, erişilebilir ve etkileşimli bir dünya vaat ediyor.

Temel Kavramlar: Bilgisayar Görüşü ve Hareket Algılama Nedir?

El hareketiyle fare kontrolü gibi sistemler inşa etmek istediğimizde, bilgisayar görüşü ve hareket algılama gibi temel kavramları anlamak hayati önem taşır. Bu teknolojilerin nasıl çalıştığını kavradığımızda, projemizin mantıksal temelini çok daha sağlam bir şekilde oturtmuş oluruz. Peki, bu kavramlar aslında ne anlama geliyor?

Bilgisayar Görüşü (Computer Vision) en basit tabiriyle, bilgisayarların dijital görüntülerden veya videolardan anlamlı bilgiler çıkarmasını sağlayan bir yapay zeka alanıdır. Tıpkı insan gözü ve beyni gibi, bilgisayarların da gördüklerini yorumlamasını ve anlamasını hedefler. Bu, bir fotoğraftaki nesneleri tanımaktan, bir videodaki hareketleri izlemeye kadar geniş bir yelpazeyi kapsar. Bilgisayar görüşü, piksellerden oluşan ham veriyi alıp, bu veriyi işleyerek şekiller, renkler, desenler ve hatta derinlik gibi özellikleri analiz eder. Örneğin, bir insan yüzünü tanımak, bir arabanın plaketini okumak veya bir fabrikanın üretim hattında hata tespiti yapmak gibi görevler bilgisayar görüşünün uygulama alanlarındandır. El hareketiyle fare kontrolü bağlamında ise, bilgisayar görüşü kameradan gelen görüntü akışını analiz ederek bir elin varlığını, konumunu ve parmakların duruşunu tespit etmek için kullanılır.

Hareket Algılama (Motion Detection) ise, bilgisayar görüşünün daha spesifik bir alt dalıdır ve görüntülerdeki veya video akışındaki değişiklikleri tespit etmeye odaklanır. Yani, bir nesnenin konumunun zaman içinde nasıl değiştiğini izlemektir. Temelde, iki ardışık görüntü karesi arasındaki farkları analiz ederek bir hareketin olup olmadığını belirler. Eğer iki kare arasında yeterince büyük bir piksel farkı varsa, bu bir hareketin göstergesi olarak kabul edilir. Güvenlik kameraları, insansız hava araçları (drone’lar) veya spor analiz sistemleri gibi birçok alanda hareket algılama teknolojisi kullanılır. Bizim projemizde ise, elin hareketlerini izleyerek fare imlecinin ekranda nasıl hareket etmesi gerektiğini belirlemek için hareket algılama prensiplerinden faydalanacağız. Parmağın ucunun belirli bir yöne kayması, imlecin de o yöne doğru hareket etmesini sağlayacak bir hareket olarak algılanacaktır.

Bu iki kavram bir araya geldiğinde, kameradan alınan görüntüler üzerinde önce el tespiti ve parmakların izlenmesi gibi bilgisayar görüşü görevleri yerine getirilir. Ardından, bu el ve parmak konumlarındaki zamansal değişiklikler hareket algılama teknikleriyle analiz edilerek, farenin hangi eylemleri gerçekleştireceği (hareket, tıklama, sürükleme vb.) belirlenir. Bu süreç, oldukça karmaşık matematiksel algoritmalar ve istatistiksel modeller içerse de, modern kütüphaneler (tıpkı MediaPipe gibi) sayesinde biz geliştiricilerin işi büyük ölçüde kolaylaşmıştır. Artık bu derin teknik detaylara inmeden, yüksek seviyeli araçlarla bu tür sistemleri hızlıca prototipleme imkanına sahibiz. Bu temel bilgiyi edinmek, projemizin adımlarını daha bilinçli ve sağlam bir şekilde atmamızı sağlayacaktır.

Gerekli Araçlar ve Kütüphaneler: Nelerle Başlayacağız?

Herhangi bir Python projesine başlarken, doğru araçları ve kütüphaneleri seçmek, projenin başarısı ve geliştirme sürecinin verimliliği açısından kritik öneme sahiptir. El hareketiyle fare kontrolü projemiz için de, bu alanda kendini kanıtlamış, güçlü ve kullanımı nispeten kolay birkaç temel araca ihtiyacımız olacak. İşte projemizin iskeletini oluşturacak bu araçlar ve kütüphaneler:

  1. Python Programlama Dili:

    Projemizin temelini oluşturan dil Python olacak. Python, basit sözdizimi, geniş kütüphane ekosistemi ve okunaklı yapısıyla hızlı prototipleme ve bilimsel hesaplamalar için ideal bir seçimdir. Eğer bilgisayarınızda Python yüklü değilse, resmi Python web sitesinden en son kararlı sürümü (tercihen Python 3.8 veya üzeri) indirebilir ve kurabilirsiniz. Kurulum sırasında PATH değişkenine Python’ı eklediğinizden emin olun.

  2. OpenCV (Open Source Computer Vision Library):

    Bilgisayar görüşü alanında de-facto standart olan OpenCV, görüntü ve video işleme için yüzlerce optimize edilmiş algoritma sunar. Kameradan görüntü akışı almak, bu görüntüleri işlemek ve ekranda göstermek gibi temel görsel görevler için OpenCV’yi kullanacağız. El izleme algoritmaları genellikle bu kütüphaneden alınan video kareleri üzerinde çalışır. OpenCV’nin sağladığı yüksek performans ve geniş fonksiyon seti, bu tür projeler için vazgeçilmezdir. Kurulumu oldukça basittir:

    
    pip install opencv-python
                

  3. MediaPipe:

    Google tarafından geliştirilen MediaPipe, makine öğrenimi tabanlı çözümlerin platformlar arası uygulanmasına olanak tanıyan bir çerçevedir. El izleme (Hand Tracking), yüz tanıma (Face Detection) gibi karmaşık bilgisayar görüşü görevlerini, önceden eğitilmiş modellerle kolayca gerçekleştirmemizi sağlar. Projemizde, MediaPipe'in el izleme modülünü kullanarak bir elin ekrandaki 21 farklı anahtar noktasını (parmak uçları, eklemler, avuç içi vb.) hassas bir şekilde tespit edeceğiz. Bu, bizim için el hareketlerini tanımak adına oldukça detaylı veriler sağlayacaktır. Kurulumu da tıpkı OpenCV gibi kolaydır:

    
    pip install mediapipe
                

  4. PyAutoGUI:

    Fare imlecini programatik olarak kontrol etmek, tıklama veya sürükleme gibi fare eylemlerini taklit etmek için PyAutoGUI kütüphanesini kullanacağız. Bu kütüphane, klavye ve fareyi simüle ederek işletim sistemi düzeyinde otomasyon sağlar. El hareketlerinden elde ettiğimiz verileri, PyAutoGUI aracılığıyla gerçek fare hareketlerine dönüştüreceğiz. Bu kütüphane, kullanıcının fare imlecini ekranda hareket ettirme ve tıklama ihtiyaçlarını karşılayacaktır. Kurulumu aşağıdaki gibidir:

    
    pip install pyautogui
                

    Uzman İpucu: PyAutoGUI kullanırken dikkatli olun! Kontrolsüz veya sonsuz döngüde çalışan kodlar fare ve klavyenizi kilitleyebilir. Geliştirme aşamasında her zaman bir "kill switch" (örn. köşeye fareyi götürmek veya belirli bir tuşa basmak) veya acil durdurma mekanizması bulundurun.
  5. NumPy (Opsiyonel ama Tavsiye Edilir):

    Sayısal işlemler ve matris manipülasyonları için NumPy, Python'da standart haline gelmiştir. Görüntü işleme sırasında veya el noktalarının koordinatlarını analiz ederken matematiksel hesaplamalar yapmamız gerekebilir. OpenCV ve MediaPipe ile çoğu işi halletsek de, daha karmaşık veri analizleri için NumPy'yi kullanmak faydalı olabilir. Çoğu zaman diğer kütüphanelerle birlikte otomatik olarak gelir, ancak yine de yüklemek isteyebilirsiniz:

    
    pip install numpy
                

Bu kütüphaneleri sisteminize kurduktan sonra, artık kod yazmaya ve el hareketiyle fare kontrolörünüzü adım adım inşa etmeye hazırsınız. Her bir kütüphane, projemizin farklı bir katmanını oluşturacak ve bir araya geldiklerinde güçlü bir sistem ortaya çıkaracaktır. Hazırlık aşamasını tamamlamak, sorunsuz bir geliştirme süreci için temel adımdır.

Adım Adım Kurulum ve İlk Çalıştırma: Python Projenizi Hazırlayın

Artık gerekli tüm kütüphaneleri sistemimize kurduğumuza göre, ilk Python kodumuzu yazmaya ve projemizin temelini atmaya başlayabiliriz. Bu adımda, kameradan görüntü akışı almayı, MediaPipe kullanarak elimizi tespit etmeyi ve tespit edilen anahtar noktaları ekranda göstermeyi hedefleyeceğiz. Bu sayede, sistemimizin çalışıp çalışmadığını görsel olarak doğrulayabileceğiz.

1. Adım: Temel Kütüphaneleri İçe Aktarma ve Kamera Erişimi

İlk olarak, projemiz için gerekli olan kütüphaneleri Python dosyamızın en başına içe aktarmamız gerekiyor. Ardından, bilgisayarımızın varsayılan kamerasına erişmek için OpenCV'yi kullanacağız. Bir video yakalama nesnesi oluşturup, kameranın açılıp açılmadığını kontrol etmek iyi bir pratiktir.


import cv2
import mediapipe as mp
import time # FPS hesaplamak için kullanabiliriz (opsiyonel)

# MediaPipe el izleme modülünü başlatma
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(min_detection_confidence=0.7, min_tracking_confidence=0.7)
mp_draw = mp.solutions.drawing_utils # El noktalarını ve bağlantılarını çizmek için

# Kamerayı başlatma
cap = cv2.VideoCapture(0) # 0, genellikle varsayılan kamerayı temsil eder

if not cap.isOpened():
    print("Kamera açılamadı. Lütfen kameranın bağlı olduğundan ve başka bir uygulama tarafından kullanılmadığından emin olun.")
    exit()

# FPS hesaplaması için değişkenler (opsiyonel)
pTime = 0
cTime = 0
    

2. Adım: Görüntü Akışını İşleme ve El Tespiti

Kamera açıldıktan sonra, sürekli olarak kareler almamız ve her bir kare üzerinde MediaPipe ile el tespiti yapmamız gerekecek. Bu işlem bir while döngüsü içinde gerçekleştirilir. OpenCV, BGR formatında görüntüler sağlarken, MediaPipe RGB formatında görüntüler bekler. Bu nedenle, renk formatını dönüştürmemiz önemlidir.


while True:
    success, img = cap.read()
    if not success:
        print("Kamera akışından kare okunamadı.")
        break

    # MediaPipe'in daha iyi çalışması için görüntüyü yatay çeviriyoruz (ayna efekti)
    img = cv2.flip(img, 1)

    # MediaPipe'in beklediği RGB formatına dönüştürme
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

    # El tespiti ve izleme
    results = hands.process(imgRGB)

    # El noktaları tespit edildiyse
    if results.multi_hand_landmarks:
        for handLms in results.multi_hand_landmarks:
            # Her bir eldeki 21 anahtar noktasını çiz
            mp_draw.draw_landmarks(img, handLms, mp_hands.HAND_CONNECTIONS)

            # Her bir noktanın koordinatlarını almak için
            for id, lm in enumerate(handLms.landmark):
                h, w, c = img.shape
                cx, cy = int(lm.x * w), int(lm.y * h)
                # İsteğe bağlı: Parmak uçlarını daire ile işaretleyebiliriz
                # if id == 8: # İşaret parmağı ucu
                #     cv2.circle(img, (cx, cy), 15, (255, 0, 255), cv2.FILLED)
                # print(f"Parmak Noktası {id}: ({cx}, {cy})") # Konsola yazdırmak isterseniz

    # FPS Hesaplama ve Görüntüleme (opsiyonel)
    cTime = time.time()
    fps = 1 / (cTime - pTime)
    pTime = cTime
    cv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 255), 3)

    # İşlenmiş görüntüyü gösterme
    cv2.imshow("El Hareketi Kontrolu", img)

    # 'q' tuşuna basıldığında döngüden çık
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# Kaynakları serbest bırakma
cap.release()
cv2.destroyAllWindows()
    

Bilgi Notu: cv2.flip(img, 1) satırı, görüntüyü yatay eksende çevirerek ayna efekti yaratır. Bu, kullanıcının kendi elini ekranda gördüğü gibi kontrol etmesini kolaylaştırır ve daha doğal bir deneyim sunar.

Bu kodu çalıştırdığınızda, bilgisayarınızın kamerasını kullanarak kendi elinizi ekranda takip ettiğini ve elinizin anahtar noktalarını bir iskelet yapısı gibi çizdiğini görmelisiniz. Bu, sistemimizin temel taşlarını başarıyla kurduğunuz ve el izleme işlevinin doğru çalıştığını gösterir. Artık, bu el noktası verilerini kullanarak fare hareketlerini ve tıklamalarını programlamaya geçebiliriz.

El İzleme ve Parmak Tanıma: MediaPipe ile Sihri Gerçekleştirme

El izleme ve parmak tanıma, projemizin kalbinde yer alıyor. MediaPipe'in bu alandaki gücü sayesinde, kamera görüntüsündeki bir elin 21 farklı önemli noktasını (landmark) milisaniyeler içinde tespit edebiliyoruz. Bu noktalar, parmak uçlarından avuç içine kadar her ayrıntıyı içerir ve bize elin duruşu, açısı ve pozisyonu hakkında zengin bilgiler sunar. Bu bilgiyi kullanarak, farklı el jestlerini tanımlayabilir ve bunları fare eylemleriyle ilişkilendirebiliriz.

MediaPipe'ten aldığımız her bir anahtar nokta (landmark), görüntünün genişliği ve yüksekliğine oranla normalleştirilmiş (0 ile 1 arasında) X, Y ve Z koordinatlarını içerir. X ve Y ekran koordinatlarımızı temsil ederken, Z koordinatı derinlik bilgisini verir. Bizim için fare kontrolünde öncelikli olarak X ve Y koordinatları önemli olacaktır. Parmakların durumunu anlamak için, belirli parmak noktaları arasındaki mesafeleri veya açıları analiz etmemiz gerekir.

Parmak Landmark ID'leri Önemli Noktalar
Başparmak 1, 2, 3, 4 Avuç içi tabanı, eklemler, uç
İşaret Parmağı 5, 6, 7, 8 Avuç içi tabanı, eklemler, uç
Orta Parmak 9, 10, 11, 12 Avuç içi tabanı, eklemler, uç
Yüzük Parmağı 13, 14, 15, 16 Avuç içi tabanı, eklemler, uç
Serçe Parmak 17, 18, 19, 20 Avuç içi tabanı, eklemler, uç

Örneğin, işaret parmağının ucunu (ID 8) ve başparmağın ucunu (ID 4) kullanarak bir "tutma" veya "sıkıştırma" (pinch) jestini algılayabiliriz. Bu iki nokta arasındaki Öklid mesafesi belirli bir eşiğin altına düştüğünde, bir tıklama eylemi tetiklenebilir. Benzer şekilde, sadece işaret parmağını uzatıp diğer parmakları kapalı tutarak fare imlecini kontrol edebiliriz. Bu, temel mantığımızı oluşturacak.

Fare Hareketlerini Kodlama: İmleci Nasıl Kontrol Edeceğiz?

Fare imlecini kontrol etmek için, işaret parmağımızın ucunun (landmark ID 8) ekran üzerindeki konumunu kullanacağız. Kameradan gelen görüntüde bu noktanın piksel koordinatlarını alıp, bu koordinatları bilgisayar ekranının boyutlarına ölçeklendirmemiz gerekecek. Çünkü kameranın çözünürlüğü ile monitörün çözünürlüğü farklı olabilir.


# ... (önceki koddan devam) ...
import pyautogui

# Ekran boyutlarını al
screen_width, screen_height = pyautogui.size()

# Fare hareket alanı için bir çerçeve (daha yumuşak hareket için)
frame_reduction = 100 # Ekranın kenarlarından bırakılacak boşluk
smoothening = 7 # Fare hareketini yumuşatma faktörü

# Başlangıçta fare konumunu ayarla
plocX, plocY = 0, 0 # Önceki konum
clocX, clocY = 0, 0 # Mevcut konum

while True:
    success, img = cap.read()
    if not success:
        break

    img = cv2.flip(img, 1)
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    results = hands.process(imgRGB)

    if results.multi_hand_landmarks:
        for handLms in results.multi_hand_landmarks:
            # İşaret parmağı ucu (landmark 8) ve orta parmak ucu (landmark 12)
            lmList = []
            for id, lm in enumerate(handLms.landmark):
                h, w, c = img.shape
                cx, cy = int(lm.x * w), int(lm.y * h)
                lmList.append([id, cx, cy])
                # Parmak uçlarını görselleştirme
                # if id == 8 or id == 12:
                #     cv2.circle(img, (cx, cy), 10, (255, 0, 255), cv2.FILLED)

            if len(lmList) != 0:
                x1, y1 = lmList[8][1:] # İşaret parmağı ucu
                x2, y2 = lmList[12][1:] # Orta parmak ucu

                # Fare hareket alanı için dikdörtgen çizimi (görsel feedback)
                cv2.rectangle(img, (frame_reduction, frame_reduction),
                              (w - frame_reduction, h - frame_reduction),
                              (255, 0, 255), 2)

                # Sadece işaret parmağı hareketli mi kontrolü
                # İşaret parmağı ucunun Y koordinatının orta parmak ucunun Y koordinatından yüksek olup olmadığını kontrol et
                # Yani işaret parmağı yukarıda ve orta parmak aşağıda (genellikle kapalı) ise
                fingers = []
                # Başparmak kontrolü (x pozisyonu)
                if lmList[4][1] > lmList[3][1]: # Sağ el için (sol el ise tersi)
                    fingers.append(1)
                else:
                    fingers.append(0)

                # Diğer 4 parmak için (y pozisyonu)
                for id in [8, 12, 16, 20]:
                    if lmList[id][2] < lmList[id - 2][2]: # Parmak ucu, parmak boğumundan yukarıda ise açık
                        fingers.append(1)
                    else:
                        fingers.append(0)

                totalFingers = fingers.count(1)

                # Sadece işaret parmağı açık olduğunda imleci hareket ettir
                if totalFingers == 1 and fingers[1] == 1: # Sadece işaret parmağı açık
                    # Koordinatları ekrana oranla ölçeklendir
                    # Kamera frame'ini monitör çözünürlüğüne eşle
                    x3 = int(pyautogui.mapRange(x1, frame_reduction, w - frame_reduction, 0, screen_width))
                    y3 = int(pyautogui.mapRange(y1, frame_reduction, h - frame_reduction, 0, screen_height))

                    # Hareketleri yumuşatma
                    clocX = plocX + (x3 - plocX) / smoothening
                    clocY = plocY + (y3 - plocY) / smoothening

                    # Fareyi hareket ettir
                    pyautogui.moveTo(clocX, clocY)
                    plocX, plocY = clocX, clocY

                    # Görsel geri bildirim (imleç noktası)
                    cv2.circle(img, (x1, y1), 15, (0, 255, 0), cv2.FILLED)


    # ... (FPS ve imshow, waitKey kodları) ...
    

Uzman İpucu: pyautogui.mapRange fonksiyonu, bir aralıktaki değeri başka bir aralığa eşlemek için idealdir. Örneğin, kameranın görüntü alanındaki işaret parmağı koordinatlarını (örneğin 0-640 piksel) ekranınızın çözünürlüğüne (örneğin 0-1920 piksel) dönüştürmek için kullanılabilir. Bu, hassas kontrol sağlar.

Bu kod parçası, işaret parmağınızın ekrandaki hareketini takip edecek ve fare imlecini o konuma taşıyacaktır. frame_reduction ve smoothening değerleri, fare hareketinin hassasiyetini ve akıcılığını ayarlamanıza yardımcı olur. Bu sayede, daha stabil ve kullanıcı dostu bir deneyim elde edebilirsiniz. Özellikle smoothening değeri, elinizdeki küçük titreşimlerin fare imlecini çok fazla oynatmasını engelleyerek daha konforlu bir kullanım sunar.

Tıklama ve Sürükleme Fonksiyonları: Jestleri Eyleme Dönüştürme

Fare imlecini hareket ettirmek harika, ancak asıl kontrol, tıklama ve sürükleme gibi etkileşimleri yapabilmekle sağlanır. Bu bölümde, belirli el jestlerini algılayarak sol tıklama ve nesneleri sürükleme işlevlerini nasıl ekleyeceğimizi göreceğiz.


# ... (önceki koddan devam) ...
# pyautogui.mapRange fonksiyonu olmadığı için manuel olarak yazıyoruz
def map_range(value, in_min, in_max, out_min, out_max):
    return (value - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

while True:
    # ... (kamera okuma, flip, RGB dönüştürme, hand.process kısmı) ...

    if results.multi_hand_landmarks:
        for handLms in results.multi_hand_landmarks:
            lmList = []
            for id, lm in enumerate(handLms.landmark):
                h, w, c = img.shape
                cx, cy = int(lm.x * w), int(lm.y * h)
                lmList.append([id, cx, cy])

            if len(lmList) != 0:
                x1, y1 = lmList[8][1:] # İşaret parmağı ucu
                x2, y2 = lmList[12][1:] # Orta parmak ucu
                thumb_x, thumb_y = lmList[4][1:] # Başparmak ucu

                cv2.rectangle(img, (frame_reduction, frame_reduction),
                              (w - frame_reduction, h - frame_reduction),
                              (255, 0, 255), 2)

                fingers = []
                # Başparmak kontrolü (sol el/sağ el ayrımı yapılabilir, basitçe x eksenine göre)
                # Buradaki basit kontrol yerine, parmak boğumları arasındaki mesafeye bakmak daha sağlamdır
                # Örneğin, başparmak ucu (4) ile başparmak tabanı (2) arasındaki mesafe
                if lmList[4][1] < lmList[3][1]: # Sağ el için başparmak açıldığında x küçülür
                    fingers.append(1)
                else:
                    fingers.append(0)

                # Diğer 4 parmak için (y pozisyonu)
                # Parmak ucu (id) ve bir alttaki boğum (id-2) arasındaki mesafeye bakıyoruz
                for id in [8, 12, 16, 20]:
                    if lmList[id][2] < lmList[id - 2][2]: # Parmak ucu, boğumdan yukarıda ise açık
                        fingers.append(1)
                    else:
                        fingers.append(0)

                totalFingers = fingers.count(1)

                # Fare hareket modu (sadece işaret parmağı açık)
                if totalFingers == 1 and fingers[1] == 1:
                    x3 = map_range(x1, frame_reduction, w - frame_reduction, 0, screen_width)
                    y3 = map_range(y1, frame_reduction, h - frame_reduction, 0, screen_height)

                    clocX = plocX + (x3 - plocX) / smoothening
                    clocY = plocY + (y3 - plocY) / smoothening

                    pyautogui.moveTo(clocX, clocY)
                    plocX, plocY = clocX, clocY
                    cv2.circle(img, (x1, y1), 15, (0, 255, 0), cv2.FILLED)

                # Tıklama modu (işaret ve orta parmak açık)
                # VEYA işaret parmağı ile başparmak arasındaki mesafe belirli bir eşiğin altındaysa (pinch)
                elif fingers[1] == 1 and fingers[2] == 1: # İşaret ve orta parmak açık
                    # Fare tıklamasını tetiklemek için ek bir jest veya mesafe kontrolü
                    # Örneğin, işaret parmağı ile başparmak arasındaki mesafeyi ölçelim
                    distance_x = abs(x1 - thumb_x)
                    distance_y = abs(y1 - thumb_y)
                    # İki parmak arasındaki Öklid mesafesi
                    length = ((x1 - thumb_x)2 + (y1 - thumb_y)2)**0.5

                    if length < 40: # Bu eşik değeri deneme yanılma ile ayarlanmalıdır
                        cv2.circle(img, (x1, y1), 15, (0, 0, 255), cv2.FILLED) # Tıklama olduğunu göstermek için renk değiştir
                        pyautogui.click() # Sol tıklama

                # Sürükleme modu (işaret, orta ve yüzük parmağı açık - veya başparmak ve işaret parmağı sıkılıp diğerleri açık)
                # Bu kısım biraz daha karmaşık olabilir ve projenin amacına göre değişir.
                # Örnek: Başparmak ile işaret parmağı sıkılı iken, diğer parmaklar açıksa sürükleme yap.
                # Veya, belirli bir parmak kombinasyonu ile basılı tutma efekti ver.
                # Örneğin, başparmak ve işaret parmağı birbirine yakın ve diğerleri açık
                # Bu kısmı şimdilik basılı tutma olarak ayarlayalım:
                # Eğer başparmak ve işaret parmağı yakınsa VE en az 3 parmak açık ise sürükleme
                elif length < 40 and totalFingers >= 3: # Basılı tutma ve sürükleme
                    cv2.circle(img, (x1, y1), 15, (255, 255, 0), cv2.FILLED) # Sürükleme olduğunu göstermek için renk değiştir
                    pyautogui.mouseDown() # Fare sol tuşuna basılı tut
                    # Fare hareket etmeye devam edecektir
                    x3 = map_range(x1, frame_reduction, w - frame_reduction, 0, screen_width)
                    y3 = map_range(y1, frame_reduction, h - frame_reduction, 0, screen_height)
                    clocX = plocX + (x3 - plocX) / smoothening
                    clocY = plocY + (y3 - plocY) / smoothening
                    pyautogui.moveTo(clocX, clocY)
                    plocX, plocY = clocX, clocY
                else:
                    pyautogui.mouseUp() # El gevşediğinde fare tuşunu bırak

    # ... (FPS ve imshow, waitKey kodları) ...
    

Bilgi Notu: Parmakların açık veya kapalı olduğunu tespit etmek için, her parmak ucunun (ID 8, 12, 16, 20) kendi bir altındaki boğumdan (ID 6, 10, 14, 18) daha yukarıda (daha küçük Y değeri) olup olmadığına bakarız. Başparmak için (ID 4), başparmak ucunun avuç içine göre X pozisyonu kontrol edilebilir, çünkü başparmak hareket yönü diğerlerinden farklıdır. Bu yöntem, parmaklarınızı kameraya göre nasıl tuttuğunuza bağlı olarak ayarlanması gereken eşik değerleri içerir.

Bu kod bloğu, el hareketlerinizi fare eylemlerine dönüştürmenin temelini oluşturur. İşaret parmağınızla başparmağınız arasındaki mesafeyi ölçerek, bir "sıkıştırma" jestini tıklama olarak algılayabiliriz. Eğer bu sıkıştırma jesti belirli bir süre devam ederken eliniz hareket ediyorsa, bunu bir sürükleme eylemi olarak yorumlayabiliriz. Bu tür jest tanımlamaları, projenizin karmaşıklığına ve istediğiniz kullanıcı deneyimine göre özelleştirilebilir. Bu aşamadan sonra, kendi deneyimlerinize göre eşik değerlerini ve jest tanımlarını optimize etmeniz gerekecektir. Unutmayın, iyi bir jest sistemi, hem sezgisel hem de hatasız olmalıdır.

Gerçek Dünya Senaryoları ve İleri Düzey Optimizasyonlar

El hareketiyle fare kontrol sistemi, sadece eğlenceli bir proje olmanın ötesinde, gerçek dünyada birçok faydalı uygulama alanına sahiptir. Bu bölümde, bu teknolojinin kullanılabileceği bazı vaka analizlerini ve sisteminizi daha da geliştirebileceğiniz ileri düzey optimizasyonları inceleyeceğiz.

Vaka Analizi 1: Erişilebilirlik ve Engelli Bireyler

Senaryo: ALS (Amyotrofik Lateral Skleroz) veya şiddetli artrit gibi motor nöron hastalıkları nedeniyle geleneksel fare kullanamayan bir kullanıcı düşünün. Bu kullanıcılar, ellerini küçük ve hassas hareketlerle kontrol etmekte zorlanabilirler. El hareketiyle fare kontrol sistemi, bu bireylere bilgisayar erişimi sağlayarak onların dijital dünyayla etkileşimini mümkün kılar. Örneğin, başlarını veya gözlerini kullanamayan ancak elinde kısıtlı da olsa hareket edebilenler için büyük bir kolaylık sunar.

  • Uygulama: Sistem, daha büyük jest algılama alanlarına ve daha esnek eşik değerlerine sahip olacak şekilde yapılandırılabilir. Örneğin, hafif bir el sallama hareketi bir tıklama olarak algılanabilir veya parmakların sadece hafifçe bükülmesi bile yeterli olabilir. PyAutoGUI ile entegre edilen özelleştirilebilir jestler, farklı ihtiyaçlara göre uyarlanabilir.
  • Fayda: Kullanıcının bağımsızlığını artırır, eğitim ve iş hayatına katılımını destekler. Geleneksel yardımcı teknolojilere kıyasla daha ekonomik ve özelleştirilebilir bir çözüm sunar.

Vaka Analizi 2: Sunumlar ve Etkileşimli Eğitim

Senaryo: Bir profesyonel konuşmacı veya öğretmen, sunum yaparken veya ders anlatırken sahnenin farklı yerlerinde hareket etmek ve bilgisayarını uzaktan kontrol etmek istiyor. Geleneksel bir sunum kumandası yerine, daha doğal ve etkileyici bir yöntem arıyor.

  • Uygulama: El hareketiyle kontrol, sunum yazılımlarında (PowerPoint, Google Slides vb.) slaytları ileri/geri taşımak, sanal bir işaretleyici ile ekranda vurgular yapmak veya video oynatıcıyı kontrol etmek için kullanılabilir. Örneğin, sağa doğru bir el kaydırma hareketi "sonraki slayt", yukarı parmak "sesi aç" gibi jestler atanabilir.
  • Fayda: Sunumları daha dinamik ve akılda kalıcı hale getirir. Konuşmacının seyirciyle daha fazla göz teması kurmasını ve sahne hakimiyetini artırmasını sağlar. Eğitim ortamlarında öğrencilerin interaktif içeriklerle fiziksel olarak etkileşimini teşvik eder.

Vaka Analizi 3: Oyun ve Sanal Gerçeklik (VR/AR) Etkileşimleri

Senaryo: VR/AR oyunlarında veya sanal simülasyonlarda daha sürükleyici bir deneyim arayan kullanıcılar. Geleneksel fiziksel kumandaların yerine, kendi ellerini kullanarak sanal nesnelerle doğrudan etkileşime geçmek istiyorlar.

  • Uygulama: Kamera tabanlı el izleme, VR/AR başlıklarına entegre edilebilir veya harici kameralar aracılığıyla kullanılabilir. Sanal dünyada bir kapıyı açmak için elinizi uzatıp döndürmek, bir nesneyi almak için sıkıştırma jesti yapmak veya sanal menülerde gezinmek için parmağınızı kaydırmak gibi eylemler programlanabilir.
  • Fayda: Deneyimin gerçekçiliğini ve sürükleyiciliğini artırır. Daha doğal ve sezgisel bir kullanıcı arayüzü sunar, öğrenme eğrisini azaltır ve fiziksel kumanda bağımlılığını ortadan kaldırır.

İleri Düzey Optimizasyonlar ve İpuçları

  1. Çoklu El Desteği ve El Ayrımı: MediaPipe, varsayılan olarak birden fazla el tespit edebilir. Sol ve sağ elleri ayırt ederek her ele farklı işlevler atayabilirsiniz. Örneğin, sol el navigasyon için, sağ el tıklama ve sürükleme için kullanılabilir. Bu, kontrolü daha zengin ve karmaşık hale getirebilir.

    
    # handLms.multi_handedness ile elin sol mu sağ mı olduğunu tespit edebilirsiniz
    for hand_idx, hand_landmarks in enumerate(results.multi_hand_landmarks):
        handedness_label = results.multi_handedness[hand_idx].classification[0].label
        if handedness_label == 'Left':
            # Sol el için işlemler
        elif handedness_label == 'Right':
            # Sağ el için işlemler
                

  2. Jest Tanıma Geliştirme: Basit parmak açma/kapama kontrolünün ötesine geçerek, makine öğrenimi modelleri (örneğin, Scikit-learn ile SVM veya küçük bir sinir ağı) kullanarak daha karmaşık jestleri tanıyabilirsiniz. Elin açıları, parmakların bükülme oranları ve el noktaları arasındaki dinamik değişiklikler, farklı jestleri (yumruk, V işareti, ok işareti vb.) tanımak için özellik olarak kullanılabilir.
  3. Hassasiyet ve Gecikme Ayarı: smoothening faktörünü ve frame_reduction alanını optimize etmek, fare hareketinin akıcılığı ve doğruluğu üzerinde büyük etkiye sahiptir. Daha düşük smoothening, daha hızlı ancak daha titrek hareket anlamına gelirken, daha yüksek değerler daha pürüzsüz ama daha yavaş tepki verir. Kameranın konumu, ışıklandırma ve arka plan gibi çevresel faktörler de performansı etkiler.
  4. Gelişmiş Geri Bildirim: Sadece ekranda çizim yapmak yerine, sesli geri bildirimler (tıklama sesi gibi) veya ekran üzerinde küçük animasyonlar (bir butona tıklanınca renginin değişmesi) kullanıcı deneyimini zenginleştirebilir.
  5. Kalibrasyon Sistemi: Kullanıcının el boyutlarına veya tercih ettiği hareket alanına göre dinamik olarak ayarlanabilen bir kalibrasyon modülü eklemek, sistemin daha geniş bir kullanıcı kitlesi tarafından kullanılabilmesini sağlar. Örneğin, kullanıcıdan elini belirli bir alanda hareket ettirmesi istenerek bu alanın min/max koordinatları otomatik olarak tespit edilebilir.
Uzman İpucu: El izleme sisteminizin performansını artırmak için güçlü bir kamera kullanmaya özen gösterin. Yetersiz ışık koşulları veya düşük çözünürlüklü kameralar, MediaPipe'in el tespiti doğruluğunu önemli ölçüde düşürebilir. Ortam ışığını optimize etmek, daha stabil bir deneyim sağlayacaktır.

Bu ileri düzey teknikler ve gerçek dünya senaryoları, projenizin potansiyelini anlamanıza ve onu daha işlevsel, kullanıcı dostu ve çeşitli uygulamalara adapte edilebilir hale getirmenize yardımcı olacaktır. Unutmayın, bir projenin gerçek değeri, onun problem çözme yeteneğinde yatar.

Sıkça Karşılaşılan Sorunlar ve Çözüm Önerileri Nelerdir?

Her teknoloji projesinde olduğu gibi, el hareketiyle fare kontrol sistemi geliştirirken de bazı zorluklarla karşılaşmak olasıdır. Ancak, bu sorunların çoğu doğru yaklaşımlarla çözülebilir. İşte sıkça karşılaşılan bazı sorunlar ve bunlara yönelik çözüm önerileri:

  1. Kamera Tespiti ve Akış Sorunları:

    • Sorun: cv2.VideoCapture(0) kamerayı açamıyor veya "Kamera açılamadı" hatası veriyor.
    • Çözüm:
      • Kameranın bilgisayarınıza doğru şekilde bağlı olduğundan ve sürücülerinin güncel olduğundan emin olun.
      • Kameranın başka bir uygulama (Zoom, Skype, OBS vb.) tarafından kullanılmadığından emin olun.
      • Farklı kamera indekslerini deneyin: cv2.VideoCapture(1), (2) vb. Bazı sistemlerde birden fazla kamera olabilir.
      • Gerekirse bilgisayarınızı yeniden başlatın.
      • Sanallaştırma ortamında (VMware, VirtualBox) çalışıyorsanız, USB kamera geçiş ayarlarını kontrol edin.
  2. Düşük FPS (Kare Hızı) ve Gecikme:

    • Sorun: Fare imleci gecikmeli hareket ediyor veya ekran akıcı değil.
    • Çözüm:
      • Bilgisayarınızın CPU ve GPU kullanımını kontrol edin. MediaPipe ve OpenCV işlemci yoğun uygulamalar olabilir.
      • Daha düşük kamera çözünürlüğü kullanmayı deneyin: cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) ve cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480).
      • Kodu daha verimli hale getirin. Özellikle döngü içinde gereksiz hesaplamalardan kaçının.
      • smoothening faktörünü ayarlayın. Çok yüksek değerler gecikmeyi artırabilir.
      • Arka planda çalışan diğer uygulamaları kapatın.
  3. Yanlış Jest Algılama veya Titrek İmleç Hareketi:

    • Sorun: Sistem yanlış tıklamalar yapıyor, sürüklemeyi yanlış algılıyor veya fare imleci çok titrek.
    • Çözüm:
      • Işıklandırma: İyi ve eşit bir ışıklandırma sağlayın. Gölgeler veya düşük ışık, el izleme doğruluğunu düşürebilir. Kameraya doğrudan güneş ışığı gelmemesine dikkat edin.
      • Arka Plan: Düz, sade ve kontrastı yüksek bir arka plan kullanın. Karmaşık arka planlar MediaPipe'in el tespiti algoritmalarını zorlayabilir.
      • Eşik Değerleri: Jest algılama için kullandığınız mesafe eşiklerini (örneğin tıklama için length < 40) kendi elinize ve kamera mesafenize göre ayarlayın. Bu değerler kişiden kişiye değişebilir.
      • Filtreleme: İmleç hareketini daha da yumuşatmak için Kalman filtresi gibi daha gelişmiş filtreleme tekniklerini deneyebilirsiniz, ancak bu ek karmaşıklık getirecektir.
      • Kamera Mesafesi: Elinizi kameradan ne çok uzak ne de çok yakın tutun. Optimal bir mesafeyi deneyerek bulun.
  4. PyAutoGUI Kontrol Sorunları:

    • Sorun: PyAutoGUI fareyi kontrol etmiyor veya beklenmedik şekillerde davranıyor.
    • Çözüm:
      • Modül İçe Aktarımı: import pyautogui'nin doğru bir şekilde yapıldığından emin olun.
      • İzinler: macOS gibi bazı işletim sistemlerinde PyAutoGUI'nin fare ve klavyeyi kontrol etmesi için güvenlik ayarlarından "Erişilebilirlik" (Accessibility) izni vermeniz gerekebilir.
      • Çözünürlük ve Ölçeklendirme: Kamera koordinatlarını ekran koordinatlarına dönüştürürken kullanılan ölçeklendirme mantığınızı iki kez kontrol edin. map_range fonksiyonunun doğru çalıştığından emin olun.
      • Kill Switch: Geliştirme sırasında PyAutoGUI'nin sürekli kontrolü ele almasını engellemek için, ekranın bir köşesine fareyi götürdüğünüzde programı durduran veya belirli bir tuşa bastığınızda çıkan bir mekanizma (pyautogui.FAILSAFE = True) kullanın.
  5. Ortam ve Kütüphane Bağımlılıkları:

    • Sorun: Kütüphane yüklenemiyor veya sürüm uyumsuzlukları yaşanıyor.
    • Çözüm:
      • Sanal bir ortam (venv veya conda env) kullanmak, farklı projeler için bağımlılık çakışmalarını önler.
      • pip install komutlarını doğru yazdığınızdan emin olun (örneğin, opencv-python değil opencv).
      • Python ve kütüphane sürümlerinin uyumlu olduğundan emin olun. Gerekirse kütüphaneleri güncelleyin: pip install --upgrade opencv-python mediapipe pyautogui.

Bu sorun giderme adımları, geliştirme sürecinde karşılaşabileceğiniz çoğu engeli aşmanıza yardımcı olacaktır. Sabır ve deneme yanılma, bu tür projelerde başarılı olmanın anahtarıdır. Her sorunu bir öğrenme fırsatı olarak görün ve sisteminizi her adımda daha sağlam hale getirin.

Sonuç: Gelecekte El Hareketi Kontrolü Nereye Gidiyor?

Bu kapsamlı rehber boyunca, Python kullanarak kendi el hareketiyle fare kontrol sistemimizi adım adım nasıl inşa edeceğimizi öğrendik. Kamera erişiminden temel el izlemeye, fare hareketlerinin kodlanmasından tıklama ve sürükleme jestlerinin entegrasyonuna kadar birçok önemli konuyu ele aldık. Görüldüğü üzere, modern bilgisayar görüşü kütüphaneleri sayesinde, bir zamanlar bilim kurgu olarak görülen bu tür etkileşimli sistemleri geliştirmek artık çok daha erişilebilir hale geldi.

El hareketiyle kontrol, yalnızca bir teknolojik merak olmanın ötesinde, kullanıcı deneyimini zenginleştirme, erişilebilirliği artırma ve dijital etkileşimimizi daha doğal hale getirme potansiyeli taşıyor. Engelli bireyler için sunduğu bağımsızlık, eğitim ve sunum ortamlarında yarattığı dinamizm ve VR/AR gibi gelecek nesil platformlardaki rolü, bu teknolojinin ne kadar değerli olduğunu kanıtlıyor. Şüphesiz ki, bu alandaki gelişmeler hızla devam edecek ve yakın gelecekte hayatımızın birçok alanına entegre olacak.

Gelecekte, el hareketiyle kontrol sistemlerinin daha hassas, daha düşük gecikmeli ve daha adaptif hale gelmesini bekleyebiliriz. Gelişmiş makine öğrenimi modelleri sayesinde, çok daha karmaşık ve kişiye özel jestler tanınabilecek, hatta farklı kültürel jestler bile sistemlere entegre edilebilecek. Ayrıca, giyilebilir teknolojilerle (akıllı saatler, özel eldivenler) entegrasyon, bu sistemleri daha taşınabilir ve her ortamda kullanılabilir kılabilir. Kameraların daha küçük, daha güçlü ve her yere entegre edilebilir hale gelmesiyle, "ekransız" etkileşimler veya artırılmış gerçeklik arayüzleri, el hareketleriyle kontrolün ana sahnelerinden biri haline gelecektir. Bu, bilgisayarlarla olan ilişkimizi temelden değiştirecek ve dijital dünyaya bakış açımızı yeniden şekillendirecektir.

Kendi projenizi geliştirirken edindiğiniz bilgiler, size sadece bir fare kontrolörü inşa etme becerisi değil, aynı zamanda bilgisayar görüşü ve yapay zeka alanında sağlam bir temel kazandırdı. Bu temel üzerine, çok daha karmaşık ve yenilikçi projeler inşa edebilirsiniz. Unutmayın, teknolojinin sınırlarını zorlamak ve yeni etkileşim yolları keşfetmek tamamen sizin yaratıcılığınıza kalmış bir süreçtir.

Sıkça Sorulan Sorular (SSS)

  1. Bu sistem sadece Python ile mi çalışır?

    Evet, bu rehberde oluşturduğumuz sistem Python ve ilgili kütüphanelerle çalışır. Ancak, bilgisayar görüşü ve hareket algılama konseptleri diğer programlama dillerinde (C++, Java, JavaScript) de uygulanabilir. MediaPipe'in farklı platformlar için de SDK'ları bulunmaktadır.

  2. Hangi işletim sistemlerinde kullanılabilir?

    PyAutoGUI ve OpenCV kütüphaneleri Windows, macOS ve Linux gibi popüler işletim sistemlerinde desteklenir. Dolayısıyla, bu sistemi bu işletim sistemlerinin herhangi birinde çalıştırabilirsiniz. macOS'ta PyAutoGUI için güvenlik izinleri gerekebilir.

  3. Herhangi bir webcam ile çalışır mı?

    Evet, çoğu standart USB webcam veya dahili laptop kamerası ile çalışır. Ancak, daha iyi performans ve doğruluk için yüksek çözünürlüklü (HD veya Full HD) ve iyi ışık performansına sahip bir kamera kullanılması tavsiye edilir.

  4. Sistemin hassasiyetini nasıl artırabilirim?

    Hassasiyeti artırmak için şu yöntemleri deneyebilirsiniz: smoothening değerini düşürmek (daha hızlı tepki, daha az yumuşatma), kamera çözünürlüğünü artırmak (daha fazla piksel detayı), daha iyi ışıklandırma sağlamak, kamera mesafesini optimize etmek ve jest tanıma eşiklerini daha dar ayarlamak.

  5. Bu projeyi ticari amaçla kullanabilir miyim?

    Kullanılan kütüphanelerin (OpenCV, MediaPipe, PyAutoGUI) lisanslarına bağlı olarak değişir. Çoğu açık kaynak lisans (örn. Apache 2.0, MIT) ticari kullanıma izin verir, ancak yine de her kütüphanenin lisans koşullarını dikkatlice incelemeniz önemlidir. Kendi yazdığınız kodun lisanslaması tamamen size aittir.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.