En Temel Yapılarla Görüntü Tespiti (Image Detection — Object Detection)
kodlar en altta
OpenCV, bilgisayarla görme, makine öğrenimi ve görüntü işleme için çok büyük bir açık kaynak kitaplığıdır. Günümüz sistemlerinde çok önemli olan gerçek zamanlı İşlemlerde önemli bir rol oynamaktadır. Bunu kullanarak, nesneleri, yüzleri ve hatta bir insanın el yazısını tanımlamak için görüntüleri ve videoları işleyebilirsiniz. Şimdi sizlerle temelden bize sunulan özellikleri inceleyeceğiz.
Nesne Algılama, görüntü ve videolardaki nesnelerin örneklerini kütüphaneden aldığı verilerle karşılaştırarak tanımlamasıdır.
Bilgisayarla görme, görüntü işleme ve derin öğrenmeyle ilgili bir bilgisayar teknolojisidir. Bu makalede “haar” basamakları(Cascades) olarak bilinen bir özellik kullanarak nesne algılama yapacağız.
Positive images — Bu görüntüler, sınıflandıran kişinin tanımlamasını istediğimiz görüntüleri içerir.
Negative Images — Algılamak istediğimiz nesneyi içermeyen diğer her şeyin görüntüleri.
Şimdi Python ile projemize başlayalım. Ben cmd üzerinden işlemlerimi yapacağım siz isterseniz dosyalarınızı kendiniz oluşturabilirsiniz.
öncelikler komut satırına - > cd /
yani kök klasöre gidiyoruz bende kök klasör C:
C:\>mkdir opencv_detect
opencv_detect isimli dosyamı oluşturdum. içerisine girdikten sonra kodlamalara başlayacağım.
C:\>cd opencv_detect
şimdi gerekli kütüphanelere bakalım.
pip install opencv-python
kurduktan sonra bunu da kuruyoruz.
pip install matplotlib
Cascade dosyasını indirmek için tıklayın.
Yapacağımız projede resim üzerinden gideceğimiz için XML dosyasını ve PNG görüntüsünü Python komut dosyanızla aynı klasöre koyun.
import cv2from matplotlib import pyplot as plt# Resmimizi Aldık, img değişkenine koydukimg = cv2.imread("resim.jpg")# OpenCV, görüntüleri BRG olarak açar
# Ancak RGB olarak işlem yapmamız gerekir
# Gri tonlamaya da ihtiyacımız varimg_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# Çevreyi Oluşturduk
# resimi alıp imsho ile gösterdikplt.subplot(1, 1, 1)plt.imshow(img_rgb)plt.show()
kod çıktısı :
Şimdi nesne tespiti için kodlarımızı tasarlayacağız
import cv2
from matplotlib import pyplot as plt# Resmimizi Aldık, img değişkenine koyduk
img = cv2.imread("resim.jpg")# OpenCV, görüntüleri BRG olarak açar
# Ancak RGB olarak işlem yapmamız gerekir
# Gri tonlamaya da ihtiyacımız varimg_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# MinSize kullanın çünkü
# küçük ölçekli verilerde gecikme ve durma fazla olmaz
stop_data = cv2.CascadeClassifier('stop_data.xml')found = stop_data.detectMultiScale(img_gray,
minSize =(20, 20))# İşaret yoksa hiçbir şey yapma
amount_found = len(found)if amount_found != 0:
# Resimde birden fazla işaret olabilir
for (x, y, width, height) in found:
# Tanınan her şeklin etrafına yeşil bir dikdörtgen çizeriz
cv2.rectangle(img_rgb, (x, y),
(x + height, y + width),
(0, 255, 0), 5)
# Resmin ortamını oluşturur ve gösterir
plt.subplot(1, 1, 1)
plt.imshow(img_rgb)
plt.show()
Kod Çıktısı :
Algoritmamızı biraz daha değiştirip görüntü içerisindeki bir nesneyi yakalamak adına kendi basit algoritmamızı geliştirelim. Yani lokalde olan bir verimizi fotoğrafımızda arayarak resim içinden onu bulmaya çalışalım
Örneğin kalabalık içinden bir adamı canlı olarak arıyoruz ve anlık resim taraması ile kişiyi takip edeceğiz bunun için bize kişinin özellikleri ve daha önce onun adına kayıt edilmiş veri bankası gerekiyor.
biz bu noktada en temel yöntemi kullanacağız resim içinden seçtiğimiz kareyi bulmasını isteyeceğiz onun için kodlarımıza bakalım
kütüphane olarak cv2 ve numpy yeterli
import cv2
import numpy as np
Şimdi aradığımız kareyi seçiyoruz yani şekil aranan isimli yukarıdaki resim
aranan_resim= cv2.imread('images/a.jpg')
cv2.imshow("Aranan Resim", aranan_resim)
cv2.waitKey(0)
Aranan karemize uygun bir kutu çiziyoruz
height, width = aranan_resim.shape[:2]
Şimdi ise aranılan kareyi aradığımız ana resmi sisteme tanımlayalım
aranilan_resim_org= cv2.imread('images/aa.jpg')
cv2.imshow("Original Image", aranilan_resim_org)
cv2.waitKey(0)
Resimler üzerinde tarama ve scale için gray scale uygulayalım
gray_template = cv2.cvtColor(aranan_resim, cv2.COLOR_BGR2GRAY)
gray_original = cv2.cvtColor(aranilan_resim_org, cv2.COLOR_BGR2GRAY)
Aranılan resim ve aranan resim için karşılaştırma işlemi yapalım
match = cv2.matchTemplate(gray_original, gray_template, cv2.TM_CCOEFF)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(match)
Bulduğumuz alanı büyük resimde kırmızı içerisine çerçeveye alalım
top_left = max_loc
bottom_right = (top_left[0]+height, top_left[1]+width)
cv2.rectangle(aranilan_resim_org, top_left, bottom_right, (0,0,255), 5)
Son olarak ekrana bulduğumuz alanı koyalım :
cv2.imshow("Bulunan Kare", aranilan_resim_org)
cv2.waitKey(0)cv2.destroyAllWindows()
Kod Çıktımız :
İlk olarak ekrana aradığımız kare geldi ve bunu kapatalım yeni frame için
bunu kapattığımızda ise ana resmimiz ekrana geldi
son olarak bu resmi kapattığımızda ise işaretlenmiş olarak aradığımız alanı ekrana verdik