Merhaba arkadaşlar,

Bugün sizlerle “OpenCV nedir?” sorusuna cevap verecek ve Python 3 kullanarak temel bazı geometrik sekillerin algılanması üzerine çalışacağız.
Dikkat etmemiz gereken en önemli konu paylaşılan kodların Python 3 te çalışmasıdır. Diğer Python versiyonlarında hatalar alırsınız.

Başlamadan önce size aşağıda kullandığımız bazı kütüphanelerden bahsedeceğim.

OpenCV Kütüphanesi:

import cv2 yazarak kodumuza dahil ettiğimiz kütüphanedir.
Tüm görüntü işleme işlemlerinde kullanılan ve bu alanın öncüsü bir kütüphanedir.
Kütüphaneyi oluşturan şirketleri(Intel, NVIDIA vb.) buradan görebilirsiniz.

Numpy Kütüphanesi:

import numpy as np yazarak kodumuza dahil ettiğimiz kütüphanedir.
-Peki, aklınıza bir soru takılmadı mı?

Neden OpenCV için import dememiz yeterli olduda burada as np ekledik?

-Bu sorunun cevabı aslında tek kelimeyle “Gelenek” tir. Numpy kütüphanesini kullanarak bu kütüphanenin kullanımının öğretilmesinde öncülük etmiş insanlar tarafından bu şekilde kullanılarak nesillere aktarılmıştır.

Peki bu as np ne yapar?

-O kütüphanenin bir fonksiyonunu çağırmak istediğinizde numpy.fonksiyonismi() yazmak yerine hem daha güzel görünmesi hemde daha kolay yazılması nedeniyle np.fonksiyonismi() şeklinde kullanmamızı sağlar.

Matplotlib Kütüphanesi:

from matplotlib import pyplot as plt yazarak kodumuza dahil ettiğimiz kütüphanedir.
Aslında çok geniş bir kullanım alanına sahip ve matematik ile ilgili tüm grafik çizimlerini yapabileceğiniz bir kütüphanedir. Python da özellikle bilimsel araştırma yapan insanların vazgeçilmezi konumundadır.

Time Kütüphanesi:

import time yazarak kodumuza dahil ettiğimiz kütüphanedir.
Bu kütüphane adı üstünde zamanla ilgili fonksiyonların bulunduğu python’ın içine gömülü(Python’ı indirdiğinizde beraberinde gelir) bir kütüphanedir.

Bu kütüphaneleri nasıl indirebilirsiniz?

Bu konu hakkında internette bir çok kaynak bulabilirsiniz. Bu işlemi bu yazının bir bölümü olarak anlatmak mümkün değil. İşletim sistemlerine ve kullandığınız kod editorüne göre bile değişkenlik gösteren bir olaydır.

 

Kodlarımızı incelemeden önce neden birden fazla kod bulunuyor neden tek kod ile yapamıyoruz diye düşünebilirsiniz. Tabi ki yapılabilir fakat bu kütüphanenin verimli kullanılmasında derin matematik hesapları işin içine giriyor. Bu sebeple bu alanda uzmanlaşana kadar amaçlar üzerine farklı kodlar yazmak ve bunları o işlem için kullanmak daha mantıklı bir harekettir.

OpenCV Nedir?

OpenCV günümüzde çok sık duyduğumuz Görüntü İşleme konusunun kütüphanesidir. İleri ki zamanlardada adından sıkça söz ettirecek bir konu olduğundan dolayı sizlere bu kütüphane hakkında öncelikle ön bilgiler verip bir kaç adet uygulamasını yaparak bu kütüphanenin ne işe yaradığını göreceğiz.

Kullanım Alanları:

Günümüzde Araç Plakalarını okumaktan tutunda, yüz tanıma sistemlerine kadar geniş bir kullanım alanı vardır. Kullanım alanlarından bazılarını aşağıda görebilirsiniz.

14 milyonun üzerinde indirilmiştir ve 47.000’den fazla kullanıcıya sahiptir. Başlıca kullanıcıları arasında Google, Yahoo, Microsoft, Intel, Sony, Honda, Toyota, IBM gibi büyük firmalar bulunmakadır. Bu kadar çok tercih edilmesinin en büyük nedeni açık kaynak olması ve yazılan kodun basit olmasıdır.x

Kullanımını yaygınlaştırmak için “www.opencv.org” adlı kar amacı güdülmeyen bir site kurulmuştur.

OpenCV programlama dilleri:

  • C++
  • C
  • MATLAB
  • Python
  • Java
  • C#

Günümüzde tüm yeni gelişmeler OpenCV’nin doğal dili olan C++ ile yapılmaktadır.

 

BİLEŞENLERİ

Beş temel bileşenden oluşmaktadır:

  1. CV(Computer Vision-Bilgisayarla Görme) Bileşeni: Temel resim işleme fonksiyonlarını ve algoritmalarını barındırır.
  2. MLL(Machine Learning Library) Bileşeni: Makine Öğrenmesi dalı için gerekli fonksiyonları içeren istatistiksel veri barındıran bir kütüphanedir.
  3. HighgGUI Bileşeni: Kütüphane içerisinde tanımlı nesnelerin oluşturulduğu, resim ve videoların kaydedilip silindiği fonksiyonları içerir.
  4. CXCore Bileşeni: Genel veri yapılarını barındıran, görüntü üzerinde çizim yapmayı sağlayan ve XML desteği sağlayan kütüphanedir.
  5. CvAux Bileşeni: Ağız hareketleri izleme(mouth-tracking), yüz tanıma(face-recognition), şekil eşleştirme(shape matching) gibi algoritmaları içeren kütüphanedir.

OpenCV için kaynak önerisi isterseniz. Bu kitap ingilizce fakat piyasada bulunan en iyi kaynaklardan biridir.

1) Dairelerin Algılanması

 

import cv2
import numpy as np
from matplotlib import pyplot as plt

bgr_img = cv2.imread('circles.png') # Resmi Okuduk

if bgr_img.shape[-1] == 3: 
b,g,r = cv2.split(bgr_img) # Renk
rgb_img = cv2.merge([r,g,b]) # BGR renk formatında gelen resmimizi RGB ye çevirdi
gray_img = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2GRAY)
else:
gray_img = bgr_img

img = cv2.medianBlur(gray_img, 25) #Median Blur Filtresi uyguladık.
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR) #Gri resmimizi tekrar BGR ye çevirdik.

circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1.2,100,
param1=50,param2=30,minRadius=0,maxRadius=0) #Daireleri bulmak için kullanılan en önemli yöntem budur.

circles = np.uint16(np.around(circles)) # Bulunan daireleri Np değişkenine dönüştürdük.

for i in circles[0,:]:
# Bulunan dairelerin çevresine bir çember çiziyoruz.
cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
# Çemberin merkezini işaretliyoruz.
cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)

# Matplotlib kütüphanesi ile grafik üzerine sonuçlarımızı çizdiriyoruz.
plt.subplot(121),plt.imshow(rgb_img) 
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(cimg)
plt.title('Hough Transform'), plt.xticks([]), plt.yticks([])
plt.show()

Ayarlayabileceğiniz bazı değişkenler:

img = cv2.medianBlur(gray_img, 25)

circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1.2,100,param1=50,param2=30,minRadius=0,maxRadius=0)

Örnek Resmimiz:

Sonuç 1:

Sonuç 2:

Gördüğünüz gibi Görüntü İşleme için her zaman en iyiye yaklaşmaya çalışmalısınız. Benim kameram için koddaki bazı değişkenleri değiştirerek en son bu hale getirebildim. İlk denemelerimde sadece soldaki 2 daireyi görebiliyordum.

2) Dikdörtgenlerin Algılanması

 

Sonuç:

#-*- coding: utf-8 -*-

import cv2
import time
import numpy as np

##################
DELAY = 0.02
USE_CAM = 1
IS_FOUND = 0

MORPH = 7
CANNY = 250
##################
# 420x600 oranı 105mmx150mm gerçek boyuttaki kağıt için
_width = 600.0
_height = 420.0
_margin = 0.0
##################
#Programda kullanılacak sabit değişkenleri tanımladıkç
if USE_CAM: video_capture = cv2.VideoCapture(0)

corners = np.array(
[
[[ _margin, _margin ]],
[[ _margin, _height + _margin ]],
[[ _width + _margin, _height + _margin ]],
[[ _width + _margin, _margin ]],
]
)

pts_dst = np.array( corners, np.float32 )

while True :

if USE_CAM :
ret, rgb = video_capture.read() # Kameradan okuyoruz.
else :
ret = 1
rgb = cv2.imread( "opencv.jpg", 1 )

if ( ret ):

gray = cv2.cvtColor( rgb, cv2.COLOR_BGR2GRAY )

gray = cv2.bilateralFilter( gray, 1, 10, 120 )

edges = cv2.Canny( gray, 10, CANNY )

kernel = cv2.getStructuringElement( cv2.MORPH_RECT, ( MORPH, MORPH ) )

closed = cv2.morphologyEx( edges, cv2.MORPH_CLOSE, kernel )

im2 ,contours, h = cv2.findContours( closed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE )

for cont in contours:

# Küçük alanları pass geç
if cv2.contourArea( cont ) > 5000 :

arc_len = cv2.arcLength( cont, True )

approx = cv2.approxPolyDP( cont, 0.1 * arc_len, True ) # Yaklaşık olarak köşeleri sayıyoruz.

if ( len( approx ) == 4 ): # 4 Köşeli olup olmadığını kontrol edıyoruz.
IS_FOUND = 1
pts_src = np.array( approx, np.float32 )

h, status = cv2.findHomography( pts_src, pts_dst )
out = cv2.warpPerspective( rgb, h, ( int( _width + _margin * 2 ), int( _height + _margin * 2 ) ) )

cv2.drawContours( rgb, [approx], -1, ( 255, 0, 0 ), 2 )

else : pass

cv2.namedWindow( 'edges', cv2.WND_PROP_AUTOSIZE)
cv2.imshow( 'edges', edges )

cv2.namedWindow( 'rgb', cv2.WND_PROP_AUTOSIZE )
cv2.imshow( 'rgb', rgb )

if IS_FOUND :
cv2.namedWindow( 'out', cv2.WND_PROP_AUTOSIZE )
cv2.imshow( 'out', out )

if cv2.waitKey(27) & 0xFF == ord('q') :
break

time.sleep( DELAY ) # Belirlediğimiz delay değerine göre programı bekletiyoruz.

else :
print("Stopped")
break

if USE_CAM : video_capture.release()
cv2.destroyAllWindows()

# end

Burada paylaşılan kodlarda herşeyi tek tek açıklayamıyorum. Hepsi farklı bir konu ve başlıkta anlatılması gereken başlıkları tek yazıda anlatmak mümkün değil. Bu kodları baz alarak üzerinde deneme yanılma yaparak sonuçlarını kontrol edin. Özellikle OpenCV de deneme yanılma yapmaktan korkmayın.

Bu konudaki amaç hem OpenCV de neler yapabilineceğini göstermek hemde insanlara bu konuda şevk kazandırmaktı.

 

Kaynakça:

https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_tutorials.html
https://www.pyimagesearch.com/2016/02/08/opencv-shape-detection/
https://stackoverflow.com/questions/11424002/how-to-detect-simple-geometric-shapes-using-opencv

CEVAP VER

Please enter your comment!
Please enter your name here