Boya frcas olarak fare
Boya Fırçası Olarak Fare¶
Hedefler¶
- OpenCV de fare olaylarını işlemeyi öğreneceğiz
- Bu fonksiyonu öğreneceğiz : cv2.setMouseCallback()
Basit Demo¶
Resim üzerinde iki defa tıkladığımız herhangi bir yere çember çizen basit bir uygulama
oluşturacağız.
İlk olarak bir fare olayı gerçekleştiğinde, bu olayı yakalamak için bir geri dönüş
fonksiyonu oluşturacağız. Bu olaylar herhangi bir fare ile ilgili olabilir örneğin; sol
düğme aşağı, sol düğme yukarı, sol düğme çift tıklama.
Her fare olayı için \(x,y\) kordinat noktalarını vermeliyiz, bu olaylar ve kordinat
bilgisi ile istediğimiz herşeyi yapabiliriz.
Mevcut tüm olayları listelemek için, Python terminalinde aşağıdaki kodu çalıştırın;
Fare geri çağırma fonkiyonu oluşturmak genel olarak heryerde aynı olan belirli bir
formata sahiptir. Sadece fonksiyonun yaptıkları farklıdır.Yani fare geri çağırma olayı
iki defa tıklandığında bir çember çizer.
Aşağıdaki kodu inceleyelim, açıklamalar kod satırlarında mevcut.
import cv2
import numpy as np
# fare geri çağırma fonksiyonu
def draw_circle(event,x,y,flags,param): # event parametresi gelen fare olayı,x,y kordinatlar
if event == cv2.EVENT_LBUTTONDBLCLK: # gelen fare olayı çift tıklama ise
cv2.circle(img,(x,y),100,(255,0,0),-1) # burada gelen x,y kordinat bölgesinde çember çiziyoruz
# siyah bir resim yaratalım,bir pencere ve fonksiyonu pencereye bağlayalım
img = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle) # burada dikkat ederseniz draw_circle()
# şeklinde vermiyoruz direk fonksiyonu gönderiyoruz
while(1):
cv2.imshow('image',img)
if cv2.waitKey(20) & 0xFF == 27:
break
cv2.destroyAllWindows()
Daha Fazla Gelişmiş Demo¶
Şimdi daha iyi bir uygulama yapacağız.Burada, dikdörtgen veya daireler çizeceğiz
\(seçtiğimiz modele bağlı olarak\), Paint uygulamasında yaptığımız gibi fareyi
sürükleyerek yapacağız.Yani fare geri cağırma fonksiyonu \( mouse callback function \)
olarak iki part mevcut.
Birincisi dikdörtgen çizmek için İkincisi çember çizmek için Bu özel örnek, nesne
izleme, resim parçalama gibi bazı etkileşimli uygulamaları oluşturma ve anlama konusunda
gerçekten yardımcı olacaktır.
import cv2
import numpy as np
drawing = False # fare sıkışmış ise True ( pressed )
mode = True # eğer True ise, dikdörtgen çizin. Eğriye geçmek için 'm' ye basın
ix,iy = -1,-1
# fare geri çağırma fonksiyonu ( mouse callback function)
def draw_circle(event,x,y,flags,param):
global ix,iy,drawing,mode
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix,iy = x,y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing == True:
if mode == True:
cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
else:
cv2.circle(img,(x,y),5,(0,0,255),-1)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
if mode == True:
cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
else:
cv2.circle(img,(x,y),5,(0,0,255),-1)
Sonra bu fare geri arama işlevini OpenCV penceresine bağlamalıyız. Ana döngüde,
dikdörtgen ve daire arasında geçiş yapmak için ‘m’ anahtarı için bir klavye bağlaması
ayarlamalıyız.