OpenCV ve Python İle Görüntü İşleme “Kamera Üzerinden Nesne Tespiti”

Python programı ile kamera üzerinde basit bir şekilde nesne tanımlamak ve o nesneyi tespit ettirmek için uygulayacağımız yol şu şekilde

  1. Nesnenin fotoğrafı
  2. Fotoğrafın proje içine atılması
  3. 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

Programın görüntü üzerinde arayacağı cep telefonumuz.

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.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir