OpenCV-Python Uygulamaları-4

Salı, Temmuz 11, 2017 , , 0 Comments

Kullanılan Sistem Özellikleri: Ubuntu 16.04 LTS, OpenCV 3.2, Python 3.5.2

Hedefler

OpenCV de mouse yardımı ile dinamik görüntü işleme uygulamaları
Kendi ilkel Paint uygulamamızı yapmak
Kullanılacak fonksiyonlar: cv2.setMouseCallback()

Örnek Basit Bir Uygulama


Bu örnek uygulamada; açılan panel üzerinde, çift tıklanılan herhangi bir noktada, bir daire çizen uygulama yapmayı öğreneceğiz.
İlk olarak bir mouse kontrol fonksiyonu oluşturmamız gerekmektedir. Tanımlı bu mouse fonksiyonu herhangi bir mouse ile yapabildiğimiz sol tık, sağ tık, çift sol veya sağ tıklama işlemlerine müsaade etmektedir. Tanımlı bu fonksiyonun bütün durumlarının listelendiği tabloya erişmek için aşağıdaki kodu Python terminalinde çalıştırmanız yeterlidir.

import cv2
events = [i for i in dir(cv2) if 'EVENT' in i]
print events

Mouse kontrol fonksiyonu özel bir formata sahiptir ve kullanımı neredeyse her zaman aynıdır. Tek fark fonksiyonun ne yapacağı ile ilgilidir. Bizim uygulamamızda mouse kontrol fonksiyonu, panel üzerinde çift tıkladığımız herhangi bir noktaya bir daire çizecek.
Hadi kodlara bir göz atalım. Kodun açıklamaları yorum şeklinde verilmiştir.

import cv2
import numpy as np
# Mouse kontrol fonkisyonu(mouse callback function)
def draw_circle(event,x,y,flags,param):
    if event == cv2.EVENT_LBUTTONDBLCLK:
        cv2.circle(img,(x,y),50,(255,0,0),-1)
# Siyah bir panel oluştur ve fonksiyonu birleştir
img = np.zeros((512,512,3), np.unit8)
cv2.nameWindow('image')
cv2.setMouseCallback('image',draw_circle)

while(1):
    cv2.imshow('image' , img)
    if cv2.waitKey(20) & 0xFF == 27:
        break
cv2.destroyAllWindows()
Oluşturduğunuz daireler ile çizeceğiniz şahaser sizin hayal dünyanızın genişliğine kalmış. Benim hayal gücüm mü??? işte aşağıda:

Haydi Biraz Daha Eğlenelim


Şimdi biraz daha eğlenceli bir uygulama yapalım. Bu uygulamada dikdörtgenler veya daireler çizeceğiz.(Seçtiğimiz mod'a bağlı olarak.)
-Bitti mi?
-Tabi ki hayır.
Aynı zamanda mouse sol tuşunu basılı tutup hareket ettirdiğimiz zaman görüntü oluşturarak ilerlemeye devam edecek. Bu uygulama bize bazı interaktif görüntü işleme işlerini anlamada ve onları oluşturmada açıklayıcı olacak.
import cv2
import numpy as np
drawing = False # Eğer mouse'a tıklandı ise: true 
mode = True # Eğer True ise, dikdörtgen çiz. 'm' tuşu mod değişimi için tanımlı
ix,iy = -1,-1
# Mouse kontrol Fonksiyonunu Çağırıyoruz(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)

Şimdi mouse kontrol fonksiyonunu(mouse callback function) OpenCV penceresine entegre edeceğiz. Ana döngüde mod değişimi için bir tuş atayacağız. Böylece istediğimiz şekli bir pencerede çizdirebileceğiz.

import cv2
img = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):
    cv2.imshow('image',img)
    k = cv2.waitKey(1) & 0xFF
    if k == ord('m'): # Mod değişimi tuşunun ataması 
        mode = not mode
    elif k == 27:
        break
cv2.destroyAllWindows()
Evet yukarıdaki kod bloğu yardımı ile kendi ilkel Paint programımızı yapmış bulunduk. Ben örnek olması için sadece daire ve dikdörtgen çizimini gösterdim. Daha önceki uygulamalarımızda düz çizgi, üçgen, poligon vb geometrik şekillerin işlenmesi uygulamasını yapmıştık. Eğer isterseniz siz diğer şekilleri programa entegre ederek tam teşekküllü bir Paint programına sahip olabilirsiniz.
 Çok popüler olan programların özünde bu kadar basit olması şaşırtıcı değil mi? Bu arada ikinci programın örnek çıktısı aşağıda. Ve evet biliyorum çok aptalca bir çizim.

Kaynak dosyaları ve Resimleri indirmek için: TIKLAYINIZ
Kaynakça:  http://docs.opencv.org/3.2.0/

0 yorum: