Python programı ile kamera üzerinde basit bir şekilde nesne tanımlamak ve o nesneyi tespit ettirmek için uygulayacağımız yol şu şekilde
- Nesnenin fotoğrafı
- Fotoğrafın proje içine atılması
- Gerekli kodların yazılımı
OpenCV kütüphanesini kullanarak yapacağımız bu projede öncelikle nesneyi tanımlamanız gerekmektedir. Bu projemiz basit bir nesne takibi olduğu için daha çok prizmatik nesneler seçmeniz daha uygun olacaktır. İlerleyen zamanlarda daha detaylı projeler de ekleyeceğiz Biz bu projede cep telefonumuzun tanımlanmasını istiyoruz.
Bu yüzden öncelikle cep telefonun bir fotoğrafını çektik ve bunu kaydettik
Bu nesneyi program dosyamıza sürükle bırak yöntemi ile atıyoruz.
Ardından program kodlarımız yazıyoruz. Öncelikle bir kameramızı çalıştıralım. Bu programı yazıp çalıştırdığınızda kameranızın çalıştığını göreceksiniz. “q” tuşuna basana kadar görüntü açık kalmaya devam edecek.
import cv2
import numpy as np
kamera = cv2.VideoCapture(0)
while True:
ret,kare= kamera.read()
cv2.imshow("ekran",kare)
if cv2.waitKey(25) & 0xFF == ord("q"):
break
kamera.release()
cv2.destroyWindow()
Kodlar ile ilgili açıklamalar
ret parametresi kameranın çalışıp çalışmadığı ile ilgili true false değeri döndürüyor
kare parametresi değşkenine de
Şimdi ise nesne tanımlamak için gerekli kodlarımızı girelim
import cv2
import numpy as np
kamera = cv2.VideoCapture(0)
while True:
ret,kare = kamera.read()
#gri'ye çeviririiz görüntüyü çünkü tek renk olursa sadece 0-255 arası tarama yapar ve işler kolaylaşır
gri_kare = cv2.cvtColor(kare,cv2.COLOR_BGR2GRAY)
nesne = cv2.imread("nesne.jpg",0)
# "0" diyerek gri rengini aramasını sağlyoruz
w,h = nesne.shape
#ilk degeri genişlik ikinci yükseklik
res = cv2.matchTemplate(gri_kare,nesne,cv2.TM_CCOEFF_NORMED) #bu tarama nın yapıldğı komut
esik_degeri = 0.8
loc = np.where(res>esik_degeri)
for n in zip(*loc[::-1]):
cv2.rectangle(kare,n,(n[0]+h,n[1]+w),(0,255,0),2) #burada benim nesnemi buldugu yerleri kare içine alıyor
cv2.imshow("ekran",kare)
if cv2.waitKey(25) & 0xFF == ord("q"):
break
kamera.release()
cv2.destroyWindow()
Burada öncelikle resmi gri’ye çeviriyoruz. Çünkü resmi griye çevirince nesneyi bulmak daha holay oluyor. yani milyonlarca renk arasından arama yapmaktansa sadece 0-255 tonlama arası bir arama yapıyor program yorulmuyor.
Yukarıda açıklamalarla birlikte kodları yazmaya çalıştım. Açıklamasız sade hali ise aşağıdaki gibidir herhangi bir farkı yoktur.
import cv2
import numpy as np
kamera = cv2.VideoCapture(0)
while True:
ret,kare = kamera.read()
gri_kare = cv2.cvtColor(kare,cv2.COLOR_BGR2GRAY)
nesne = cv2.imread("nesne.jpg",0)
w,h = nesne.shape
res = cv2.matchTemplate(gri_kare,nesne,cv2.TM_CCOEFF_NORMED) #bu tarama nın yapıldğı komut
esik_degeri = 0.8
loc = np.where(res>esik_degeri)
for n in zip(*loc[::-1]):
cv2.rectangle(kare,n,(n[0]+h,n[1]+w),(0,255,0),2)
cv2.imshow("ekran",kare)
if cv2.waitKey(25) & 0xFF == ord("q"):
break
kamera.release()
cv2.destroyWindow()
Esik degeri gerçekten önemli bir değer. Eğer eşik değerini azaltırsak bir çok yerde kareler çıktıgını görüyoruz veya artırırsak da hatalar buluyoruz. Bu değeri deneme yanılma yöntemiyle bulabiliriz.
Yine program üzerinde farklı bi resim tanımlaması yapmak istiyorsak hiçbir şey değiştirmeden, yeni bir resim (prizmatik) tanımlayarak yapabiliriz.