2. Bilgisayarlı Görü Nedir?
Günümüzde kameralı donanımların ucuzlaması ve yaygınlaşması ile birlikte
insanoğlunun değerlendirmesi gereken devasa büyüklükte görüntü verileri her an
yığılmaya devam ediyor.
Her kavşakta rastlanan trafik kameralarından binalardaki güvenlik kameralarına,
profesyonel cihazlardan herkesin cebinde taşıdığı mobil telefonlara kadar pek çok
kaynaktan gelen görüntüler anlamlandırılmayı bekliyor.
İşlek bir cadde üzerine konumlandırılmış denetim kamerasını düşünün; yol durumunu
sürekli kayıt altın alabilir. Ancak artık ihtiyaç duyduğumuz sadece devasa boyutlardaki
bu görüntüyü saklamak değil, trafik kurallarını ihlal eden araçların plakalarını da otonom
olarak tespit edebilmektir…
İşte Bilgisayarlı Görü ‘Computer Vision’ tam olarak bu ve benzeri ihtiyaçları karşılamak
için ortaya çıkan bir kavramdır. Bu alanda başarılı bir kütüphane olan OpenCV sizlere
tanıtılacaktır.
3. OpenCV Nedir?
OpenCV; açık kaynak kodlu bir bilgisayarlı görü kütüphanesidir. Görüntü ve video
işleme ile ilgili 500’den fazla temel ve ileri seviyedeki fonksiyonu, optimize edilmiş
halleriyle barındırmaktadır. İlk olarak Intel’in Rusya’daki laboratuvarında 1999 yılında
geliştirilmeye başlanmıştır.
OpenCV BSD lisansı altında dağıtılmaktadır. Başlangıçta C ile kodlanmasına rağmen,
2.0 ve 3.0 sürümleri ile gelişmiş bir C++ yapısını desteklemektedir. Bunun dışında
Python, Java vb. diller ile de beraber kullanılabilir.
OpenCV platform ve işletim sistemi konusunda geniş bir yelpazeye hitap etmektedir.
Windows, Linux, MacOS işletim sistemleri ile; Android, iOS, BBOS, WP vb. mobil
cihazlarda; Ardunio, Raspberry PI, gibi platformlarda kullanılabilmektedir.
Desteklenen Görüntü ve Video Formatları:
Windows Bitmaps: *.bmp, *.dib
JPEG Files: *.jpeg, *.jpg, *.jpe, *.jp2
Portable Network Graphics: *.png
Portable Image Format: *.pbm, *.pgm, *.ppm
Sun Rasters: *.sr, *.ras
4. OpenCV Bileşenleri (OpenCV 3.0)
highgui: Ekranda pencereler açmak üzerinde görüntüleri göstermek gerektiğinde
güncellemek; klavye ve fareden kullanıcı girişlerini almak gibi işleri yapan
fonksiyonlardan oluşur.
imgcodecs: Görüntü yazma ve okuma işlemlerini yapar.
videoio: Video ya da kameradan görüntü yazma ve okuma işlemlerini yapar.
core: Genel veri yapıları, görüntü üzerinde çizim yapma, XML ve YAML yazma okuma
işlevlerini barındırır.
imgproc: Görüntü işleme ile ilgili genel fonksiyonları barındırır. Filtreleme, Geometrik
ve Renk Uzay Dönüşümleri, Yapısal Analiz ve Şekil eşleştirme vb. fonksiyonlarını içerir.
ml: Bayes, SVM, YSA ve benzeri yapay öğrenme algoritmalarından oluşur.
5. OpenCV Kullanım Alanları
Askeri Endüstride yaygın olarak kullanılmaktadır.
Güvenlik, Radar, Astronomi, Trafik Sistemlerinde ve Kriminal Labaratuarlar da
kullanılmaktadır.
Biyomedikal alanlarda kullanılmaktadır.
Uydu Görüntüleme de kullanılmaktadır.
Ölçeklendirme; Resmi istenilen boyutta büyültüp küçültme işlemlerinde kullanılmaktadır.
Döndürme; Resmi istenilen açı ile kendi ekseni etrafında çevrilme işlemlerinde
kullanılmaktadır.
Yansıtma; Resmin kendi görüntüsü sabit kalıp, belli bir açı veya 180 derece açıyla
(aynalama / mirror) işlemlerinde kullanılmaktadır.
Renk Düzeltmesi; Resmin üzerindeki renkleri istenilen tona göre ayarlanması
işlemlerinde kullanılmaktadır.
7. Renk
Renk: Cisimlerin yüzeylerinden yansıyan ışığın dalga boyu farklılığıdır. Gözle görünür
ışık dediğimiz dalga boyu 700NM ve 400NM arasındadır.
8. Renk Uzayları ve Renk Uzayı Dönüşümleri
Renk çeşitliliğinin fazla olması nedeniyle bu renkleri gruplama ihtiyacı doğmuştur bu
renkleri gruplamak ve standartlaştırmak için renk uzayı (color space) kavramı ortaya
çıkmıştır. Her renk uzayı, renk kümesini tanımlamak için kendine özgü bir yapıya sahiptir.
Değişik renk uzayları dönüşümü için OpenCV’nin cvtColor() fonksiyonu kullanılır.
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0)
src: cv::Mat tipinde başlangıç görüntümüz.
dst: cv::Mat tipinde hedef görüntümüz.
code: Dönüşüm kodları hangi renk uzayından hangisine dönüştürüleceği bilgisin içerir.
OpenCV tarafından tanımlanmıştır.
GRAY Renk Uzayı Dönüşümleri:
CV_RGB2GRAY => RGB’den GRAY’e dönüştürür. (Görüntü 3 kanaldan tek kanala düşer)
CV_GRAY3RGB => GRAY’den RGB’ye dönüştürür.
HSV Renk Uzayı Dönüşümleri:
CV_RGB2HSV => RGB’den HSV’ye dönüştürür.
CV_HSV2RGB =>HSV’den RGB’ye dönüştürür.
9. Morfolojik İşlemler
Morfoloji değişik bilim dallarında da kullanılan bir tabirdir ve
biçim bilimi anlamına gelir. Nesnelerin görüntüdeki biçimleri
hem diğer nesnelerden hem de arka plandan ayrıştırılması söz
konusu olduğunda kullanılır. Başta (erosion) ve yayma (dilation)
işlemleri olmak üzere, bunların farklı kombinasyonlarından
türeyen işlemlere göz atacağız.
Aşındırma (Erosion): Belirginleştirdiğimiz kısmı küçültmek
için kullanılır. (1)
Yayma (Dilation): Belirginleştirdiğimiz kısmı büyültmek için
kullanılır. (2)
Erosion ve Dilation işlemlerinin farklı kombinasyonları ile
oluşturulan diğer morfolojik işlemler ise;
Open (Açma): Önce aşındırma, sonra yayma işlemi
dilate(erode(src)),
Close (Kapama): Önce yayma, sonra aşındırma işlemi
erode(dilate(src)),
10. Morfolojik İşlemler
void morphologyTransform(inputArray src, OutputArray dst, int op, inputArray karnel, Point
anchor=Point(-1,1), int iterations=1, int borderType=BORDER_CONSTANT, const
Scalar&borderValue=morphologyDefaultBorderValue())
src: Orijinal görüntü cv::Mat
dst: Hedef görüntü cv::Mat
op: Uygulanacak morfolojik işlem kodu MORPH_ERODE, MORPH_DILATE,
MORPH_OPEN, MORPH_CLOSE, MORPH_GRADIENT, MORPH_TOPHAT,
MORPH_BLACKHAT
karnel: Yapısal eleman – Uygulanacak işlemin hangi şekilde yapılacağını belirler
cv::Mat
anchor: Yapısal elemanın dayan noktası konumu. Ön değeri (-1,-1) yapısal elemanın
merkezini gösteriyor.
iteration: İşlemin uygulanma sayısı.
REFERANS:
http://docs.opencv.org/2.4/doc/tutorials/imgproc/opening_closing_hats/opening_closing_h
ats.html
11. Blur Fonksiyonları İle
Filtreleme İşlemleri
Blur, kelime anlamıyla bulanıklaştırma demektir. Genellikle resimdeki
gürültüyü temizleme işlemleri için kullanılır. Bulanıklaştırma işlemi bir
nesneyi ayrıştırmak için gürültülerin ortadan kaldırılması ya da en aza
indirgenmesi ihtiyacı ile kullanılmaktadır. Farklı parametrelerle
bulanıklaştırma işlemini yapan Blur, GaussianBlur, BoxFilter ve
MedianBlur fonksiyonlarından biz GaussianBlur fonksiyonunu ele
alacağız.
void GaussianBlur( InputArray src, OutputArray dst, size kSize,
double sigmaX, double sigmaY=0, int
borderType=BORDER_DEFAULT)
src: Orijinal görüntü cv::Mat – Eğer görüntü tek kanallı değil ise
her kanal için ayrı ayrı işlem yapılıp sonuç birleştirilir,
dst: Hedef görüntü,
kSize: İlk 3 fonksiyon için cv:Size tipinde işlem için kullanılacak
çekirdek matris ebatları (en, boy),
sigmaX: Çekirdek için 2 boyutlu gauss eğrisi için eğrinin X
eksenindeki standart sapması,
sigmaY: Çekirdek için 2 boyutlu gauss eğrisi için eğrinin Y
eksenindeki standart sapması.
REFERANS:
http://docs.opencv.org/2.4/modules/imgproc/doc/filtering.html?highligh
12. Kenar Bulma
Fonksiyonları
Bir fotoğraftaki nesneleri birbirinden ayırma
metotlarından biri de kenar bilgilerine ulaşmaktır.
Kenar bulma filtreleri bu değişimleri değişik metotlarla
tespit eder. OpenCV’de hazır kodlanmış kenar bulma
metodları Sobel, Laplacian, Scharr ve Canny’dir. Biz
Laplacian metodunu ele alacağız.
void Laplacian( InputArray src, OutputArray dst, int
dDepth, int kSize=1, double scale=1, double delta=0,
int borderType=BORDER_DEFAULT)
src: Orijinal görüntü cv::Mat – Eğer görüntü tek
kanallı değil ise her kanal için ayrı ayrı işlem
yapılıp sonuç birleştirilir,
dst: Hedef görüntü,
dDepth: Hedef görüntünün derinlik değeri -1
verildiğinde orijinal görüntü ile aynı olur,
kSize: Çekirdek kare matrisin ebadı,
13. Eşik Filtreleme
Resimde istediğimiz kısımların
ayrıştırılması için son aşamada o veya
değil durumuna getirmemiz gerekmektedir.
Bu tip görüntülere binary image ya da
mask image denir. Gri tonlamalı resimleri
bizim seçeceğimiz ya da resmin geneline
göre otomatik ya da yarı otomatik eşik
değerlerine göre dönüştürme işlemi için
threshold ya da adaptiveThreshold
fonksiyonları kullanılıyor. Biz threshold
fonksiyonunu ele alalım.
double threshold(InputArray src,
OutputArray dst, double thresh, double
maxval, int type)
src: Orijinal görüntü cv::Mat – Eğer
görüntü tek kanallı değil ise her kanal
14. Histogramlar
Histogram, istatiksel olarak elimizdeki
sayısal değerlerin sıklık dağılımını
göstermeye yarayan bir grafik türüdür.
void calcHist(const Mat* images,
int nimages, const int* channels,
InputArray mask, OutputArray hist,
int dims, const int* histSize, const
float** ranges, bool uniform=true,
bool accumulate=false)
images: Görüntü işaretçisi yada
görüntünün tutulduğu dizi,
nimages: Hesaplamada kullanılacak
görüntü sayısı,
channels: Görüntünün çok kanallı
olması durumunda hangi kanalın
15. Geometrik Dönüşümler - Ebat Değiştirme
En basit geometrik dönüşüm ebat
değiştirme işlemidir. Bu işlemi OpenCV’de
resize fonksiyonu ile yapabiliriz.
void resize(InputArray src, OutputArray dst,
size dSize, double fx=0, double fy=0, int
interpolation=INTER_LINEAR)
src: İşlem yapılacak görüntü,
dst: Ebadı değiştirilmiş görüntü,
dSize: Yeni ebatlar,
fx: X eksenindeki ebatlandırma katsayısı,
fy: Y eksinindeki ebatlandırma katsayısı,
interpolation: Ebatlandırma esnasında
piksel değerlerinin hesaplanma metodu.
INTER_NEAREST, INTE_LINEAR,
INTER_AREA, INTER_CUBIC,
INTER_LANCZOS4.
16. Geometrik Dönüşümler - Resim Döndürme
OpenCV’de görüntü üzerinde dönme ve ebatlandırma
işlemleri yapılabilen affine diye adlandırılan bir matris
çarpımı temelli dönüşüm fonksiyonu mevcuttur. Bu
dönüşümün ana özelliği resimler üzerindeki
paralelliklerin korunmasıdır. Dönüşümü
uygulayabilmek için öncelikle dönüşüm matrisini
oluşturuyoruz. Affine dönüşümü için 2x3 ebatlarında
cv::Mat tipinde bir matris hazırlanabilir. Doğrudan
değerleri verilebileceği gibi getRotationMatrix2D
fonksiyonu ile de oluşturulabilir.
Mat getRotationMatrix2D( Point2f center, double angle,
double scale)
center: Dönüşüm merkezinin koordinatı,
angle: Derece cinsinden dönme açısı,
scale: Dönüşüm ebatlandırma katsayısı (1
olduğunda değişiklik olmaz)
17. Geometrik Dönüşümler - Affine Dönüşümü
Affine dönüşüm fonksiyonu olan warpAffine’ı
tanımlayalım.
void warpAffine( InputArray src, OutputArray
dst, InputArray M, size dSize, int
flags=INTER_LINEAR, int
borderMode=BORDER_CONSTANT, const
Scalar& borderValue=Scalar())
src: Dönüşüm uygulanacak görüntü,
dst: Dönüşüm sonucu oluşturulan görüntü,
M: Dönüşüm matrisi (2x3),
dSize: Dönüşüm sonucu oluşturulacak
görüntünün ebadı,
flags: resize fonksiyonundaki interpolation
parametresine benzer,
borderMode: Dönüşüm sonrası çıkan boş
kalan kısımları dolduran parametre,
18. Fark Metodu ile Arkaplan Silme
Kamerada aldığımız görüntülerde bir süreklilik vardır. Peş peşe
devamlı görüntü akışı olur. Bu akan görüntülerde sabit olan
kısımlar aşağı yukarı sabit durur, fakat hareket halindeki
nesnelerin, konumları değiştiğinden, önceki konum ve sonraki
konumdaki renk değerleri değişir. Kameralarla görüntü almanın
ana sebebi de aslında bu hareketli nesnelerdir. Alınan
görüntülerin kısmen sabit olan alanına Arkaplan (background),
arkaplanı başarılı olarak modellediğimizde sonuç olarak
istediğimiz kısma önplan (foreground) denir. Bu farklılığı almanın
en basit yolu, anlık görüntülerden bir öncekini çıkarmaktır. Fark
için absdiff fonksiyonunu kullanabiliriz. Bu fonksiyon iki matrisin
farkının mutlak değerini verir.
Birbirini takip eden görüntüler absdiff fonksiyonu ile çıkarılıyor ve
fark ekranda gösteriliyor. Hareketli nesneleri sayabilmek için fark
görüntüsü üzerinde önce morfolojik işlemler uygulanır.
Öncelikle fark görüntüsü siyah beyaz almalıyız.