Yazıma başlamadan önce ilk olarak "Python nedir?" sorusu ile başlamak istiyorum.
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 (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.
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:
Bình luận