
Python ile OpenCV Günlükleri-3 / Mouse ile Resim üzerinde Şekil Çizme – Mouse Event Handler
iyi günler python türkiye ailesi
Yazı dizimize kaldığımız yerden devam ediyoruz. En son yazımızda Opencv ile resim dosyası okuma ve yazma işlemlerini anlatmıştım
Aslında yazı dizilerime sırasıyla resim işleme, video işleme , mouse Event ile şekil çizim vs. şeklinde devam edecektim
Bugün değişiklik yapıp Mouse Event işlemlerini öne aldım .Bu yazımda Mouse Eventlarını yakalayıp, yapılan event’a göre resim üzerine şekil çizme konusuna değineceğim
setMouseCallback() fonksiyonu
Tüm mouse eventlarını handle edeceğimiz, her event’a mouse’ın x, y koordinat bilgilerini döndüren fonksiyondur. Mouse event; sol click, sağ click, sol double click, sağ double click, mouse up vb. değişkenlik göstermektedir
Senaryo 1: Bigisayarımızdaki bir resmi show edip, mouse sol tuş double-click yaptığımız yerde(x,y ) çember çizen bir uygulama
öncelikle resim dosyasını okuyalım :
1 |
resim = cv2.imread('dybala.jpg', 1) |
Pencere oluşturalım
1 |
cv2.namedWindow('resim') |
şimdi ise mouse event yakalayacağımız fonksiyonu yazalım .
1 |
cv2.setMouseCallback('resim', daire_ciz) # Pencere adı ve event olduğunda çağıracağımız fonksiyonun adını yazıyoruzsd |
Event olduğunda Çağıracağımız fonksiyon
1 2 3 |
def daire_ciz(event, x, y, flags, param): if event == cv2.EVENT_LBUTTONDBLCLK: cv2.circle(resim, (x, y), 50, (255, 0, 0), 1) |
- Mouse sol tuşu double-click yapıldığında tıklanılan yere (x,y) 50 yarıçaplı çember çizer . Son parametre olan 1 çizgi kalınlığıdır. -1 değeri verirseniz daire çizer
şimdi bir döngü oluşturalım ve resmimizi show edelim. Kullanıcı ESC tuşuna basana kadar döngü sürsün.
1 2 3 4 5 6 |
while True: cv2.imshow('resim', resim) if cv2.waitKey(10) & 0xFF == 27: break cv2.destroyAllWindows() |
Senaryo 2: Bilgisayarımızdaki bir resmi show edip, kullanıcı sol tuş double-click yaptığında çember, sağ tuş double click yaptığında dörtgen çizelim
resmimizi okuma, winname ve event handler fonksiyonu
1 2 3 |
resim = cv2.imread('dybala.jpg', 1) cv2.namedWindow('resim') cv2.setMouseCallback('resim', daire_ciz) |
Mouse event’ı olduğunda çağrılacak fonksiyonu yazalım
1 2 3 4 5 6 7 8 9 |
def daire_ciz(event, x, y, flags, param): global onceki_x, onceki_y if event == cv2.EVENT_LBUTTONDBLCLK: cv2.circle(resim, (x, y), 50, (255, 0, 0), 1) onceki_x, onceki_y = x, y elif event == cv2.EVENT_RBUTTONDBLCLK: cv2.rectangle(resim, (onceki_x, onceki_y), (x, y), (0, 255, 0), 1) |
Yukarıdaki kodlarda değinmemiz gereken önemli husus var
Bildiğiniz üzere Opencv de çember çizerken sadece çizime başlanılacak noktanın (x,y) koordinat bilgilerini belirtmek kafi idi. Ama durum dörtgen çizerken değişiyor. Dörtgen çizerken rectangle() fonksyonu koordinat olarak sol üst köşenin koordinatını ve sağ alt köşenin koordinatını belirtmemizi bekler
Ben de random değerlerden kaçarak, global x,y değişkeni tanımladım. Bu değişkenlere en son çizilen çemberin x,y bilgilerini atadım. Böylece eğer kullanıcı sağ tuş double click yaparsa, sol üst koordinatı önceki çemberin koordinatı, sağ alt koordinatı ise o anda sağ tuş double click yaptığımız yerin koordinatı olan dörtgen çizecek
1 2 3 4 5 6 |
while True: cv2.imshow('resim', resim) if cv2.waitKey(10) & 0xFF == 27: break cv2.destroyAllWindows() |
Kaynak Kodu : https://github.com/farcompen/Opencv-drawing-with-mouse/blob/master/Mouse_Double_click.py
Bol pythonlu günler
Bir Cevap Yaz