top of page

Python'da OpenCV kullanarak Nesne Algılama


Python'da OpenCV kullanarak Nesne Algılama

Yazıma başlamadan önce ilk olarak "Python nedir?" sorusu ile başlamak istiyorum.



Python

Python Nedir?


Python, yüksek seviyeli, genel amaçlı, yorumlanabilir bir programlama dilidir. Guido van Rossum tarafından 1991 yılında geliştirilmeye başlanmıştır. Python, basit ve okunabilir sözdizimiyle bilinir ve birçok farklı alanda kullanılır, örneğin web geliştirme, veri analizi, yapay zeka, bilimsel hesaplama, oyun geliştirme ve sistem yönetimi gibi alanlarda yaygın olarak kullanılmaktadır.


Python'un dinamik tip sistemine sahip olması, hızlı prototipleme ve kodun kolay anlaşılabilirliği gibi avantajlar sağlar. Aynı zamanda, geniş bir standart kütüphane setine sahiptir ve birçok üçüncü taraf kütüphane ve aracı desteği vardır, bu da Python'u çeşitli problemleri çözmek için güçlü bir araç haline getirir.






 


OpenCV nedir?



OpenCV


OpenCV (Open Source Computer Vision Library), bilgisayar görüsü ve görüntü işleme uygulamaları için kullanılan ücretsiz bir kütüphanedir. Başlangıçta Intel tarafından geliştirilmiştir ve şu anda BSD lisansı altında açık kaynak olarak sunulmaktadır. OpenCV, birçok farklı platformda (Windows, Linux, macOS, Android vb.) ve programlama diliyle (C++, Python, Java, MATLAB vb.) kullanılabilen geniş kapsamlı bir kütüphanedir.





OpenCV, temel görüntü işleme işlevlerinin yanı sıra, nesne algılama, yüz tanıma, hareket algılama, stereo görüntüleme, kameralı takip gibi gelişmiş işlevler de sağlar. Bu özellikler sayesinde, endüstriyel otomasyon, tıp, güvenlik sistemleri, otomotiv sektörü, robotik ve yapay zeka gibi birçok alanda kullanılmaktadır. OpenCV, kullanıcıların görüntüleri işlemelerine, analiz etmelerine ve özellik çıkarmalarına olanak tanır, bu da birçok uygulama için temel bir bileşendir.


Python'da OpenCV kullanarak Nesne Algılama


Üstten önceden bilgi verdiğimize göre şimdi asıl konumuza dönebiliriz. Biz ne yapacağız? Python programlama dilince OpenCV kütüphanesini kullanarak basit (temel) nesne algılama işlemini gerçekleştireceğiz. Fakat bunun için önce hangi cismi algılamak istediğimi seçmeliyiz.

Bunun için Cipsleri seçmeye ne dersiniz? Tamam üründe seçtiğimize göre adım adım işlemlere koyulalım.


Adım 1: Ne yapmak istediğimizi kararlaştıralım

  • Nesne algılama yani kamera bizim kayıtlı cips verilerimize göre hangi cips olduğunu anlayıp ekrana yazdıracak.


Adım 2: Algılamasını istediğimiz şeyi kararlaştıralım

  • Biz Cips seçtik

Adım 3: Algılamasını istediğimiz ürünlerin bir çok açıdan görselini çekip bir dosyada saklayalım (Veri havuzu) Çünkü yazdığımız kod için karşılaştırma verisini oradan alacağız. bu sayede kod şunu yapacak kamera bir cisim algıladığında daha önce dosyada tuttuğumuz veriler ile karşılaştıracak. Eğer benzerlik var ise hangisi olduğunu yazacak.


Python'da OpenCV kullanarak Nesne Algılama

Adım 4: Kütüphaneleri yükleyelim

import cv2
import os
import numpy as np

Adım 5: Kodu bitirelim ve son halini test edelim





# Bu Orijinal versiyonu değil Demo versiyonudur, hata payı vardır ve geliştirilmeye açıktır. O yüzden amaç eğitim içindir ve resmi yerlerde kullanmayınız.

import cv2
import os
import numpy as np

def find_and_print_similarities(camera, image_folder):
    # Resim klasöründeki tüm .jpg uzantılı dosyaların yollarını alıyoruz
    image_paths = [os.path.join(image_folder, file) for file in os.listdir(image_folder) if file.endswith(".jpg")]

    matched_images = set()  # Eşleşen resim dosyalarının adlarını saklamak için bir küme oluşturuyoruz

    while True:
        ret, frame = camera.read()  # Kameradan bir kare alıyor - okuyoruz
        if not ret:
            break

        frame_height, frame_width, _ = frame.shape  # Kare boyutlarını al

        # Ekran genişliği ve yüksekliği
        display_width, display_height = 640, 480

        # Kareyi istenilen boyuta yeniden boyutlandır
        frame_resized = cv2.resize(frame, (display_width, display_height))

        # Daha iyi eşleme için yeniden boyutlandırılan kareyi gri tonlamalı hale getiriyoruz
        frame_gray = cv2.cvtColor(frame_resized, cv2.COLOR_BGR2GRAY)

        match_found = False

        for image_path in image_paths:
            # Şablon eşleme için resmi gri tonlamalı olarak okuyoruz
            template = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)

            # Şablonu yeniden boyutlandırılmış kare boyutuna getiriyoruz
            template_resized = cv2.resize(template, (display_width, display_height))

            # Şablon eşleme işlemini gerçekleştiriyoruz
            res = cv2.matchTemplate(frame_gray, template_resized, cv2.TM_CCOEFF_NORMED)
            threshold = 0.1  # Eşleşme eşiğini belirliyoruz, ben düşük yaptım
            loc = np.where(res >= threshold)

            for pt in zip(*loc[::-1]):
                match_found = True
                image_name = os.path.basename(image_path)
                if image_name not in matched_images:
                    # Eğer eşleşen resmin adı daha önce yazdırılmadıysa
                    print("Bulundu:", image_name)
                    matched_images.add(image_name)

        if not match_found:
            print("Bulunamadı")

        # Yeniden boyutlandırılmış kareyi gösteriyoruz
        cv2.imshow("Kamera", frame_resized)

        # Kullanıcı 'q' tuşuna basarsa döngüyü sonlandırma işlemi yapıyoruz
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    # Kamerayı sonlandırma
    camera.release()
    # Tüm pencereleri kapatma işlemi
    cv2.destroyAllWindows()


if __name__ == "__main__":
    # Yerel kameradan görüntü almak için 0'ı kullanabilirsiniz
    camera = cv2.VideoCapture(0)
    image_folder = "images/"  # Resim klasörü yolunu güncelleyebilirsiniz, ben böyle yaptım
    find_and_print_similarities(camera, image_folder)



Python'da OpenCV kullanarak Nesne Algılama mantığı aslında bu kadar kolay. ilerleyen aşamalarda daha kusursuz veri vermesi adına farklı makine eğitim modelleri kullanılabilir. Fakat algoritma mantığı oluşturmak için bu basit örnek işe yarayacaktır. Tekrar dile getiriyorum bu yukarıdaki kod Demo içindir, hata payı yüksek olabilir ve mantığı anlatmak için oluşturulmuştur. Daha ilerisi olan proje, geliştirme aşamasında olduğundan kaynaklı (gizli) onu paylaşmadım.


Kodlar ve görselleri Github adresimden indirmek isterseniz:



Veya




Referans:



Görsel adresleri:


bottom of page