OpenCV Kitap

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 97

OPENCV LE GRNT LEME

MESUT PKN
OPENCV LE
GRNT
LEME
MESUT PIKIN

GR
Bu kitap mesutpiskin.com/blog adresindeki blog yazlarmn derlenmesi
ile oluturulmutur. Dzenleme, ekleme, gr veya nerileriniz iin e-
posta adresimden benim ile iletiime geebilirsiniz.

Yer alan rnekler ounlukla Java ile anlatlm yeri geldiinde ise
Python rnekleri eklenmitir. Daha nce grnt ileme ile uramam
veya farkl ktphaneleri kullanm OpenCV renmek isteyenlere
yneliktir. Temel kavramlardan balayarak birok kavram ve algoritma
ele alnmtr.

Yer alan rnek uygulamalar gerek OpenCV 3.1 gerekse 2.4.x srmleri
kullanlarak gelitirilmitir. Gereken yerlerde srmler aras farkllklara
deinilmitir.

mesutpiskin@outlook.com
1
NDEKLER
GR..................................................................................................................................................... 1
OpenCV Nedir? ..................................................................................................................................... 4
OpenCV Bileenleri ............................................................................................................................ 4
Alternatif Grnt leme Ktphaneleri ............................................................................................. 5
Neden OpenCV? Neden Java? .............................................................................................................. 6
OpenCV Wrappers ................................................................................................................................ 7
EmguCV............................................................................................................................................. 7
Wrapperlar (EmguCV) ile OpenCV Arasndaki Farklar Nelerdir? ....................................................... 8
JavaCV .............................................................................................................................................. 9
Live CV ............................................................................................................................................ 10
OpenCV iin Platform ve Gelitirme Ortam Seimi ............................................................................. 12
Windows letim Sistemi iin OpenCV Kurulumu ................................................................................. 12
Linux letim Sistemi iin OpenCV Kurulumu ....................................................................................... 14
Eclipse IDE iin OpenCV Yaplandrmas............................................................................................. 18
Netbeans IDE iin OpenCV Yaplandrmas ......................................................................................... 22
Android Studio iin OpenCV Yaplandrmas ........................................................................................ 23
Temel Dijital Grnt leme Kavramlar .............................................................................................. 24
Renk Uzaylar ...................................................................................................................................... 25
Renk Uzay ...................................................................................................................................... 25
Dosya Sisteminden Grnt Okuma .................................................................................................... 27
Video Aygtlarndan Grnt Okuma ................................................................................................... 28
OpenCV Javada Resim Grntleme imshow Metodu ..................................................................... 30
Grnt Stream Etme .......................................................................................................................... 32
p Kameradan Grnt Okuma ............................................................................................................ 35
Grnt Yazma (VideoWrite ) .............................................................................................................. 38
Piksel lemleri ..................................................................................................................................... 38
Matris zerinde izim lemleri ............................................................................................................ 40
Grnt Krpma ................................................................................................................................... 42
Java GUI Uygulamalar ......................................................................................................................... 42
Renk Uzaylar Aras Dnmler ......................................................................................................... 48
RGB HSV Renk Dnm.............................................................................................................. 48
RGB GRAY Renk Dnm ........................................................................................................... 49
Morfolojik Operatrler ve Filtreler ......................................................................................................... 50
Erosion (Andrma) Morfolojik Operatr .......................................................................................... 50
Dilation (Yayma Geniletme) Morfolojik Operatr .......................................................................... 52
2
Opening (Anm) Morfolojik Operatr .............................................................................................. 53
Closing (Kapanm) Morfolojik Operatr............................................................................................. 54
Morphological Gradient Morfolojik Operatr ..................................................................................... 55
Top Hat Morfolojik Operatr ............................................................................................................. 55
Thresholding (Eikleme) ...................................................................................................................... 56
THRESH_BINARY ........................................................................................................................... 56
THRESH_BINARY_INV ................................................................................................................... 57
THRESH_TOZERO.......................................................................................................................... 57
THRESH_TOZERO_INV .................................................................................................................. 57
Filtreler ................................................................................................................................................ 58
Blur .................................................................................................................................................. 59
GaussianBlur.................................................................................................................................... 59
Laplace ............................................................................................................................................ 59
Sobel ................................................................................................................................................ 59
Arka Plan Temizleme ........................................................................................................................... 60
Yeniden boyutlandrma (resize) ........................................................................................................... 63
Nesne Tespit ve Tanma Yntemleri .................................................................................................... 64
Template Matching ile Nesne Tespiti ................................................................................................... 64
Renk Tespiti Obje Takibi ...................................................................................................................... 68
Rengini Kullanarak Nesnenin Tespiti ................................................................................................... 75
Haar Cascade Classifier Yz ve Gz Tespiti ........................................................................................ 82
Haar Cascade ile Yz Tespiti (Python) ................................................................................................ 87
Yz Tanmaya Giri ............................................................................................................................. 87
Algoritmalar iin Veri Setinin Hazrlanmas ....................................................................................... 89
CSV Dosyas Oluturma .................................................................................................................. 89
Yz Tanma Eigenfaces, Fisherfaces, LBPH ....................................................................................... 91
Algoritmann Eitilmesi ..................................................................................................................... 92
Eletirme ........................................................................................................................................ 93
3
OPENCV NEDR?
OpenCV (Open Source Computer Vision) ak kaynak kodlu grnt ileme ktphanesidir. 1999 ylnda
ntel tarafndan gelitirilmeye balanm daha sonra Itseez, Willow, Nvidia, AMD, Google gibi irket ve
topluluklarn destei ile geliim sreci devam etmektedir. lk srm olan OpenCV alfa 2000 ylnda
piyasaya kmtr. lk etapta C programlama dili ile gelitirilmeye balanm ve daha sonra birok
algoritmas C++ dili ile gelitirilmitir. Open source yani ak kaynak kodlu bir ktphanedir ve BSD lisans
ile altnda gelitirilmektedir. BSD lisansna sahip olmas bu ktphaneyi istediiniz projede cretsiz olarak
kullanabileceiniz anlamna gelmektedir. OpenCV platform bamsz bir ktphanedir, bu sayede
Windows, Linux, FreeBSD, Android, Mac OS ve iOS platformlarnda alabilmektedir. C++, C, Python,
Java, Matlab, EmguCV ktphanesi araclyla da Visual Basic.Net, C# ve Visual C++ dilleri ile
topluluklar tarafndan gelitirilen farkl wrapperlar araclyla Perl ve Ruby programlama dilleri ile
kolaylkla OpenCV uygulamalar gelitirilebilir.

OpenCV ktphanesi ierisinde grnt ilemeye (image processing) ve makine renmesine (machine
learning) ynelik 2500den fazla algoritma bulunmaktadr. Bu algoritmalar ile yz tanma, nesneleri ayrt
etme, insan hareketlerini tespit edebilme, nesne snflandrma, plaka tanma, boyutlu grnt zerinde
ilem yapabilme, grnt karlatrma, optik karakter tanmlama OCR (Optical Character Recognition)
gibi ilemler rahatlkla yaplabilmektedir.

Not: OpenCV gelitirici Itseez firmas Intel tarafndan satn alnd. OpenCV gelitirmesine Intel ats
altndan devam edeceini duyurdu.

Yllara gre OpenCV srmleri

OpenCV Bileenleri
OpenCV ktphanesini daha iyi anlamak iin mimarisinden ve OpenCVyi oluturan bileenlerden
bahsetmek istiyorum.

Core: OpenCVnin temel fonksiyonlar ve matris, point, size gibi veri yaplarn bulundurur. Ayrca grnt
zerine izim yapabilmek iin kullanlabilecek metotlar ve XML ilemleri iin gerekli bileenleri barndrr.
4
HighGui: Resim grntleme, pencereleri ynetme ve grafiksel kullanc arabirimleri iin gerekli
olabilecek metotlar barndrr. 3.0 ncesi srmlerde dosya sistemi zerinden resim dosyas okuma ve
yazma ilemlerini yerine getiren metotlar barndrmaktayd.

Imgproc: Filtreleme operatrleri, kenar bulma, nesne belirleme, renk uzay ynetimi, renk ynetimi ve
eikleme gibi neredeyse tm fonksiyonlar iine alan bir pakettir. 3 ve sonra srmlerde baz fonksiyonlar
deimi olsada 2 ve 3 srmnde de birok fonksiyon ayndr.

Imgcodecs: Dosya sistemi zerinden resim ve video okuma/yazma ilemlerini yerine getiren metotlar
barndrmaktadr.

Videoio: Kameralara ve video cihazlarna erimek ve grnt almak ve grnt yazmak iin gerekli
metotlar barndrr. OpenCV 3 srm ncesinde bu paketteki birok metot video paketi ierisindeydi.

Tm OpenCV modlleri iin http://docs.opencv.org/3.0-beta/modules/refman.html adresine gz


atabilirsiniz.

Alternatif Grnt leme Ktphaneleri


Grnt ileme projelerinizde kullanacanz ktphaneyi amacnza uygun olarak semeniz nemlidir.
Bu seimi yaparken ne yapmak istediinize doru karar vermelisiniz, rnein sadece kameradan (usb,
ip vs.) grnt almak iin projenize OpenCV entegre etmenize gerek olmayabilir. Bu gibi durumlar iin
ve OpenCVnin neden iyi olduunu anlayabilmek amacyla alternatif olarak grnt ileme
ktphanelerine de bakalm.

MATLAB: Matlab iin bir grnt ileme ktphanesi olarak bahsetmek doru deildir fakat ierisinde
grnt ilemeye ynelik temel algoritmalar barndrmaktadr.Drdnc nesil ve ok amal bir
programlama dilidir. Akademik aratrmalarnzda, performansn nemli olmad durumlarda temel
grnt ilemleri iin tercih edebilirsiniz.Matlab kullanarak OpenCV Ktphanesi ile etkileimli olarak da
uygulamalarda gelitirmek mmkndr.

Halcon: Endstriyel projeler iin tercih edilen, kendi ierisinde gelitirme ortamnn yan sra eitli
programlama dilleri (C, C++, VS C++, C#, VB.NET) iin ktphanesi bulunan, yapay grme (machine
vision) odakl ticari bir yazlmdr. erisinde birok hazr fonksiyon bulundurur bu sayede hzl
uygulamalar gelitirilebilir. OpenCV ak kaynak kodlu, cretsiz bir ktphanedir ve computer vision
odakldr. Bu ynleri ile Halcondan ayrlmaktadr.

OpenFrameworks: Ak kaynak olarak gelitirilen bu ktphane C++ programlama dili iin gelitirilen bu
proje OS X, Linux, Embedded Linux (ARM), iOS, Android platformlarnda alabilmektedir. OpenCV
ktphanesinin birok algoritmasn kullanr ve temel k amac kolay ve hzl uygulama gelitirmektir.
rnein OpenCV ile 2t srede gerekletirdiiniz bir ii 1t srede gerekletirebilirsiniz, bunun temel
sebebi ise bir ok fonksiyonu araclyla standart hale getirilmi olan ileri tek satr ile yapabilmesidir
(Nesne tespiti,takibi renk belirleme, karlatrma vb.).

CIMG: Ak kaynak kodlu bir grnt ileme ktphanesidir. Windows, Linux ve OS X platformu zerinde
almaktadr. Sadece C++ dili iin destei bulunmaktadr fakat yazlm wrapperlar ile Java ve Python
ile de uygulama gelitirilebilmektedir. Birok algoritmay barndrmaktadr fakat OpenCV kadar
performansl ve geni bir algoritma altyapsna sahip deildir.
5
Fiji: Java platformu iin gelitirilmi ak kaynak kodlu GPL lisansna sahip bir grnt ileme
ktphanesidir. Windows, Linux ve MAC OSX Intel 32-bit veya 64-bit zerinde alr. Bilimsel grnt
analizi iin gelitirilmitir. Genetik, hcre biyolojisi, nro-bilim gibi alanlar iin zelletirilmi algoritmalara
sahiptir.

Endrov, ImageJ, Lead tools, Pink, Image Magick, Boost ise grnt ileme ktphanelerinden bazlardr.

NEDEN OPENCV? NEDEN JAVA?


Neden OpenCV?

OpenCV grnt ileme ktphaneleri arasnda en popler ve en ok kullanlandr. 2016 verileri itibari
ile OpenCV ktphanesinin toplam indirme says 7 milyonu gemitir. Yazlm gelitiriciler iin bir
ktphanenin, teknolojinin poplerlemesinin temel sebebi o teknoloji hakkndaki eriilebilecek kaynak
eitliliidir. OpenCV geni bir kaynaa sahiptir, yapmak istediiniz eyle alakal olarak size yardmc
olacak topluluklar ve bulabileceiniz teknik dokumanlar olduka fazladr. Biliim sektrnde kullanm
oran fazla olan btn programlama dillerine destei bulunmaktadr, ak kaynak kodlu olmas itibari ile
de dorudan destei bulunmayan programlama dilleri iin ara katmanlar yazlm ve OpenCV bu dile
entegre edilmitir. Geni iletim sistemi destei bulunmas itibariyle de gelitiriciler iin, platformlar aras
uygulama geiini kolaylatrmaktadr. Aktif olarak OpenCV kullanan baz projelere gz atarsak neden
en iyisi olduunu daha iyi anlayabiliriz. Google tarafndan cadde ve sokaklar haritalamak amacyla
yrtlen street view projesi, NASA tarafndan Marsa gnderilen keif arac (Curiosity) ile Mars yzeyini
grntlemek, yorumlamak ve aracn baz hareketlerini otonom olarak yapabilmek iin OpenCV
kullanlmtr.

Neden Java?

Grnt ileme yazlmlar iin performans nemli bir kriterdir. Bu yazlmlar yksek ilemci, grafik kart
ve bellek ihtiyac duyarlar bu yzden kullanlan programlama dili ve seilen platform yazlmn
performans iin kritik neme sahiptir. Daha nceleri grnt ileme projelerinde C ve C++ programlama
dilleri kullanlmaktayd nk bu diller dk seviyeli olmas sebebiyle rakiplerine gre olduka
performanslyd. Programlama dillerinin eitliliinin artmasyla birlikte bir ok dil ak kaynak oldu ve
topluluklarn veya firmalarn destei ile yaplan iyiletirmeler sayesinde performanslarnda iyiletirilmeler
yapld. Java programlama dili JVMin (Java Virtual Machine) gelitirilmesiyle yazlan kodu daha iyi
optimize edebilir hale geldi ve C++ programlama dili kadar performansl alan kodlar retmeye balad.
Java programlama dilinin platform bamszl, orta seviye bir dil olmas ve proje gelitirmenin olduka
hzl olmas sebebiyle nce kmaktadr. Web, mobil, gml sistem ve masast projelerin
gelitirilebiliyor olmas da bal bana bir seim nedeni de olabilir. Bu balamda OpenCV uygulamas
gelitirmede Java tercih edilmektedir. OpenCV dokmanlarna bakldnda rnekler C++, Java ve
Python arlkldr. Son birka yldr Python yazmnn kolay olmas, uygulama gelitirme sresini
ksaltmas gibi zellikleri ile programlamaya yeni balayan kiiler tarafndan kullanlarak popler olsa da
performans, byk proje gelitirmenin zorluu gibi sebeplerle de projelerde tercih edilmemektedir, bu
durum imdilik byle olsa da ald destekler ve topluluklarn katklar ile grnt ilemede tercih edilen
bir dil haline gelebilir.
6
OPENCV WRAPPERS
Wrapper Trke kelime anlam olarak sarc, sarmalayc manasna gelmektedir. Ticari yada ak kaynak
olarak gelitirilen, OpenCV ktphanesini referans alan ve bu ktphane ierisindeki fonksiyonlar
kullanarak kendi fonksiyonlarn gelitiren ve farkl platformlarla kullanlabilir hala getiren yazlm
ktphaneleri diyebilirz. Bildiiniz zere OpenCV ak kaynak kodlu bir yapdadr ve tm programlama
dillerine dorudan bir destek vermemektedir. Bu programlama dillerinden balcalar C#, Visaul Basic
.Net, F# Ruby vb. dir. Dorudan destei olan programlama dilleri iin de yazlm wrapperlar mevcuttur.
Temel yazl amalar destei olmayan programlama dilleri iinde bu ktphaneyi kullanlabilir hale
getirmek, olan fonksiyonlar belirli bir platformda daha iyi alabilecek hale getirmek amacyla optimize
etmek veya bu ktphanenin kullanm kolaylatrarak sadece belirli bir ama iin zelletirmekdir. Bu
ktphanelerede deinmekte fayda olduunu dnyorum ve yazlm baz wrapperlara gz atalm.

EmguCV: Bu wrapper .Net framework ats altnda bulunan C #, VB, VC++, Xamarin veya IronPython
ve Unity ile grnt ileme uygulamalar gelitirmeyi kolaylatrmaktadr. Windows, Linux, Mac OS X,
iOS, Android ve Windows Phone platformlarnda alabilmektedir. Gncelliini devam ettiren bir
ktphanedir ve farkl lisanslamalara sahiptir.

JavaCV: Java teknolojisi ats altnda kullanmak iin gelitirilmi bir wrapperdr. OpeCV ktphanelerini
referans alr ve java ierisinde C++ yazmnda (syntax) uygulama gelitirmeyi destekler. Sklkla
kullanlan bir ok algoritmay kullanlabilirlik asndan kolaylatrmlardr. Sadece OpenCV deil
FFmpeg, libdc1394, PGR FlyCapture, OpenKinect, videoInput, ARToolKitPlus, ve flandmark gibi
ktphaneleri de kullanmaktadr. Bytedeco tarafndan ak kaynak kod olarak gelitirilmektedir ve
gncelliini devam ettiren bir ktphanedir topluluk destei bulunmaktadr.

Opencvsharp: .Net framework iin yazlm bir baka ktphanedir. .Net dilleri iin grnt ileme
yazlmlar gelitirebilmeyi amalamaktadr. EmguCVden farkl olarak ak kaynak kodlu olduu iin
eksra bir lisans maliyeti yoktur. .Net framework 2.0 ve zeri ile gelitirilen projeler iin kullanlabilir, mono
destei ile Linux ve MacOS gibi platformlar iin de uygulama gelitirilebilir. Shimat tarafndan
gelitirilmektedir ve gncelliini srdren bir ktphanedir.

EHE-LAB OpenCV Wrapper: Labview iin gelitirilmi bir OpenCV wrapperdr. OpenCV 2.4.9 srm
referans alnarak gelitirilmitir. Ticari bir rndr ve 150$ gibi bir lisans creti bulunmaktadr. Windows
platformunda almaktadr. Ehe lab tarafondan gelitirilmektedir, ok fazla dokman olmamakla birlikte
demo srmn cretsiz olarak indirip deneyebilirsiniz.

Ruby-opencv: Ruby iin gelitirilmi bir wrapperdr. Ak kaynak kodlu yrtlen bir projedir. OpenCV
2.4.10 srm referans alnarak gelitirilmitir ve Ruby 1.9.3, 2.x desteklemektedir. Linux, MacOS ve
Windows platformu iin kullanlabilmektedir. Topluluk destei ile gelitirilmektedir,
https://github.com/ruby-opencv/ruby-opencv adresinden ulalabilir durumdadr.

Live CV: QML ile kolay bir ekilde OpenCV ktphanesi ile uygulamalar gelitirmenizi salayan bir
wrapper.

EmguCV
EmguCV bir OpenCV wrapperdr. (OpenCV Wrapperlar hakknda daha detayl bilgi iin buraya gz
atabilirsiniz) .Net framework ats altnda bulunan C #, VB, VC++, Xamarin veya IronPython ve Unity ile
7
grnt ileme uygulamalar gelitirmeyi kolaylatrmaktadr. Windows, Linux, Mac OS X, iOS, Android
ve Windows Phone platformlarnda alabilmektedir. Gncelliini devam ettiren bir ktphanedir ve farkl
lisanslamalara sahiptir. Resmi internet sitesi http://emgu.com

Alternatifleri ise;

Opencvsharp
OpenCVDotNet
SharperCV

Wrapperlar (EmguCV) ile OpenCV Arasndaki Farklar Nelerdir?


EmguCVnin bir OpenCV wrapper olduundan daha nce bahsetmitik, peki OpenCV ile arasndaki
farklar nelerdir, projelerinizde OpenCV mi yoksa EmguCV mi tercih etmeliyiz sorusunun cevabna
bakalm. Bildiiniz zere wrapperlar gelitirilen ktphaneyi referans alarak istenilen platform/teknoloji/dil
iin altrlabilir/kullanlabilir yapmay amalar. Bu ama dorultusunda EmguCV gelitiricileri native
OpenCV ktphanesinin fonksiyonlarn, snflarn ve algoritmalarn alrlar, bu fonksiyonlar. NET ile
altrabilmek iin native ktphaneleri kullanan bir ktphane yani. net karl library project
gelitirirler. .NET (C#,VB.NET vb.) gelitiricisi tarafndan arlan bir fonksiyon veya kullanlan bir snf
ncelikle EmguCV.dlline gider gelen/kullanlan istek/fonksiyon/snf ilenir ve karl olan OpenCV
ktphanesi zerinden arlr. stekler ve fonksiyonlar bire bir olarak ayn deildir gelitiriciler
platform/teknoloji aras farkllklardan dolay baz deiiklikler yapmlar gerek ekleme gerekse karma
yaparak. NET iin kullanlabilir olmay amalamlardr. Bu sebeplerden dolay arlan/kullanlan
algoritmaya gre EmguCV ve OpenCV arasnda performans farklklar olabilir.

8
Teorik olarak bakldnda her zaman en alt seviyedeki ktphane daha hzl alacaktr fakat platforma
gre yaplan deiiklikler bu durumu tersine evirerek baz zel fonksiyonlarda yksek seviye (EmguCV)
ktphaneleri daha performansl klmaktadr. Projeniz. NET ile gelitirilecekse dorudan OpenCV
kullanmanz mmkn olmayacaktr bu yzden OpenCV mi EmguCV mi diye sormak yerine EmguCV mi
yoksa dier .NET wrapperlar m (Opencvsharp, OpenCVDotNet, SharperCV vb.)diye sormak daha doru
olacaktr. Bu soru da cretlimi yoksa cretsiz mi kaynak aradnza gre deiecektir. Lisans cretleri
sorun olmayacaksa EmguCV ok iyi bir seim olacaktr fakat cretsiz bir alternatif aryorsanz gncel bir
wrapper semelisiniz aksi taktirde elinizdeki wrapper OpenCVnin eski versiyonlarn referans alarak
gelitirildii iin baz problemlerin zmnde eski algoritmalar kullanmak zorunda kalabilirsiniz. Eski
veya birok bug bulunan algoritmalar performans dorudan etkileyen faktrlerdir. Opencvsharp en
gncel srm olan OpenCV 3.1 srmn desteklemektedir. Mono, .NET Framework 2.0 ve sonras
versiyonlar desteklemesi sayesinde dier platformlar veya eski projeler iin rahatlkla kullanlabilir. yi
hazrlanm wikisi ve geni rnek ktphanesi ile aradnz birok eyi kolayca bulabilirsiniz. Ak
kaynak kod olarak BSD lisans altnda cretsiz olarak gelitirilmektedir. OpenCVDotNet ve SharperCV
gncel OpenCV versiyonlarn takip etmemekle birlikte uzun zamandr gncelleme gelmeyen ve
gelitirilmesi neredeyse durdu denilebilecek ktphanelerdir. Fakat fonksiyonlara getirdikleri farkl
yaklamlarla temel grnt ileme ileri iin kullanlabilirler.

JavaCV
Java gelitiricileri OpenCV ktphanesi ile uygulama gelitirken zelliklede Andorid platformu zerinde
bu ii yaparken bir ok zorluklarla karlayor. rnekler veya dokmanlardaki anlatmlar Python ve C++
ile yaplyor bu durum Java gelitiricileri iin can skc bir durum, zellikle baz C++ fonksiyonlarnn Java
karlnn olmamas ileri daha da zora sokuyor. Bu durumda imdadnza JavaCV yetiiyor.

JavaCV Nedir?

JavaCV, JavaCPP kullanlarak gelitirilmi bir OpenCV wrapperdr. Wrapparn ne olduuna daha nce
burada deinmitik fakat ksaca tekrardan zetlememiz gerekirse; gelitirilen ktphanenin, gelitirildii
kaynak dil, teknoloji referans alnarak istenilen hedef dil veya teknolojiye aktarlmas bu platformda
altrlabilir hale getirilmesi denilebilir. JavaCV de OpenCV referans alnarak gelitirilmi fakat zerine
birok farkl ktphaneler eklenerek geniletilmi bir Java grnt ileme ktphanesidir. OpenCV den
bamsz deil, aksine paralel olarak ayn dorultuda geliim gstermektedir. Gelitirilen birok metot
sayesinde ileri kolaylatrmakta ve gelitirme sresini ksaltmaktadr. zellikle Androidin ivme
kazanmas ile ktphaneye olan rabet artm ve bu platform iin grnt ilemeyi daha da kolay hale
getirmek iin ekstra modller gelitirilmitir. rnek vermek gerekirse Geometric Calibrator, ProCam Color
Calibrator, Canvas Frame,GLCanvas Frame, Parallel vb. olarak zetlenebilir. Kinect vb gibi donanmlar
iin gelitirilmi snflar ile bu cihazlara ynelik uygulamalar kolaylkla gelitirilebilir.

JavaCV mi? OpenCV mi?

ncelikle projenizde ikisini de birlikte kullanabileceinizi hatrlatmak isterim. Bu iki ktphanenin


performansn aka ortaya koyan bir grafik bulamadm bu yzden tecrbelerime dayanarak anlatmay
tercih ettim. JavaCV ile OpenCV yi karlatrmak olduka zor nk ne iin kullanacanza ve
amacnza gre bu sorunun cevab deiebilir. Amacnz Android platformuna uygulama gelitirmek veya
OpenCVnin C++ rneklerini Java projelerine implemente etmek ise JavaCVyi tercih edebilirsiniz.
Gelitirdiiniz projede hz ve performans istiyor, gerek zamanl iler ile urayorsanz OpenCV
9
ktphanesini tercih edebilirsiniz. Bu iki ktphaneyi de keskin izgilerle ayrmamak gerekiyor, aktarlan
fonksiyonlar ve snflar ok fazla deitirilmemi zerine eklemeler yapm durumdalar. Bu yzden
duruma gre iki ktphaneyi de terci edebilirsiniz bir rakip, alternatif deil iinizi kolaylatran ara bir
ktphane olarak grebilirsiniz.

JavaCV Kurulumu

JavaCV kurulumu normal bir Java Ktphanesi kurmaktan okta farkl deil. Projeyi buradaki
(https://github.com/bytedeco/javacv) Github balantsndan indirebilir veya uan ki en gncel srmn
1.2 yi binary olarak bu (http://search.maven.org/remotecontent?filepath=org/bytedeco/javacv/1.2/javacv-
1.2-bin.zip) balantdan indirebilirsiniz.

Sktrlm dosyay karttnzda ierisinde birok jar dosyas greceksiniz, projenize JavaCPP,
JavaCV, OpenCV ve kullanm olduunuz iletim sisteminize uygun opencv jar dosyasn projenize
ekleyin (x64 windows iin opencv-windows-x86_64.jar ). Balantdan rnekleri indirip deneyebilirsiniz.
(https://github.com/bytedeco/javacv/tree/master/samples)

Live CV
Live CV Dinu SV tarafndan gelitirilen ak kaynak kod bir gelitirme ortam. Gelitirme ortam diyorum
nk farkl bir grnt ileme ktphanesi olarak dnlmemeli. Live CV QML (Qt Meta Language
veya Qt Modeling Language) dili ile json benzeri bir yapda gelitirme yapmay salayan OpenCV
wrapper. QML ile json formatndaki elementler eklinde OpenCV fonksiyonlar kullanlabiliyor. Hzl
prototipleme, yeni balayanlar iin OpenCVyi kavrama veya akademik almalar iin olduka kullanl
bir ortam sunuyor. Live CV bir gelitirme ortam ile birlikte geliyor bu gelitirme ortam olduka basit
ekilde tasarlanm ve yazdnz kodun ayn anda ktsn da grmenize olanak veriyor.

Live CV gelitirme ortamn buradan (http://livecv.dinusv.com/download.html) indirebilirsiniz, github


depolarna ise buradan (https://github.com/livecv/livecv) ulaabilirsiniz. Windows, Linux ve MacOS
platformlar iin altrlabilir durumdadr, dier platformlar iin kaynak kodunu indirerek derleyebilirsiniz.
Live CVyi altrdnzda aadaki gibi bir IDE sizi karlyor olacak. Sol tarafta QML ile
gelitirmelerimizi yapacaz sa tarafta ise yazdmz kodun anlk olarak ktsn grebileceiz. rnein
grnt zerine uyguladnz bir thresholdingi ayn t annda grebiliyorsunuz, sadece grseller iin deil
videolar iinde bu durum geerlidir.

Basit bir rnek yapalm,

OpenCV de blur filtresi grnty bulanklatrmak iin kullanlr. Uygulamak iin ise blur() metodu
kullanlr. Bu metot parametre olarak kaynak grnt mat nesnesi tipinde, mat tipinde bir sonu ve Size
tipinde uygulanacak olan bulanklk deerini almaktadr.(ekirdek boyutu olarak da adlandrlr). Kullanm
ise aadaki gibidir.

Imgproc.blur(kaynakGoruntu, hedefGoruntu, new Size(50,50));

Live CV ile ayn ilemi yapmak istediimizde ise QML kodumuz aadaki gibi olacaktr.
10
import lcvcore 1.0
import lcvimgproc 1.0
Row{
ImRead{
id : src
file : 'D:/test.jpg'
}
Blur{
input : src.output
anchor : Qt.point(3, 3)
ksize : "5x5"
}
}

Grntnn dosya sisteminden okunmas ve filtrenin uygulanmas bir ak eklinde elementler ile temsil
edilmektedir. Ayn deerler ile tanmlanan fonksiyonda sonu matrisi bire bir ayn olacaktr.

Live CV Gelitirme Ortam


11
OPENCV N PLATFORM VE GELTRME ORTAMI SEM
OpenCV platform bamsz bir ktphanedir ve tm platformlar iin destei bulunmaktadr. Projelerinizde
kullanacanz iletim sisteminde seim ansnz var ise bu seiminize yardmc olabilmek ve
platformlarn avantaj, dezavantajlarndan bahsetmek istiyorum.

OpenCVnin birok snf dorudan grafik kart srclerini kullanmaktadr. Grafik kart srcleri
platformlara gre farkllk gstermektedirler. rnein OpenCV 3.x srm Windows iletim sistemlerinde
Nvidia grafik kartna sahip baz sistemlerde mavi ekran (blue screen) olarak adlandrlan hataya sebep
olmaktadr. Grafik kartn kullanan snflarn baz fonksiyonlar altrldnda bu hata ortaya kmaktadr,
OpenCV soru&cevap sitesinde bu sorundan dert yanan birok kiiyi grebilirsiniz. Linux ve Mac
platformunda ise uan itibariyle byle bir hata yoktur. Bylesi bir durumla karlatrsanz src
gncellemelerinizi yapmanz zm bulamaz iseniz kullandnz versiyonu veya platformu
deitirmenizi neriririm.

Gml sistemlerde Raspberry Pi, OrangePi, Beaglebone, Banana Pi vb. kartlarda iletim sistemi
seerken daha nceki tecrbelerime dayanarak syleyebilirim ki Debian Linux atallamas iletim
sistemleri ok daha performansl almaktadr.

Kitap ierisinde yer alan uygulamalar Java programlama dili ats altnda Eclipse, Netbeans ve Android
Studio ile gelitirilmitir. Java renmeye yeni balam birisi iseniz bu neriler sizin iindir. Grafiksel
kullanc arabirime (GUI) sahip, etkileimli uygulamalar gelitirmek istiyorsanz Netbeans IDE
kullanabilirsiniz. Hzl kod gelitirmek ve ok fazla grfiksel olmayan uygulamalar iin ise Eclipse IDE tercih
edebilirsiniz. Yeni balayan birisi iseniz Eclipse IDE ve size karmak gelebilir bu durumda Netbeans
kullanabilirsiniz. Kitap ierisindeki mobil Android uygulama rnekleri ise Android Studio ile gelitirilmitir.
Tm gelitirme ortamlar iin OpenCV kurulmas ve ayarlarn yaplmas anlatlacaktr.

WNDOWS LETM SSTEM N OPENCV KURULUMU


OpenCVnin, bu yaznn yazld tarih itibari ile en gncel srm 3.1 dir. Windows iletim sistemi iin
OpenCV derlenmi, sistem ktphanesi haline getirilmi olarak bulunmaktadr. Bu sayede kaynak kodu
tekrardan derlemeye ihtiya olmadan kullanlabilir haldedir. OpenCVyi http://opencv.org/downloads.html
adresine giriyoruz ve indirmek istediimiz srmn altndaki OpenCV for Windows linkine tklyoruz.
rneklerde uanda en gncel olan 3.1 srmn kullanacaz. ndirme balants sourceforge.net
sitesine ynlendirecek ve indirme ilemi balayacak.
12
ndirdiinizde sktrlm olarak gelecektir, altrdnzda OpenCV dosyalarn kartmak iin bir dizin
isteyecektir, burada kartlmasn istediiniz dosya dizini yolunu yazarak Extract butonuna tklayn.
Dosyalar karttnz dizinde OpenCV klasr ierisinde build ve sources diye 2 adet klasr
bulunmaktadr. Build klasr ierisinde Windows platformu iin derlenmi olarak sistem native
ktphaneler ve programlama dilleri iin ktphaneler bulunmaktadr. Sources klasrnde ise OpenCV
kaynak kodlar ve rnek uygulamalar yer almaktadr. Buradaki kaynak kodlar ile OpenCVyi tekrardan
derleyebilirsiniz.

Java ile OpenCV uygulamas gelitirmek iin build ierisindeki java klasrnde yer alan jar dosyasn ve
kullanacamz iletim sistemi mimarisine gre OpenCV Windows sistem ktphanelerini kullanacaz.
13
LNUX LETM SSTEM N OPENCV KURULUMU
Linux iletim sistemi iin OpenCV ktphanesi kaynak kod olarak yani derlenmeden gelmektedir, bunun
en temel sebebi birok Linux datm olmasdr. Temel olarak amalanan ey kullanmak isteyenin kendi
sistemine ve kullanmak istedii programlama diline gre derlemesidir. Derleme ileminde Linux Mint
kullanacam ve tm Debian datmlarnda tm admlar ayn olacaktr. Debian ve Debian atallamas
haricinde bir Linux datma sahipseniz, kullandnz paket yneticisine gre komutlar deiiklik
gsterebilir, fakat bire bir olarak karlklar yer almaktadr.

OpenCV kurmak iin ncelikle http://opencv.org/downloads.html adresinden kullanmak istediiniz srm


altnda yer alan OpenCV for Linux/Mac balantsna tklayarak OpenCV gelitiricisi olan Itseezin Github
hesabndan kaynak kodlar indiriyoruz. Dikkat ederseniz Linux ve Mac platformlar iin ayr ayr indirme
balants bulunmamaktadr. OpenCVnin C ve C++ dilleri ile platform bamsz olarak gelitirildii
sylemitik, bu sayede kaynak kodu indirerek istediiniz platform zerinde derleyerek altrabilirsiniz.

ndirme ilemi tamamlandnda OpenCVnin kaynak kodlarn ieren bir zip dosyas gelecektir. Bu zip
formatnda sktrlm dosyay bir dizine kartnz. Bu dizinde kaynak kodun derlenmesi ilemini
yapacaz.

ncelikle iletim sistemi zerinde JDK (Java Developer Kit) kurulu olmas gerekmektedir. Java ile
OpenCV uygulamas gelitireceimiz iin bunu kurmanz gerekmektedir. Kullandnz datmn paket
yneticisinden ya da aadaki balantdan veya aadaki komutlar araclyla depoyu ekleyip oradan
indirip kurabilirsiniz.
14
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

sudo add-apt-repository ppa:webupd8team/java sudo apt-get update sudo apt-get install oracle-java8-
installer sudo apt-get install oracle-java8-set-default

Java kurulumunun ardndan Apache ANT aracna ihtiyacmz var kurmak iin aadaki komut ile
deponuzdan indirebilirsiniz ya da https://ant.apache.org/ adresinden kurulumu indirebilirsiniz.

sudo apt-get install ant

Linux zerinde OpenCV altrabilmek iin baz paketlere ihtiyacmz var bu paketlerden bir ksm baz
Linux datmlarnda kurulu olarak gelmektedir. Bu paketleri aadaki komut ile kurabilirsiniz.

sudo apt-get install g++ libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev build-
essential

Derleme ilemine balamadan nce Java yolunu sisteme eklememiz gerekiyor varsaylan olarak JDK
usr/lib/jvm/ dizinine kurulur. Bu dizinde, kurduunuz srmn klasrn grebilirsiniz. Yukarda Oracle
JDK 8 kurmutuk ve bu klasr yol olarak gstereceiz, sizde sisteminizdeki JDK dosya yoluna gre
aadaki dizini deitirebilirsiniz.

export JAVA_HOME=/usr/lib/jvm/java-8-oracle

Derleme iin cmake aracn kullanacaz. Cmake platform bamsz bir derleme aracdr, zerinde birok
derleyici yer alr ve o derleyiciye gre kt retebilmektedir.

sudo apt-get install cmake

Yukarda yer alan komut ile cmake kurulumunu yapyoruz, kullandnz datmn deposunda yok ise
https://cmake.org/download/ adresinden indirip kurabilirsiniz.

Gerekli aralar indirip kurduktan sonra artk derleme ilemine geebiliriz. lk adm olarak OpenCVyi zip
dosyasndan karttmz klasre gidiyoruz ve sras ile aadaki admlar takip ediyoruz.

mkdir build

ndirdiimiz dizinde derleme ilemi sonucu iin bir klasr oluturuyoruz.

cd build

Oluturduumuz build klasr ierisine gidiyoruz ve derleme ilemi iin cmake aracn balatyoruz.

cmake -DBUILD_SHARED_LIBS=OFF ..
15
Bu komutun ardndan cmake buil klasr ierisine baz dosyalar oluturacak ve derlemeye balamadan
yaplacak olan ilemler iin bir kt gsterecektir. Burada dikkat etmemiz gereken nokta java ksm, eer
java bal altnda ant ve JNI dizinleri karsnda NO ibaresi yer alyor ise derleme ilemine
balamaynz, jar dosyasn ve sistem ktphanesini oluturmayacaktr. Bunun nedeni ant veya JDK
kurulumlarnn eksik veya java yolunun verilmemi olmasdr yukardaki admlar tekrardan yapnz. Eer
java bal altnda aadaki gibi dosya dizinleri grnyor ise derleme ilemine geebilirsiniz.

16
Hata ile karlarsanz build/makefiles ierisinde yer alan error log dosyasna bakabilirsiniz. Derleme
ilemini make komutu ile balatacaz. Bu ilem sisteminizin donanma gre deiiklik gstermektedir.
make j komutu ile derleme ilemini farkl threadlere blerek bu sreyi hzlandrabilirsiniz, rnein make
j4 ile derleme yaparsanz toplam ilemi 4 e blerek, 4 ayr i paras olarak altrr. Eer make j ile
derleme esnasnda Process Kill hatas alrsanz sadece make komutunu kullanarak derleme ilemini
yapn. Raspberry Pi gibi gelitirme kartlar zerinde OpenCV derleme ilemi yapacaksanz tamamlanma
sresi biraz uzun olacaktr.

make j4

Komutu ile derleme ilemini balatyoruz.


17
Derleme ileminin ardndan build/bin ierisine opencv-3.jar gibi kurduunuz srme gre ismi deiecek
bir jar dosyas olacaktr. Yine build/lib dizininde linopencv_java3.so (kurulan srme gre ismi farkllk
gsterir) olarak native ktphane dosyas olacaktr. Bu jar dosasn ve ktphaneyi uygulama gelitirmek
iin kullanacaz.

Blogdaki rnek projeler iin Eclipse ve Netbeans kullanlmtr. Java uygulamalar iin en ok tercih
edilen iki gelitirme ortam iinde kurulum ve yaplandrma ilemi yapacaz. Siz tercih ettiiniz ortam ile
uygulamalar gelitirebilirsiniz.

ECLPSE IDE N OPENCV YAPILANDIRMASI


Eclipse cretsiz bir gelitirme ortamdr. Eklenti destei sayesinde esnek ve hzldr, java projelerinde en
ok tercih edilen IDE dir. Eclipse Mars 1 srmn kullanacam tercih ettiiniz bir srm
kullanabilirsiniz. Eclipsi https://eclipse.org/downloads/ adresinden Eclipse IDE for Java Developers veya
Eclipse IDE for JavaEE Developers paketini kullandnz iletim sistemine gre indirebilirsiniz.

OpenCV ktphanesini kullanabilmek iin jar dosyasna ve sistem ktphanesine ihtiyacmz var. Bu
dosyalar Windows kullanyorsanz daha nce indirdiiniz OpenCV klasr ierisindeki build\java
dizininde jar dosyas ve ilemci mimarisine gre x86 ve x64 olarak sistem ktphanesi bulunmaktadr.
Linux ile OpenCV derleme ilemi yaptysanz Opencv klasr ierisinde build\bin dizininde jar dosyas,
build\lib ierisinde ise sistem ktphanesi yer almaktadr.
18

Eclipse ile yeni bir proje oluturalm ve jar dosyasn ktphanelere ekleyelim.
Add External JARs butonu ile OpenCV jar dosyasn seiyoruz. Bir user library oluturup, jar dosyasn
ve sistem ktphanesini proje ierisine ekleyebilirsiniz.
19
OpenCVnin bulunduu dizinden jar dosyasn seerek devam ediyoruz.

20
Bir sonraki aamada iletim sistemine mimarisine gre sistem ktphanesini, jar dosyasna native library
olarak eklememiz gerekmektedir. Windows kullanyorsanz x64 ve x86 olarak ilemci mimarisine gre
farkl ktphaneler bulunmaktadr kullandnz mimariye gre semeniz gerekmektedir. Linux
kullanyorsanz derleme ilemini kendi bilgisayarmzda yaptmz iin, kullanlan bilgisayar mimarisine
gre derlemitir bu yzden so uzantl ktphaneyi lib klasrnden semeniz yeterli olacaktr. Jar
dosyasn setik ve library ksmna Opencv Ktphanesi geldi. Native library location seerek edit
butonuna tklyoruz.

Alan pencereden External Folder diyerek sistem ktphanenin bulunduu klasr seiyoruz. Linux
kullanyorsanz build ierisindeki lib klasrn semeniz yeterlidir.

Bu ilemlerin ardndan OpenCV kullanma hazr olacaktr. Finish butonu ile projeyi oluturabilirsiniz.
21
NETBEANS IDE N OPENCV YAPILANDIRMASI
Netbeans Oracle irketi tarafndan gelitirilen ve cretsiz olarak datlan bir yazlm gelitirme ortamdr.
zellikle Java GUI projeleri iin sklkla tercih edilir. Netbeans IDE iinde OpenCV ktphanesi kurulumu
yapacaz. Netbeans IDEyi https://netbeans.org/ adresinden indirip kurabilirsiniz.

Netbeans ile yeni bir Java projesi oluturalm ve projemize OpenCV ktphanesini ekleyelim. Bunun iin
Project paelinden libraries zerine sa tklayalm ve Add JAR/Folder ile build/java dizini ierisindeki jar
dosyasn seerek ykleyelim. Yeni bir library oluturarak jar dosyasn proje ierisine yerletirebilirsiniz.

Jar dosyasn ekledikten sonra, run mensnden run project veya F6 tuu ile projeyi altralm. Son
olarak native sistem ktphanesinin yolunu gstermemiz gerekiyor. File mensnden project propertis
seenei ile proje zellikleri mensn aalm. Sol tarafta yer alan menden run diyerek VM Options
ksmna Windows iin dll Linux iin so uzantl olan sistem ktphanesininin yolunu -
Djava.library.path=Dosya yolu parametresi ile verelim.

22
Bu ilemin ardndan OpenCV uygulamas gelitirmek iin Netbeans ortam hazr.

ANDROD STUDO N OPENCV YAPILANDIRMASI


OpennCV Android platformu iin de destek vermektedir. Bu sayede Java ile android uygulamalar
gelitirirken OpenCV ktphanesinden yararlanabilirsiniz. OpenCV web sitesi zerinden OpenCV for
Android linkine tklayarak kitabn yazld tarih itibariyle en gncel olan 3.1 srmn indiriyoruz.
ndirdiimiz zip dosyasn kartyoruz.

Android stuido zerinde proje oluturalm, oluturulan projeye opencv ktphanesini ekleyeceiz. File
mensnden New/ Import Module diyerek New Modle penceresini ayoruz. Bu pencereden daha nce
indirdiimiz OpenCV klasr ierisinde SDK/Java klasrn seerek devam ediyoruz. Derleme ilemi
ardndan hata mesaj ile karlarsanz bunun nedeni OpenCV ktphanesinin derlendii sdk
versiyonunun sisteminizde kurulu olmamasdr. SDK Manager ile istenilen srmn kurabilirsiniz.

Kullandnz SDK srm ile tekrardan derleyerek te bu hatay ortadan kaldrabilirsiniz. Bunun iin
yapmanz gereken, Project mensnden projenizin altnda OpenCVLibrary altndaki (grnm Project
Files olarak deitirmelisiniz) build.grandle dosyasn anz. Android altnda derleme iin kullanacanz
sdk srmn ve buildToolVersion ekleyiniz. Tekrar bir derleme ileminin ardndan hata ortadan
23

kalkacaktr.
Daha sonra File mensnden Project Structurea tklayarak veya Ctrl+Alt+Shift+S ksa yolu ile Project
Structure penceresini ayoruz. Dependencies sekmesine gelerek sa tarafta yer alan + butonuna
tklyoruz, buradan Module dependency seenei ile alan pencereden daha nce eklediimiz
openCVLibrary moduln seiyoruz tamam diyerek pencereleri kapatyoruz. Tekrarlanan bir derleme
ilemi ardndan OpenCV paketleri kullanm iin hazr olacaktr.

TEMEL DJTAL GRNT LEME KAVRAMLARI


Dijital grnt ileme ile ilgili birok kavrama aina olabilirsiniz fakat bu kavramlarn ok iyi bir ekilde
bilinmesi nem arz etmektedir. Bu nedenle baz grnt ileme kavramlarn ne olduunu aklamaya
alacam. Bu tanmlar ansiklopedik olarak deil, grnt ilemede neyi ifade ettiklerine gre olacaktr.

Dijital Grnt: Gerek yaamdaki analog bir verinin kamera gibi donanmlar kullanlarak dijital bir hale
getirilmesiyle olumaktadr. Bu veri 1 ve 0 ile dijital olarak tanmlanp, analog karlna denk
gelmektedir. Dijital grnt 2 boyutlu bir dizi yani satr ve stun veya renk uzayna gre farkl boyutlara
sahip matris olarak depolanabilmektedir.

Piksel: Dijital bir grntnn satr ve stun olarak barndrlabileceini sylemitik, bu dijital grntde
satr ve stunlarn kesitii noktalar piksel olarak adlandrlmaktadr yani her bir hcreye piksel
denilmektedir. Bu durumda piksel dijital grnty oluturan en kk birimdir.

Yukardaki grselde grnd zere bir dijital grntnn seili blgesinden kesit alnm ve bu kesitin
dijital olarak nasl tutulduu gsterilmitir. Alnan kesit 88 boyutunda bir dizidir, bu dizinin her bir
elamannn tuttuu veri ise dijital grntnn o pikselindeki renk bilgisine karlk gelmektedir.

FPS (Frame Per Second): Saniyedeki ereve says olarak tanmlanr. Video aygtlarnda ve grafik
kartlarnda ayrt edici bir kriterdir. Bu grntleme aygtlarnn bir saniyede rettii grnt saysn ifade
eder. Fps deeri ne kadar yksek ise saniyede yakalanan grnt says artacak ve en kk deiiklikler
bile yakalanabilecektir. Grnt ileme projelerinizde kullandnz kameralarn fps deerinin yksek
olmas nemlidir. yle rnekleyebiliriz: Bir fabrikada retim bandndan saniyede 10 adet rn retilerek
getiini dnelim, gelitirdiimiz yazlm ise geen bu rnleri yakalayp analiz edecek ve kalite
24
kontrol yapacak olsun. Setiimiz kamera aygtnn fps deeri dk olur ise geen ilk 10 rn
yakalasak bile ardndan gelecek 10 rn kamera aygt karabilir, nk retim bandnn hz kamera
aygtnn saniyede yakalayabildii grnt detinden fazladr.

RENK UZAYLARI

Renk Uzay
Renk eitliliinin fazla olmas nedeniyle bu renkleri gruplama ihtiyac domutur bu renkleri gruplamak
ve standartlatrmak iin renk uzay (color space) kavram ortaya kmtr. Her renk uzay, renk kmesini
tanmlamak iin kendine zg bir yapya sahiptir. rnein siyah beyaz bir grnty dijitalletirmek iin
ok fazla kavrama gerek yoktur. Grnt siyah ve beyaz olmak zere 2 adet deikene sahiptir. 300300
boyutunda dijital siyah beyaz bir grnt dijitalletirilip renklendirilirken, 300300 boyutunda bir dizi
oluturulur. Renklendirme ilemi iin ise 2 adet deiken olduu iin 1 ve 0 yeterlidir. Fakat renkli bir
resim zerinde farkl renk tonlar olaca iin 1 ve 0 ile bu grnty tanmlamak yetersiz olacaktr. Bu
farkl durumlar iin eitli renk uzaylar belirlenmitir. En ok kullanlan ve kitap boyunca yer alacak
rneklerde de kullanlan renk uzaylarna gz atalm.

RGB Renk Uzay: Bu renk uzay Red Green Blue yani krmz, yeil ve mavi renklerin ba harfi ile
adlandrlmtr. Renkler bir kp olarak tanmlanr bu tanmla sayesinde 3 deikenli bir dizi elde edilir.
Bu dizi elemanlar olan hcreler yani pikseller, bir rengi tutabilmek iin 3 renk olan krmz, yeil ve mavinin
belirli younlukta kartrlmas ile elde edilen renk kodunu tutarlar.
25
HSV Renk Uzay: HSV Hue, Saturation, Value yani renk z, doygunluk ve parlaklk olarak
adlandrlmtr. Anlald zere renk tanmlamalarn bu kavrama gre gerekletirir.

CMYK Renk Uzay: Cyan, Magenta, Yellow, Key rengin ksaltmasdr. Buradaki key siyah rengi temsil
etmektedir. CMYK renk uzay, dijital renk tanmlamalar iin belirtilen bu drt rengi kartrarak
yapmaktadr.
26
YUV Renk Uzay: Y Luminance, U Chrominance1, V Chrominance2 ksaltmasdr. Y siyah beyaz U ve
V ise mavi tabanl renklilik ve krmz tabanl renklilii temsil eder. Renkler bu kavram ile temsil edilerek
oluturulurlar.

Bizim iin dijital grnt ilemede en nemli olan renk uzaylarn tanmladk. Dier renk uzaylarna ise
OpenCV ile renk uzaylar aras dnm konusunda kullandka deineceim.

DOSYA SSTEMNDEN GRNT OKUMA


OpenCV ile dosya sisteminden grnt dosyas okumak iin Imgcodecs paketi ierisindeki imread
metodu kullanlmaktadr. Bu konu ncesinde nemli bir snf olan Mat snfna gz atalm. Mat tipi olarak
da adlandrabileceimiz bu snf, grnt barndrma ilevine sahiptir. Okunan grnt dosyalar OpenCV
ktphanesin de mat snfnda tutulmaktadr. Alnan grnt renk uzayna gre farkl boyutlarda
olabilecek dizi haline getirilerek bu tip ierisinde tutulur. Bir rnek yapalm ve dosya sisteminden grnt
okuyarak bunu mat tipi ierisinde tutalm.
27
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;

public class Giris {


public static void main(String[] args) {
//sistem ktphanesini ykleme
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
//grnty barndracak nesne
Mat imageArray;
//grnt dosyasn oku
imageArray=Imgcodecs.imread("C:\\Users\\mesutpiskin\\resim.jpg");
//mat nesnesinin satr ve sutun says
System.out.println(imageArray.rows());
System.out.println(imageArray.cols());
}
}

OpenCV ktphanesini kullanmak iin native ktphaneyi yklememiz gerekmekte, bunun iin
loadLibrary metotu ile bu ilemi yapyoruz. Bir adet mat nesnesi tanmlyoruz bu nesne ile okunacak olan
grnty zerinde ilem yapmak iin barndrabileceiz. Imgcodecs.imread ile parametre olarak
bulunduu dosya adresi verilen resim.jpg resmini okuyoruz. Okunan bu resim dosyasn dijital olarak
imageArray mat nesnesi tutmaktadr, artk bu nesne zerinden o grntye ulaabiliriz. Resim dosyas
okunduunda bu resmin eni ve boyu kadar mat nesnesi boyutlandrlr ve satr, stn saysn
yazdrdmzda resmin satr stun saysn elde edebiliriz, satr ve stun arpm ise ka adet piksele
(hcreye) sahip olduunu gsterecektir.

Yukardaki rnei OpenCV 3.x srm yerine OpenCV 2.x srm ile gerekletirecek olursak deien
tek ey imread metodunu ardmz snf olacaktr. OpenCV 2.x srm grnt okuma, yazma
ilemleri Highgui ile yaplmaktayd, 3.x srm ile birlikte bunlar Imgcodecs ierisine tanmtr.

import org.opencv.highgui.*;
...
imageArray=Highgui.imread("C:\\Users\\mesutpiskin\\resim.jpg");
...

VDEO AYGITLARINDAN GRNT OKUMA


Usb kameradan, ip kameradan, video dosyasndan veya bir video kaynandan kayt almak iin videoio
paketi ierisindeki VideoCapture snf kullanlmaktadr. Bir rnek ile nasl kullanldna gz atalm.
28
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.videoio.VideoCapture;

public class Kamera {


public static void main(String[] args) {
// sistem ktphanesini ykleme
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
// grnty barndracak nesne
Mat imageArray = new Mat();
// video aygtlarna eriim salar
VideoCapture videoDevice = new VideoCapture();
// varsaylan video aygtn balatr
videoDevice.open(0);
// video aygt balants yapld m?
if (videoDevice.isOpened()) {
// video aygtndan bir kare oku ve mat nesnesine yerletir
videoDevice.read(imageArray);
// alnan dijital grnt bilgileri
System.out.println(imageArray.toString());
// video aygtn setbest brak
videoDevice.release();
} else {
System.out.println("Video aygtna balanlamad.");
}
}
}

VideoCapture snfndan oluturulan nesne, video aygtn balatmaktadr. Bu nesnenin open() metodu
string ve int olarak parametre almaktadr. string olarak verilen parametre video dosyasnn yolunu,
rnein C:\video.avi gibi veya yayn yapan bir ip kamerann adresini (http://192.168.1.2/mjpg/video.cgi)
alabilir.

int tipinde verilen parametreler ise rnekte de olduu gibi sisteme takl olan kameralarn numaralardr.
Parametre olarak 0 verildiinde sistemdeki varsaylan video aygtna balanr. Sistemdeki baka bir
kameraya eriim salanlmak isteniyorsa int olarak 1, 2, 3 gibi numaras verilerek balanlabilinir.
isOpen() metodu ile de balant durumu kontrol edilebilir. VideoCapture snfndan oluturulan nesnenin
read() metodu ile de aygttan bir kayt alnr ve mat nesnesi ierisinde barndrlr. Kamera balantsn
kapatmak iin ise release() metodu kullanlr, bu metot kullanlmaz ve video aygt balants kesilmez ile
29
srekli olarak bir grnt ak gerekletirilebilir. imageArray olarak adlandrlan mat nesnesinin
toString() metodu ile satr, stun veya adresi gibi temel bilgilerine eriilebilir. Video aygtndan alnan
grnt imageArray ierisine aktarlr ve bu nesneye ilikin bilgiler ekranda gsterilir.

OpenCV Javada Resim Grntleme imshow Metodu

OpenCV ierisinde yer alan imshow() metodu parametre olarak verdiiniz bir mat nesnesini resim tipine
dntrerek bir pencere ierisinde ekranda gsterir. Bu metot, C++ ve Python dilleri tarafndan
desteklenmektedir. Yeni balayanlar rneklerde sklkla grd bu metodu Java da denediinde
metodun olmadn grmtr. Sklkla bu imshow() yerine hangi metot var sorusu gelmektedir, bu
yzden mat tipinin nasl image tipine dntrleceini ve frame ierisinde gsterilebileceini
anlatacam. Tabi bunlar swing ktphanesi yardmyla gerekletiriyor olacaz. JavaCV ktphanesini
kullanrsanz imshow metodu burada yer almaktadr.

Mat tipi bildiiniz zere grntnn renk deerlerinin, renk uzay ile birlikte saysal olarak ifade edilip
matris olarak tutulduu nesnelerdir. ncelikli olarak bu deerleri okuyup image nesnesine daha sonrada
bu image nesnesini frame nesnesi ierisinde grntleyeceiz.

ncelikle mat nesnesini buffered image nesnesine evirelim

private static BufferedImage ConvertMat2Image(Mat kameraVerisi) {

MatOfByte byteMatVerisi = new MatOfByte();


// Ara bellee verilen formatta grnt kodlar
Imgcodecs.imencode(".jpg", kameraVerisi, byteMatVerisi);
// Mat nesnesinin toArray() metodu elemanlar byte dizisine evirir
byte[] byteArray = byteMatVerisi.toArray();
BufferedImage goruntu = null;
try {
InputStream in = new ByteArrayInputStream(byteArray);
goruntu = ImageIO.read(in);
} catch (Exception e) {
e.printStackTrace();
return null;
}
return goruntu;
}

Daha sonra frame ierisinde grntleyelim. Eer gerek zamanl bir i yapacaksanz ve srekli olarak
ekrana yakalanan grnty basacaksanz bu metodu her ardnzda yeni bir frame ierisinde
aacaktr bu durumda uygulamann kilitlenmesi ile sonulanacaktr. Bu sorunu amak iin aadaki
30
yntemi uygulayacaz ve bir kurucu metot yazarak gerekli nesnelerin tek bir defa oluturulmasn
salayacaz.

// Bir frame (ereve) oluturur


public static void PencereHazirla() {
frame = new JFrame();
frame.setLayout(new FlowLayout());
frame.setSize(700, 600);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

// Resmi gsterecek label oluturur


public static void PushImage(Image img2) {
// Pencere oluturulmam ise hazrlanr
if (frame == null)
PencereHazirla();
// Daha nceden bir grnt yklenmi ise yenisi iin kaldrr
if (lbl != null)
frame.remove(lbl);
icon = new ImageIcon(img2);
lbl = new JLabel();
lbl.setIcon(icon);
frame.add(lbl);
// Frame nesnesini yeniler
frame.revalidate();
}
rnek kullanm;

public static void main(String[] args) {

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
VideoCapture capture = new VideoCapture(0);
Mat camImage = new Mat();
if (capture.isOpened()) {
while (true) {
capture.read(camImage);
PushImage(ConvertMat2Image(camImage));
}} }
31
GRNT STREAM ETME
Daha ncelerde opencv kurulumuna ve eclipse iin yaplandrmasna bakmtk ,imdi sistemdeki
kameralar zerinden grnt alma ileminin nasl yapldna gz atacaz.Opencv 3.0 srmn
kullanrsanz 3.0 ile baz paketler ve snflar deiiklie urad iin problemler ile karlaabilirsiniz bu
yzden bu rnek iin 2.x srmlerini kullanmanz neririm.

3 Adet snfmz olacak bir tanesi kameraya balanmak bir tanesi resimleri yakalamak dieri ise frame
snf webcam grntsn form zerinde grntlemek iin.

Mat2Image snfmz:

import java.awt.image.BufferedImage;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class Mat2Image {


Mat mat = new Mat();
BufferedImage img;
byte[] dat;
public Mat2Image() {
}
public Mat2Image(Mat mat) {
getSpace(mat);
}
public void getSpace(Mat mat) {
this.mat = mat;
int w = mat.cols(), h = mat.rows();
if (dat == null || dat.length != w * h * 3)
dat = new byte[w * h * 3];
if (img == null || img.getWidth() != w || img.getHeight() != h
|| img.getType() != BufferedImage.TYPE_3BYTE_BGR)
img = new BufferedImage(w, h,
BufferedImage.TYPE_3BYTE_BGR);
}
BufferedImage getImage(Mat mat){
getSpace(mat);
mat.get(0, 0, dat);
32

img.getRaster().setDataElements(0, 0,
mat.cols(), mat.rows(), dat);
return img;
}
static{
//Open cv native library
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
}

VideoCap snf web kameralar yakalayacamz snf

import java.awt.image.BufferedImage;
import org.opencv.core.Core;
import org.opencv.highgui.Highgui;
import org.opencv.highgui.VideoCapture;

public class VideoCap {


static{
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}

VideoCapture cap;
Mat2Image mat2Img = new Mat2Image();

VideoCap(){

cap = new VideoCapture();


//Baz kameralarda sorun kartabilecei iin boyutlar olduka kk
olarak ayarladm kameranza gre hd olarak deitirebilirsiniz
cap.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, 50);
cap.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, 50);
/*0 yaparsanz varsaylan kamera alr birden fazla kamera var ise 1 , 2
,3 eklinde numalar devam edektir. linux kullanyorsanz lsusb ile bal usb
kameralar grntleyebilirsiniz.*/
cap.open(0);
}
33

BufferedImage getOneFrame() {
cap.read(mat2Img.mat);
return mat2Img.getImage(mat2Img.mat);
}
}

JFrame den kaltlm snfmzda frame zerinde kamera grntsn oynatacaz.

import java.awt.EventQueue;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class MyFrame extends JFrame {


private JPanel contentPane;

/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MyFrame frame = new MyFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame.
*/
public MyFrame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
34

setBounds(100, 100, 650, 490);


contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);

new MyThread().start();
}

VideoCap videoCap = new VideoCap();

public void paint(Graphics g){


g = contentPane.getGraphics();
g.drawImage(videoCap.getOneFrame(), 0, 0, this);
}

class MyThread extends Thread{


@Override
public void run() {
for (;;){
repaint();
try { Thread.sleep(30);
} catch (InterruptedException e) { }
}
}
}
}

P KAMERADAN GRNT OKUMA


p kameralar salad kullanm kolayl, sunucu zerinde grnt ilemek veya kamera sisteminin
kurulduu alan dnda grntleri yorumlamak amacyla sklkla tercih edilirler. Baz kamera aygtlar
zerinde kendi mikro ilemcisi olabilir ve grnt aktarmaya ihityac duymadan burada ilenebilir. Bizim
konumuz bu kameralar deil, yakalad grnty zerinde bulunan web sunucu araclyla a zerinde
yaynlayabilen kameralar. Bu kameralar sabit ip adresi zerinden yayn yaparlar. Benim kullandm ip
kamera 192.168.1.51 ip adresinden yayn yapyor, bu adrese tarayc araclyla balantmzda 8080
veya sizin atadnz varsaylann dnda bir portt ile zerindeki web sunucusuna eriiriz. Burada grnt
ayarlar ierisinde format ksmn mjpg olarak deitiriyoruz.
35
Birok yksek znrlkl kamera farkl formatlarda yayn yapyor ve bu formatlar OpenCV araclyla
okumak zor olduu iin aygtnz destekliyorsa mjpg yapmanzda fayda var. Kamera yayn iin bir adres
vercektir benim kameram http://192.168.1.51/mjpg/stream.cgi adresinden yayn yapyor. Bu ksmdan
sonra bu grnty dosya sisteminden okur gibi okuyabiliyoruz. imdi ip kameraya balanalm ve bir
kare yakalayalm.

public static void main(String[] args) {


System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat imageArray = new Mat();
VideoCapture videoDevice = new VideoCapture();
// verilen adresteki yayn yakalar
videoDevice.open("http://192.168.1.51/mjpg/stream.cgi");
// video aygt balants yapld m?
if (videoDevice.isOpened()) {
// video aygtndan bir kare oku ve mat nesnesine yerletir
videoDevice.read(imageArray);
videoDevice.release();
} else {
System.out.println("IP kamera aygtna balanlamad.");
}
}

VideoCapture snfnda bulunan set() metodu ile video aygtlar iin baz ayarlar yaplandrabiliriz. int
tipinde id ve paramtere deerini alr. get() metodu ile de deerleri grebilirsiniz. propId olarak tanmlanan
int tipinde verilecek atanacak olan zelliin id deeridir. Dorudan int tipinde id deeri verilebilecei gibi
3.x ncesi srmlerde Highgui 3.x srmlerde ise Videoio ierisindeki int deikenleride dorudan
kullanabilirsiniz. VideoCapture snfnda kullanlabilecek baz parametrelere gz atalm.

VideoCapture videoDevice = new VideoCapture(0);

//zellik id ve deer olarak atanr


videoDevice.set(propId, value);

//Dorudan deilen ismi kullanarak da atanabilir


videoDevice.set(Videoio.CV_CAP_PROP_FRAME_WIDTH, 1024);

Kullandnz IDE ile OpenCV paketleri ierisinde yer alan Videoio snfna eerki eski bir OpenCV
srm kullanyorsanz Highgui snfna giderek buradaki parametrelere gz atabilirsiniz.
Kullanabileceiniz tm parametreler ve id deerleri burada yer almaktadr. Veya aadaki balantdan
direk olarak videoio snfna gz atabilirsiniz.
36
http://docs.opencv.org/java/3.0.0/org/opencv/videoio/Videoio.html

NOT: Paket dhilindeki snflara gz atmak iin snf zerine sa tklayarak Open Declaration demeniz
yeterli olacaktr.

CV_CAP_PROP_POS_MSEC

Video dosyasndan okuma yaparken mili saniye cinsinden o anki video zamann ynetir.

CV_CAP_PROP_FRAME_WIDTH

Okunan grntnn geniliini ynetir. Grnt genilii deitirilebilir yada okunan grntnn genilii
renilebilir.

CV_CAP_PROP_FRAME_HEIGHT

Okunan grntnn yksekliini ynetir. Grnt ykseklii deitirilebilir yada okunan grntnn
ykseklii renilebilir.

CV_CAP_PROP_FPS

Grntnn saniyedeki kare hzn ifade eden FPS deeri deitirilebilir.

CV_CAP_PROP_FOURCC

Kodek deitirilebilir. Kodek drt karakterlik kod ile ifade edilir.

CV_CAP_PROP_FRAME_COUNT

Grntnn ereve (frame) saysna eriilebilir.

CV_CAP_PROP_FORMAT

Mat nesnesinin format deitirilebilir.

CV_CAP_PROP_BRIGHTNESS

Grntnn parlaklk deeri deitirilebilir. Bu parametre sadece kamera aygtlar iin geerlidir.

CV_CAP_PROP_CONTRAST

Grntnn kontrast deeri deitirilebilir. Bu parametre sadece kamera aygtlar iin geerlidir.

CV_CAP_PROP_SATURATION

Grntnn doygunluk deeri deitirilebilir. Bu parametre sadece kamera aygtlar iin geerlidir.

CV_CAP_PROP_HUE

Grntnn renk tonu deitirilebilir. Bu parametre sadece kamera aygtlar iin geerlidir.
37
CV_CAP_PROP_CONVERT_RGB

Grntnn RGB renk uzayna dntrlmesi gerekiyor ise kullanlr.

CV_CAP_PROP_WHITE_BALANCE

Grntnn beyaz dengesi deitirilebilir.

CV_CAP_PROP_ISO_SPEED

Kamera aygtnn ISO hz deitirilebilir. Tm aygtlar iin desteklenmemektedir.

CV_CAP_PROP_BUFFERSIZE

Ara bellee alnacak olan ereve (frame) miktar deitirilebilir.

GRNT YAZMA (VDEOWRTE )


Daha nceki rneklerde dosya sisteminden ve video aygtlarndan nasl grnt okunabileceine ve bu
grntleri nasl barndrabileceimize bakmtk. Okunan grntnn tekrardan yazlmas ilemi ise
Imgcodecs snf ierisindeki imwrite() metodu ile yaplmaktadr. Bu metot parametre olarak dosya ad ve
mat tipinde grnt dizisi almaktadr.

Imgcodecs.imwrite("dosyadi.jpg", matArray);

Video olarak yazma ilemi iin ise VideoWrite snf kullanlmaktadr. Open metodu kullanmnda filename
dosya dizini ve ad, fourcc yerine codec, fps yerine fps oran, frameSize yerine Size olarak en boy oran
verilmektedir. Write metodu ise bir mat tipinde nesne almaktadr. Release metodu ile ise ilem
sonlandrlabilmektedir.

VideoWriter videoYazici=new VideoWriter();


videoYazici.open(filename, fourcc, fps, frameSize);
videoYazici.write(matImage);
videoYazici.release();

PKSEL LEMLER
Piksel kavramn daha nce aklamtk, pikseller mat nesnesi ierisindeki dizi elemanlarna karlk
gelmektedir. Bir grnt zerinde ilem yapmak istediimizde dizideki elemanlar kullanmamz
gerekmektedir. OpenCV ierisinde yer alan birok metot piksel ilemlerini kendisi yapmaktadr. rnein
bir grnty kopyalamak istediimizde copy metodunu kullanabiliriz fakat bu metotlarn nasl altn
anlamak iin veya kendi algoritmanz gelitirmek zorunda kaldnzda bu bilgiler iinize yarayacaktr.
Basit bir uygulama yazalm ve bu uygulama kameradan okunan grnty mat nesnesi ierisinde tutalm
ve bu nesneyi bir baka mat nesnesi ierisine kopyalayarak dosya sistemine kaydedelim. Bu rnek ile bir
piksele nasl ulaabileceimizi de renmi olacaz.
38
N BLG: Her grnt renk uzayna gre eitli formatlarda, dijital olarak dizi eklinde tutulur. Her piksel
bir dizi elamandr ve grnt zerinde yaplan her ilem iin dizi elemanlar arasnda dnlr ve istenilen
ilem piksel baznda gerekletirilir. Grnt ilemenin temelinde bu vardr.

public static void main(String[] args) {


System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat imageArray = new Mat();
VideoCapture videoDevice = new VideoCapture();
videoDevice.open(0);
if (videoDevice.isOpened()) {
videoDevice.read(imageArray);
videoDevice.release();
} else {
System.out.println("Video aygtna balanlamad.");
return;
}
//Okunan grnty kopyalamak iin yeni bir mat nesnesi
Mat newimageArray=new Mat();
/*
* Yeni nesnenin satr ve sutun saysn alnan grntnn satr sutun
saysna eitliyoruz
* create metodu ile oluturakacaj nat nesnesinin satr ve stnunu
veriyoruz. */
newimageArray.create(imageArray.rows(), imageArray.cols(), CvType.CV_8UC1);
//Dng ile alnan grnt dizisinin tm elemanlar arasnda dnyoruz
for(int i=0; i<imageArray.rows();i++)
{
for(int j=0;j<imageArray.cols();j++)
{
/* put ile verilen indise yani piksele deer atanr
* get ile verilen indisdeki piksel deeri okunur
* /
newimageArray.put(i, j, imageArray.get(i, j));
}
}
Imgcodecs.imwrite("KopyaGoruntu.jpg", newimageArray);
System.out.println("Grnt dosya sistemine yazld.");
}
39
Bir piksele yani dizi elemanna erimek iin get() metodu, belirli indisteki bir piksele deer yazmak iin
ise set() metodu kullanlr.

MATRS ZERNDE ZM LEMLER


Mat nesnesi zerinde izim yapmak yani dikdrtgen, daire, kare, izgi izmek veya metin yazdrmak gibi
ilemler iin imgproc snf kullanlmaktadr. Bu snf ierisinde yer alan metotlardn farkl parametrelere
sahip ar yklenmi (override) alternatifleri bulunmaktadr.

Dikdrtgen izmek iin imgproc ierisindeki rectangle metodunu kullanacaz. Aadaki rnekte
dosyadan bir resim dosyas okunuyor ve bu resim dosyas zerine belirlenen konuma belirlenen renk ile
bir kare iziliyor. lemin ardndan dzenlenen grnt tekrardan dosya dizinine yazlyor.

public class Dikdortgen {

public static void main(String[] args) {

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat goruntuDizisi=new Mat();
goruntuDizisi=Imgcodecs.imread("C:\\kiz_kulesi.jpg");
/* rectangle metodu paramatetre olarak, zerinde izim yaplacak bir mat
nesnesi
* dikdrtgen izimi iin gerekli olan 4 kenin koordinat ve rengini
almaktadr.
* */
Imgproc.rectangle(goruntuDizisi, new Point(10,100), new Point(100,200),new
Scalar(76,255,0));
Imgcodecs.imwrite("C:\\Yeni_kiz_kulesi.jpg", goruntuDizisi);
System.out.println("Dzenlenen grnt dosya sistemine yazld.");
}
}
40
Point tipinde dikdrtgenin ke koordinatlarn (x,y), scalar ile de dikdrtgenin rengini veriyoruz. Buradaki
nemli nokta renkleri belirtmek iin kullandmz scalar snf. Bu snf core paketi ierisinde
bulunmaktadr ve RGB renkleri belirtmek iin kullanlabilir. Scalar parametre almaktadr ve bu
parametreler tahmin edebileceiniz zer RGB (Krmz Yeil Mavi) deerleridir. Fakat RGB deerlerini
BGR (Mavi Yeil Krmz)olarak tersten vermemiz gerekmektedir.

izgi izmek iin ise line() metodu bulunmaktadr. zerinde ilem yaplmak iin bir mat nesnesi ve point
tipinde x, y koordinatlar ve rengini parametre olarak almaktadr.

Imgproc.line(mat, point, point, color);

Daire izmek iin circle() metodu bulunmaktadr. Parametre olarak ilem yaplacak mat tipinde grnt,
point tipinde merkez koordinat, int tipinde yarap ve renk almaktadr.

Imgproc.circle(mat, point, int, color);

okgen (Poligon) izmek iin polylines() metodu bulunmaktadr. Parametre olarak ilem yaplacak mat
tipinde grnt nesnesi, MatOfPoint tipinde liste olarak ke koordinatlar, bool tipinde aklk kapallk
durumu ve renk almaktadr. Buradaki isClosed kapal olarak atanrsa her erinin son kesine bir izgi
izer.

Imgproc.polylines(mat, point, isClosed, color);

Yaz yazmak iin ise putText() metodu bulunmaktadr. Parametre olarak ilem yaplacak mat nesnesi,
yazlacak olan string metin, point olarak koordinat, metinsel ifadenin fontu, double tipinde fontun lei
ve renk almaktadr.

Imgproc.putText(mat, text, point, fontFace, fontScale, color);

Ok izmek iin ise yine izgi izmek iin kullanlana benzer arrowedLine() metodu bulunmaktadr. Bu
metot bir mat nesnesi, point tipinde 2 adet koordinat ve renk almaktadr.

Imgproc.arrowedLine(mat, point1, point2, color);


41
GRNT KIRPMA
Bir nceki yaz olan matris zerinde izim ilemlerinde kz kulesi zerine bir dikdrtgen izmitik, imdi
bir rnek yapalm ve bu geometrik ekillerin kullanm alanlarn daha iyi kavrayalm. Bir dikdrtgen
nesnesi oluturacaz ve okunana grnty bu dikdrtgen boyutlarnda krparak grnt ierisinden
kartacaz.

public static void Kirp(String[] args) {

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

Mat goruntuDizisi = new Mat();


goruntuDizisi = Imgcodecs.imread("C:\\kiz_kulesii.jpg");
//Dikdrtgen olluturuyoruz ve koordinatlarn belirliyoruz
Rect dikdortgen=new Rect(new Point(10,100),new Point(100,200));
//Yeni bir mat nesnesi oluturuyoruz ve okunan grntye dikdrtgen
ebatlarnda krpma ilemi uyguluyoruz
Mat yeniGoruntu=new Mat(goruntuDizisi,dikdortgen);
Imgcodecs.imwrite("C:\\Yeni_kiz_kulesi.jpg", yeniGoruntu);

JAVA GUI UYGULAMALAR


Uygulamalarda grsellik olduka nemlidir, gelitirmekte olduunuz OpenCV projesi mteri odakl bir
yazlm olabilir ve bu yazlmda yaplan ilemlerin yani ilenen grntnn, uygulanan filtrelerin veya
zerine izim yaplan grntnn anlk olarak kullancya gsterilmesi gerekebilir. Java da GUI (Grafiksel
42
kullanc arabirimi) uygulamalar iin genellikle swing tercih edilir fakat swing kullanmak zorunda deilsiniz
bu blmde reneceklerinizi dier ktphaneler ile de kullanabilirsiniz bu konuda bir snrlama yoktur.

EK BLG: Netbeans kullanyorsanz ayrca bir swing kurulumuna ihtiyacnz yoktur projenize new/frame
diyerek bir ereve ekleyerek tasarm aracn kullanarak grafiksel ara yzler gelitirebilirsiniz. Eclipse
kullanyorsanz Help mensnden Install new software.. seeneine tklayarak alan penceredeki Work
with ksmndan All Available Sites seiniz, ardndan General Purpose Tools seenei altndan swing
bileenini seerek kurabilirsiniz.

OpenCV ierisinde GUI ilemleri iin baz snflar bulunmaktadr, daha ok C++ gelitiricilerine ynelik
olarak eklenen bu snflar ve metotlar ile pencere oluturma ve resim grntleme ilemleri
yaplabilmektedir. Java ile GUI uygulamalar iin ok fazla ktphaneler olduu iin projelerinizde bunlar
kullanmanz doru bir seim olacaktr zira uygulamalar sadece video oynatmak ve resim
grntlemekten ibaret olmayacaktr.

OpenCV de grntleri dijital olarak mat nesneleri ierisinde barndryoruz. Bu dijital grnty
kullancya gstermek iin bu nesne ierisindeki verileri (pikselleri) okuyup, yorumlayp bir resim haline
getirmemiz gerekiyor. Oluan bu resmi ise bir frame veya panel ile kullancya gsterebiliriz veya okunan
grntler dosya sistemine yazlr ve Javadaki io snf ile bu grnt okunarak grntlenebilir.

Bir rnek yapalm ve kameradan alnan grntleri anlk olarak frame zerinde grntleyelim.

import java.awt.FlowLayout;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.videoio.VideoCapture;

public class Swing {

static JFrame frame;


static JLabel lbl;
static ImageIcon icon;
43
public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat kameraVerisi = new Mat();
VideoCapture videoDevice = new VideoCapture();
videoDevice.open(0);
if (videoDevice.isOpened()) {
//Sonsuz bir dng ile srekli olarak grnt ak salanr
while (true) {
videoDevice.read(kameraVerisi);
//Yakalanan grnty nce dntr ve frame ierisine ykle
GoruntuYukle(GoruntuyuDonustur(kameraVerisi));
}
} else {
System.out.println("Video aygtna balanlamad.");
return;
}
}
//Mat nesnesini image tipine dntr
private static BufferedImage GoruntuyuDonustur(Mat kameraVerisi) {
MatOfByte byteMatVerisi = new MatOfByte();
//Ara bellee verilen formatta grnt kodlar
Imgcodecs.imencode(".jpg", kameraVerisi, byteMatVerisi);
//Mat nesnesinin toArray() metodu elemanlar byte dizisine evirir
byte[] byteArray = byteMatVerisi.toArray();
BufferedImage goruntu = null;
try {
InputStream in = new ByteArrayInputStream(byteArray);
goruntu = ImageIO.read(in);
} catch (Exception e) {
e.printStackTrace();
return null;
}
return goruntu;
}
44
//Bir frame (ereve) oluturur
public static void PencereHazirla() {
frame = new JFrame();
frame.setLayout(new FlowLayout());
frame.setSize(500, 600);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//Resmi gsterecek label oluturur
public static void GoruntuYukle(Image img2) {
//Pencere oluturulmam ise hazrlanr
if (frame == null)
PencereHazirla();
//Daha nceden bir grnt yklenmi ise yenisi iin kaldrr
if (lbl != null)
frame.remove(lbl);
icon = new ImageIcon(img2);
lbl = new JLabel();
lbl.setIcon(icon);
frame.add(lbl);
//Frame nesnesini yeniler
frame.revalidate();
}
}

Daha nce yaptmz gibi video aygtndan bir grnt aldk, anlk olarak ak salamak iin bu grnt
alma ilemini dng ierisine aldk bu sayede srekli olarak video aygtndan grnt ak saland.
Alnan grnt mat nesnesinden bellee alnd ve image olarak dntrld, bir dnm ilemi
yapmadan mat tipi olarak swing veya dier Java GUI ktphaneleri bu grnty ileyemezler.
45
Anlk olarak bir grnt ak elde ettik. Bu ak bir biri ardna devam eden grntlerin birlemesi ile elde
edildi ve bu sayede grnt zerinde istediimiz deiiklii yapabiliriz. Daha nce grdmz, grnt
zerine ekil izme veya metin yazdrma ilemlerini de uygulayabiliriz. Bir rnek yapalm ve aktaki
grntlere mdahale ederek baz deiiklikler yapalm.

public static void main(String[] args) {


System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat kameraVerisi = new Mat();
VideoCapture videoDevice = new VideoCapture();
videoDevice.open(0);
if (videoDevice.isOpened()) {
//Sonsuz bir dng ile srekli olarak grnt ak salan
while (true) {
46
videoDevice.read(kameraVerisi);
//Metin yaz
Imgproc.putText(kameraVerisi, "OPENCV & JAVA", new
Point(100,300),2, 2, new Scalar(27,228,94));
//izgi iz
Imgproc.line(kameraVerisi, new Point(100,250), new Point(400,250),
new Scalar(207,28,228));
//Yakalanan grnty nce dntr ve frame ierisine ykle
GoruntuYukle(GoruntuyuDonustur(kameraVerisi));
}
} else {
System.out.println("Video aygtna balanlamad.");
return;
}
}

47
Video dosyasndan ve ip kameradan grnt oynatmak iin ise daha ncede grdmz gibi
VideoCapture snfndan oluturulan nesnenin, kurucu metodunda veya Open metodunda video
dosyasnn veya ip kamerann adresini vermeniz yeterli olacaktr.

RENK UZAYLARI ARASI DNMLER


Daha nce temel dijital grnt ileme kavramlar blmnde renklere ve renk uzaylarna deinmitir.
OpenCVde birok renk uzay desteklenmektedir ve bunlar arasnda dnm yaplabilmektedir. Bu
blmde OpenCV ile bu renk uzaylar arasnda dnm ilemleri iin Imgproc snf ierisinde cvtColor()
metodu bulunmaktadr. cvtColor metodu parametre olarak iki adet mat nesnesi ve dnm yaplacak
olan renk uzayn almaktadr.

Imgproc.cvtColor(srcMat, dstMat, code);

srcMat: kaynak bir mat nesnesi yani dnm yaplacak olan grnt, dstMat: hedef mat nesnesi yani
dnm sonucunda oluacak yeni renk uzayna sahip grnt, code ise hangi renk uzaylar arasnda
dnm yaplacadr. Desteklenen baz renk uzaylar aadaki tabloda yer almaktadr.

Kaynak Renk Uzay 2 Hedef Renk Uzay

COLOR_RGB2BGR
COLOR_RGB2BGRA
COLOR_RGB2GRAY
COLOR_GRAY2RGB
COLOR_RGB2HLS
COLOR_HSV2RGB
COLOR_RGB2HSV
COLOR_RGB2Luv
COLOR_HSV2RGB
COLOR_RGB2YUV
COLOR_RGB2Lab

RGB HSV Renk Dnm


RGB (Red Greeb Blue Krmz Yeil Mavi) renk uzayndan HSV (Hue Saturation Value Renk tonu
Doygunluk Deer) renk uzayna dnm;

public static void main(String[] args) {


System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat kaynakGoruntu=new Mat();
kaynakGoruntu=Imgcodecs.imread("C:\\kizkulesi.jpg");
Mat hedefGoruntu=new Mat();
48
//Okunanan RGB grnty HSB renk uzayna evirerek hedefGoruntu mat
nesnesine atar
Imgproc.cvtColor(kaynakGoruntu, hedefGoruntu, Imgproc.COLOR_RGB2HSV);
Imgcodecs.imwrite("C:\\ kizkulesiHSV.jpg", hedefGoruntu);
}

RGB GRAY Renk Dnm


GRAY renk uzay ile renkler, siyahn ve beyazn tonlarnda yani gri olarak tanmlanr.

Imgproc.cvtColor(kaynakGoruntu, hedefGoruntu, Imgproc.COLOR_GRAY2RGB);

Sistemdeki kameradan alnan grnt zerine de ayn ilemi uygulayarak, ak halindeki bir grntnn
renk uzay deitirilebilir. Baz renk uzaylar arasndaki dnm kaliteli bir sonu vermeyebilir, her renk
uzay farkl geometrik biimlerde ifade edilmektedir, bu ifade ekli matematiksel olarak baz renk uzaylar
arasndaki dnme engel tekil etmektedir.
49
MORFOLOJK OPERATRLER VE FLTRELER
Morfoloji ngilizce tabiriyle morphology ekil bilim olarak tanmlanmaktadr. Bal bana bilim olan bu
alan tm yntemleri ile OpenCV Ktphanesi ierisine tamak elbette ki mantkl bir seim deildir bu
yzden ihtiya duyulabilecek baz teknikler aktarlmtr. OpenCV ierisinde morfolojik ilem operatrleri
Imgproc ierisinde bulunmaktadr.

Morfolojinin bir ekil bilimi olduunu sylemitik, allan grnt zerindeki ekillerin yorumlanmas,
analiz edilmesi, istenilen bilginin kartlmas, inceltme, grnt sktrma, ke analizi, bozuk grnt
onarma (eksik veya fazla piksellerin karlmas, eklenmesi), dokularn tespiti gibi ilemlerde sklkla
bavurulmaktadr.

Erosion (Andrma)
Dilation (Yayma Geniletme)
Opening (Anm)
Closing (Kapanm)
Morphological Gradient
Top Hat
Black Hat

Erosion (Andrma) Morfolojik Operatr


Bu operatr grnt zerinde bir andrma ilemi uygular. Parametrelere gre belirtilen alan ierisindeki
pikseller andrlr ve grltl olarak adlandrlan bozuk olan grnt, grltden arndrlarak temizlenir.
Btn bu olaylar matematiksel olarak tanmlanmtr ve diziler zerinde gerekletirilir. Aadaki
grseller yardm ile nasl altn somut olarak grelim. lk grnt dizisi andrma ile grltden
arndrlmaktadr.

Erosion ilemi iin kullanacamz metot erode(), bu metot imgproc ierisinde yer almaktadr. Erode
metodunun adet overload bulunmaktadr. Kullandmz parametre olarak giri mat nesnesi, ilem
sonucunu atamak iin k mat nesnesi ve yaplandrma iin bir nesne almaktadr. Bu nesne yapsal
element olarak adlandrlr (Structuring Element) ve yayma ileminin eklini belirler. Yapsal elementin
merkez noktas zerine giri grntsnn pikselleri bu noktaya oturtularak oluturulur. Bu ekiller
Imgproc ierisinde tanmlanmlardr, aadaki rnekte MORPH_ERODE kullandk.
50
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class Erosion {


public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

Mat girisGoruntu=new Mat();


girisGoruntu=Imgcodecs.imread("C:\\1.png");
Mat cikisGoruntu=new Mat();
//Andrma ilemi
Imgproc.erode(girisGoruntu, cikisGoruntu,
Imgproc.getStructuringElement(Imgproc.MORPH_ERODE, new Size(15,15)));

Imgcodecs.imwrite("C:\\2.png", cikisGoruntu);
}
}

Verilen parametreler dorultusunda giri grnts zerinde andrma operatr kullanlmtr. 1.png
olarak adlandrlan grnty aada solda grmektesiniz bu input olarak tanmlanan girisGoruntu mat
nesnesi ierisinde tutulan, cikisGoruntu olarak tanmlanan mat nesnesini oluturulan ve 2.png olarak
adlandrlan grnty ise sada grmektesiniz.

51
Dilation (Yayma Geniletme) Morfolojik Operatr
Bu operatr giri olarak verilen grnt zerinde parametreler ile verilen alan ierisindeki snrlar
geniletmektedir, bu geniletme sayesinde piksel guruplar byr ve pikseller aras boluklar klr.
OpenCV dilation operatr iin Imgproc ierisinde dilate() operatr bulunmaktadr. Bu metot parametre
olarak giri grnts olacak bir mat nesnesi, k grnts iin ikinci bir mat nesnesi ve yapsal
element almaktadr.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class Dilation {


public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

Mat girisGoruntu=new Mat();


girisGoruntu=Imgcodecs.imread("C:\\ 1.jpg");
Mat cikisGoruntu=new Mat();
//dilate (geniletme) operatr
Imgproc.dilate(girisGoruntu,
cikisGoruntu,Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(25,25)));
Imgcodecs.imwrite("C:\\2.jpg", cikisGoruntu);
}
}

Aadaki ktda sol tarafta bulunan grnt 1.jpg olarak adlandrlan giri mat nesnesi, sandaki ise
2.jpg olarak ilem sonucunda oluturulan kt grnt. Grdnz zere giri grntsnde bulunan
beyaz ekiller dilation operatr uygulandnda bir birlerine yaklamlardr. Burada nemli nokta
zeminin, siyah nesneler beyaz olmas ve yapsal element. Yapsal element zerindeki deiikler ile
aralarndaki mesafe daha da azaltlp birletirilebilirdi.
52
Dier operatrleri kullanmak iin daha nceki rneklerde yaptmz gibi erode ve dilate metotlarn
kullanarak gerekletirebilirsiniz fakat OpenCV ierisinde morfolojik operatrleri ynetmek iin yazlm
bir metot hazrda bulunmaktadr.

Imgproc ierisinde yer alan morphologyEx() ile operatrler ynetilebilmektedir. Bu metot parametre
olarak giri grnts iin mat nesnesi, ilem sonucu iin bir mat nesnesi, uygulanacak olan operatr ve
yapsal element almaktadr.

Opening (Anm) Morfolojik Operatr

(Imgproc.MORPH_OPEN)

Erosion ve dilation operatrlerinin grnt zerine birlikte uygulanmas ile gerekleir. ncelikli olarak
erosion operatr uygulanr ve ardndan dilation operatr uygulanr.

Imgproc.morphologyEx(girisGoruntu, cikisGoruntu, Imgproc.MORPH_OPEN,


Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(25,25)));

53
Closing (Kapanm) Morfolojik Operatr
(Imgproc.MORPH_CLOSE)

Grntye dilation operatr uygulanr ve ardndan Erosion operatr uygulanr.

Imgproc.morphologyEx(girisGoruntu, cikisGoruntu, Imgproc.MORPH_CLOSE,


Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(25,25)));

54
Morphological Gradient Morfolojik Operatr
(Imgproc.MORPH_GRADIENT)

Dilation ve Erosion operatr arasndaki farktr. Nesnelerin ana hatlarn belirlemek iin kullanlr. Snr
izgilerini tam hatlaryla belirlemek iin yapsal element, grntye gre zelletirilmelidir.

Imgproc.morphologyEx(girisGoruntu, cikisGoruntu, Imgproc.MORPH_GRADIENT,


Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(25,25)));

Top Hat Morfolojik Operatr


(Imgproc.MORPH_TOPHAT)

Bu operatr giri olarak verilen grntden, opening (anm) operatr uygulanm halini karr.

Imgproc.morphologyEx(girisGoruntu, cikisGoruntu, Imgproc.MORPH_TOPHAT,


Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(25,25)));
55
THRESHOLDNG (EKLEME)
Giri olarak verilen grnty ikili grntye evirmek iin kullanlan bir yntemdir. kili grnt (binary),
grntnn siyah ve beyaz olarak tanmlanmasdr. Morfolojik operatrler gibi grnt zerindeki
grltleri azaltmak veya nesne belirlemek gibi farkl amalar iin kullanlr. Giri olarak verilen grnt
zerinde uygulanan thresholding tipine bal olarak, pikselleri verilen eik deerine gre siyah ya da
beyaz olarak gnceller.

OpenCV ierisindeki sk kullanlan threshold tipleri:

THRESH_BINARY
THRESH_BINARY_INV
THRESH_TRUNC
THRESH_TOZERO
THRESH_TOZERO_INV

Thresholding ilemi iin Imgproc ierisindeki threshold()metodunu kullanacaz. Bu metot be adet


parametre almaktadr. Kaynak mat nesnesi yani giri grnts, hedef olarak ikinci bir mat nesnesi bu
hedef nesne ilem sonucunu tutmak iin, thresh olarak adlandrlan parametre eik deeri,
THRESH_BINARY ve THRESH_BINARY_INV gibi tipler iin kullanlmak zere maksimum deer ve
yukarda belirtilenler gibi threshold tipini parametre olarak almaktadr.

Imgproc.threshold(kaynakMat,hedefMat,esikDegeri,maksDeger,threshoidngTipi);

THRESH_BINARY
Kaynak olarak alnan grnt zerindeki piksel,esikDegeri olarak verilen deerden bykse maksDeger
olarak verilen parametre deerine atanr.
56
THRESH_BINARY_INV
Kaynak olarak alnan grnt zerindeki piksel, esikDegeri olarak verilen deerden kkse maksDeger
olarak verilen parametre deerine atanr. THRESH_BINARY_INV, THRESH_BINARYnin kart olarak
kullanlabilir.

THRESH_TOZERO
Kaynak olarak alnan grnt zerindeki piksel, snr olarak verilen deerden byk olmas durumunda
piksel deeri korunacak, kk olmas durumunda ise piksel siyah olarak atanacaktr.

THRESH_TOZERO_INV
Kaynak olarak alnan grnt zerindeki piksel, snr olarak verilen deerden kk olmas durumunda
piksel deeri korunacak, byk olmas durumunda ise piksel siyah olarak atanacaktr.

Aadaki grselde kaynak zerine etki eden threshold tipleri grafiksel olarak ifade edilmitir.

57
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat kaynakGoruntu=new Mat();
kaynakGoruntu=Imgcodecs.imread("C:\\1.jpg");
Mat hedefGoruntu=new Mat();
intthresh=150;
intmaxDeger=255;
Imgproc.threshold(kaynakGoruntu, hedefGoruntu, thresh, maxDeger,
Imgproc.THRESH_BINARY);
Imgcodecs.imwrite("C:\\2.jpg", hedefGoruntu);
System.out.println("Thresholding uyguland.");

Yukardaki rnekte okunan grnt zerine threshold binary uygulanmtr. Imgproc. THRESH_BINARY
parametresini uygulamak istediiniz threshold tipine gre deitirebilirsiniz. Threshold metoduna
parametre olarak dier threshold tiplerini verelim ve kaynak grnt zerindeki farkllklara bakalm.

FLTRELER
Filtreler genellikle morfolojik ilemlerden veya thresholding ilemlerinden nce yaplr. Mobil fotoraf
dzenleme uygulamalar ve profesyonel grnt dzenleme programlarnda filtreler olduka sk kullanlr.
58
Bundan nceki ilk iki konuda ele alnan rneklere dikkat ederseniz kt olarak oluturulan grsellerde
baz piksellerin kaydn, silik ktn veya tam olarak temizlenemediini grrsnz. Farkl grseller
ile bu rnekleri yaptysanz benzer sonularla karlamsnzdr. Bunun nedeni kaynak olarak alnan
grntnn grltl olmas veya l dengesinin bozuk olmas gibi birok durumdur. Bu sorunlar amak
iin kaynak grntye ncelikle bir filtre uygulanr ve grntnn ileme iin en verimli hale getirilmesi
salanr ve bu durum n ileme olarak adlandrlr.

Filtreler org.opencv.imgproc paketi ierisinde yer almaktadrlar.

Blur
Blur filtresi grnty bulanklatrmak iin kullanlr. Uygulamak iin ise blur() metodu kullanlr. Bu metot
parametre olarak kaynak grnt mat nesnesi tipinde, mat tipinde bir sonu ve Size tipinde uygulanacak
olan bulanklk deerini almaktadr.(ekirdek boyutu olarak da adlandrlr).

Imgproc.blur(kaynakGoruntu, hedefGoruntu, new Size(50,50));

GaussianBlur
GaussianBlur filtresi grnt zerinde dzletirme ilemi uygular. Uygulamak iin GaussianBlur() metodu
kullanlr. Bu metot parametre olarak kaynak grnt mat nesnesi tipinde, mat tipinde bir sonu ve Size
tipinde uygulanacak olan bulanklk deerini (ekirdek boyutu olarak da adlandrlr) ve SigmaX olarak
adlandrlan ekirdek standart sapmasdr almaktadr.

Imgproc.GaussianBlur(kaynakGoruntu, hedefGoruntu, new Size(100,100),0);

Laplace
Grnt zerinde nesnelerin snr izgilerini belirlemek iin kullanlr. Piksellerin renk farkllklarndan
yararlanr ve bu sayede nesnelerin snr izgileri tespit edilmi olur. Uygulamak iin Laplacian() metodu
kullanlr. Bu metot parametre olarak kaynak grnt mat nesnesi tipinde, mat tipinde bir sonu ve int
tipinde derinlik deeri almaktadr.

Imgproc.Laplacian(kaynakGoruntu, hedefGoruntu,20);

Sobel
Grnt zerindeki kenarlar elde etmek iin kullanlr. Grnt zerindeki nesneleri kenarlar belirleyerek
ayrtrmak istendiinde bu filtreden yararlanlr. Uygulamak iin Sobel() metodu kullanlr. Bu metot
parametre olarak kaynak grnt mat nesnesi tipinde, mat tipinde bir sonu, int olarak k grnt
nesnesi iin derinlik ve int tipinde trev olarak adlandrlan x, y deeri.

Imgproc.Sobel(girisGoruntu, cikisGoruntu, ddepth, dx, dy);


59
Dier OpenCV ierisinde bulunan filtreleri ise aada yer almaktadr.

pyrUp()
pyrDown()
pyrMeanShiftFiltering()
boxFilter()
filter2D()
Scharr()
sepFilter2D()
buildPyramid()

ARKA PLAN TEMZLEME

OpenCV ile arka plan temizleme ilemini absdiff() metoduile yaplmaktadr. Absdiff metodu parametre
olarak verilen iki mat nesnesi yani matris arasnda karma ilemi yapar bu karma ilemi sonucunda
deien ksmlar (hareketli ksmlar) sonu olarak gsterilir ve karma ilemi sonucu mutlak deer olarak
dndrlr.

Arka plan temizleme, genellikle nesnelerin belirlenmesi, saylmas veya karlatrlmas gibi ilemler iin
tercih edilir. rnein kap girilerine yerletirilen bir kamera ile ieri giri yapan kii says hesaplanabilir.
Kamera yerletirildikten sonra bir grnt alnr ve arka plan olarak saklanr, daha sonraki her grnt ile
arka plan arasnda bir karma ilemi yaplr, karma ilemi sonucunda oluan grntye morfolojik
operatrler ve thresholding uygulanarak fark sonucunda grnt zerindeki nesne belirlenir ve saylr.
Bu sayede giri yapan kii says elde edilebilir. Bu algoritma kullanm alan iin basit bir rnek tekil
etmektedir.

Absdiff metodu Core ierisinde yer almaktadr.

Core.absdiff(src1, src2, dst);

Parametre olarak iki adet kaynak grntleri barndran mat nesneleri ve ilem sonucu iin hedef mat
nesnesi almaktadr. src1 nesnesi karlatrma iin kullanlacak anlk grnt src2 ise arka plan temsil
etmektedir. dst nesnesi ise ilem sonucunu barndracaktr. Aadaki rnekte parametre olarak verilen
2 grntye kartma ilemi uygulanacak ve sonu yeni bir grnt olarak yazlacaktr.

importorg.opencv.core.Core;
importorg.opencv.core.Mat;
importorg.opencv.imgcodecs.Imgcodecs;
importorg.opencv.imgproc.Imgproc;
60
publicclass ArkaplanTemizleme {

publicstaticvoid main(String[] args) {

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

Mat kaynakMatris = Imgcodecs.imread("/home/mesutpiskin/Goruntu1.jpg");


Mat kaynakMatrisGray = new Mat();
// Rgb renk uzayndan gri renk uzayna evirme
Imgproc.cvtColor(kaynakMatris, kaynakMatrisGray, Imgproc.COLOR_RGB2GRAY);

Mat hedefMatris = Imgcodecs.imread("/home/mesutpiskin/ Goruntu2.jpg");


Mat hedefMatrisGray = new Mat();
// Rgb renk uzayndan gri renk uzayna evirme
Imgproc.cvtColor(hedefMatris, hedefMatrisGray, Imgproc.COLOR_RGB2GRAY);
zlendi
// Arka plan temi kten sonraki
veri

Mat islemSonucu = new Mat();
Core.absdiff(hedefMatrisGray, kaynakMatrisGray, islemSonucu);
Imgcodecs.imwrite("/home/mesutpiskin/yeni.jpg", islemSonucu);
}
}
Soldaki grnty arka plan olarak verdik ve karma ilemi iin ise sadaki grnty verdik, sonu
olarak ise ikinci resimde yer alan ve grntye sonradan dhil olan arkadaki koli kald. Bu fonksiyon
sayesinde grnt zerindeki deiiklikleri tespit ettik.

61
kt olarak yakaladmz grnty daha net bir hale getirmek iin threshold ilemi uygulayalm. Kenar
izgilerini daha net belirlemek ve grnt zerinde ki grltleri temizlemek iin resim filtreleri
uygulanabilir.
Mat thresholdCikti=new Mat();
Imgproc.threshold(yeni, thresholdCikti, 2, 255, Imgproc.THRESH_BINARY);
Yukardaki gibi thresh binary uyguladmzda daha net bir sonu elde ettik.

62
YENDEN BOYUTLANDIRMA (RESZE)
Baz durumlarda okunan grntnn tekrardan boyutlandrlmas istenilebilir bunun iin imgproc snf
ierisinde resize() metodu bulunmaktadr. Parametre olarak giri mat nesnesi, k mat nesnesi ve size
olarak boyut almaktadr.

System.loadLibrary(Core.NATIVE_LIBRARY_NAME );
Mat kaynak = Imgcodecs.imread("C:\\1.jpg");
Mat hedef = new Mat();
Imgproc.resize(kaynak, hedef, new Size(300,400));
Imgcodecs.imwrite("C:\\2.jpg", hedef);

63
NESNE TESPT VE TANIMA YNTEMLER
Nesne tanma, grnt ilemede byk nem tamaktadr. Bu ihtiya zerine OpenCV de gelitirilmi
birok yntem bulunmaktadr. Bu yazmda nesne tanma iin kullanabileceiniz yntemleri aktaracam.

Nesne tespiti iin sk kullanlan drt yntem mevcuttur. Bu yntemler;

Template Matching (ablon Eletirme)


HAAR Cascade
LBP Local Binary Pattern
HOG Histogram of Oriented Gradients

ablon Eletirme (Template Matching ) yntemi dndaki dier yntemler snflandrc olarak
tanmlanan Machine Learning algoritmalardr. Bu algoritmalar retilmi bir nesneyi tanmak iin
kullanlr, nesne tanma iin en ok kullanlan yntemler bu algoritmalardr. Snflandrclar iin nesneler
Deep Learning yntemleri ile retilebilir. ablon eletirme yntemi ise, aranan grnt ablonunu
kaynak grnt zerindeki tm piksellerde dolaarak eletirme ilemi yapar.

TEMPLATE MATCHNG LE NESNE TESPT


Template Matching (ablon Eletirme) yntemi ile nesne tanma daha ok kaynak bir grnt zerinde
bir ablonu aramak iin kullanlr. Nesneleri ayrt etmede ok fazla baarl deildir. rnein, bir meyve
sepeti bulunan grnt zerinde elmay aramak iin kullanlabilir. Aranan kaynak zerinde verdiiniz
ablon birebir olarak aranr, baarl bir sonu iin aradnz elma grntsnn, meyve sepeti
grselinden krplm olmas gerekebilir. Krmz bir elmay ablon olarak tanmladnz ve meyve
sepetinde aradnz, eer meyve sepetinizde yars kesilmi yarm bir elma var ise baarl sonu
alamayacaksnz nk ablonunuzda ki ile kaynak grsel zerinde yer alan elma ayn llerde deildir.

Template Matching yntemi ile kaynak grsel zerinde aranan ablon Sliding window (Kayan,srgl
pencere) yntemi ile aranr. Kaynak zerinde ablon (1,1) koordinatlarna oturtulur ve tm pikseller
zerinde dnlr, kullandnz benzerlik yntemine gre bir benzerlik oran oluturulur ve ablonunuz ile
o anki dnlen ablon benzer ise sonu olarak size o pikselleri dndrr.

64
Yukardaki grselde, solda yer alan hayvanlar kaynak grnt olarak alnm buradaki bir kpein yz
krplarak alnm ve ablon olarak kullanlm ilem sonucunda ise verilen ablon ile ayn lde bir
sonu kmtr. Kaynak deitirilmi olsayd ve ayn kpek farkl k as, farkl poz veya farkl bir zemin
zerinde olsayd sonu yukardaki kadar baarl olmayacakt.

Kaynak zerinde ablon aranrken, yukarda olduu gibi 0,0 koordinatlarna istenilen ablon oturtulacak
soldan saa ve yukardan aaya doru tm matris elemanlar yani pikseller zerinde dnlmektedir.

Template Matching ynteminde kaynak ile ablonu eletirirken kullanlan farkl yntemler vardr. Bu
yntemler aadaki gibidir.

TM_CCOEFF
TM_CCOEFF_NORMED
TM_CCORR
TM_CCORR_NORMED
TM_SQDIFF
TM_SQDIFF_NORMED

Bu yntemlerin bir birleri arasndaki farklar rnek grseller ile anlayabilir. Bu yntemlerin her birinin farkl
bir matematiksel forml olduunu unutmayalm. Bu formller aadaki gibidir.
65
66
Bir rnek yapalm ve sonularn gzlemleyelim.

package com.mesutpiskin.templatematcing;
import org.opencv.core.Core;
import org.opencv.core.Core.MinMaxLocResult;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class TemplateMatching {

public static void main(String[] args) {

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat source=null;
Mat template=null;
String filePath="C:\\Users\\mesutpiskin\\Desktop\\Object
Detection\\Template Matching\\Sample Image\\";
source=Imgcodecs.imread(filePath+"kapadokya.jpg");
template=Imgcodecs.imread(filePath+"balon.jpg");

Mat outputImage=new Mat();


int machMethod=Imgproc.TM_CCOEFF;

Imgproc.matchTemplate(source, template, outputImage, machMethod);


MinMaxLocResult mmr = Core.minMaxLoc(outputImage);
Point matchLoc=mmr.maxLoc;

Imgproc.rectangle(source, matchLoc, new Point(matchLoc.x + template.cols(),


matchLoc.y + template.rows()), new Scalar(255, 255, 255));

Imgcodecs.imwrite(filePath+"sonuc.jpg", source);
System.out.println("lem tamamland.");
}

}
67
matchTemplate metodu parametre olarak mat tipinde kaynak grsel, ablon grsel ve kt iin
kullanaca mat nesnesini, int tipinde ise eletirme yntemini almaktadr. rnekte bir kaynak grsel
ykledik bu grsel zerinden krplm bir grsel ablon olarak eklendi. Sonu iin bir mat nesnesi
tanmland. Bu kt matrisi ablonun lleri kullanlarak boyutlandrld. Kaynak grsel zerinde sonu
nesnesi boyutlar kullanlarak bir kare izildi, kare iin bir scalar yani renk tanmland (255,255,255 rgb
renk kodlar) ve sonu ayn dizine yazld.

Sonu;

RENK TESPT OBJE TAKB


Bu projede kamera aygtndan alnan grnt zerinde belirlediimiz baz renkleri tespit edecek ve bu
renge sahip objeleri iaretleyeceiz. ncelikle bir renk aral belirleyeceiz daha sonra kamera
aygtndan yakalanan RGB renk uzayna sahip grnty HSV renk uzayna evireceiz. Grnt
zerinde eikleme, andrma ve geniletme operatrlerini uygulayacaz. Kenar bulma gibi metotlar
kullanarak renklerin ayrmn tespit edip nesneleri iaretleyeceiz.

Renk tespiti iin HSV uzayn kullanacaz, RGB renk uzaynda yaplacak olan threshold HSV renk
uzaynda yaplacak threshold a gre yetersizdir. HSV de H (HUE) deeri daha ayrt edilebilir ekilde
deitii iin farkl renkli objelerin resimde tespiti ok daha kolay olmaktadr. HSV uzaydaki renk kodlar
araln aadaki grselden tespit edebilirsiniz. Proje 2 adet snftan oluacak, birincisi Frameler ve
grntlenecek olan kamera grntsn ynetecek snf, dier ise renk tespitini ve iaretleme gibi
ilemleri yerine getirecek snf.
68
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
import org.opencv.core.Mat;

//Kameradan alnan ve ilenen grntler jpanel zerinde grntlenecek


class Panel extends JPanel {
private static final long serialVersionUID = 1L;
private BufferedImage image;

public Panel() {
super();
}
private BufferedImage getimage() {
return image;
69
}
public void setimage(BufferedImage newimage) {
image = newimage;
return;
}

public void setimagewithMat(Mat newimage) {


image = this.ConvertImage(newimage);
return;
}

/* Mat nesnesini frame ierisinde gstermek iin BufferedImage tipine


eviriyoruz*/
public BufferedImage ConvertImage(Mat matrix) {
// Mat nesnesinin stun, satr ve boyutunu BufferedImage nesnesi
iintutuyoruz
int cols = matrix.cols();
int rows = matrix.rows();
int elemSize = (int) matrix.elemSize();
byte[] data = new byte[cols * rows * elemSize];
int type;
matrix.get(0, 0, data);
// Mat nesnesinin ka kanall, hangi renk uzaynda olduunu tespit
ediyoruz.
switch (matrix.channels()) {
// Tek kanall gri renk uzayna sahip matris
case 1:
type = BufferedImage.TYPE_BYTE_GRAY;
break;
// kanall BGR renk uzayna sahip matris
case 3:
type = BufferedImage.TYPE_3BYTE_BGR;
/*
* Opencv rgb renk uzayn bgr olarak tuttuu iin grntlemede
* dzgn bir grnt elde etmek amacyla rgb uzayna eviriyoruz
*/
byte b;
70

for (int i = 0; i<data.length; i = i + 3) {


b = data[i];
data[i] = data[i + 2];
data[i + 2] = b;
}
break;
default:
return null;
}
BufferedImage image2 = new BufferedImage(cols, rows, type);
image2.getRaster().setDataElements(0, 0, cols, rows, data);
return image2;
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);

BufferedImage temp = getimage();

if (temp != null)
g.drawImage(temp, 10, 10, temp.getWidth(), temp.getHeight(), this);
}
}

Renk tespitini yapacak olan ikinci snf.

import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;
71

import org.opencv.videoio.VideoCapture;
public class Detector {

public static void main(String arg[]) {


System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

// Anlkolarakyakalanankameragrntlerinigstereceimiz frame ve panel


JFrame cameraFrame = new JFrame("Anlk kamera grnts");
cameraFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
cameraFrame.setSize(640, 480);
cameraFrame.setBounds(0, 0, cameraFrame.getWidth(),
cameraFrame.getHeight());
Panel panelCamera = new Panel();
cameraFrame.setContentPane(panelCamera);
cameraFrame.setVisible(true);

// lenecekgrntnn threshold uygulandktan sonraki halini


// gstereceimiz frame ve panel
JFrame thresholdFrame = new JFrame("Threshold grnt");
thresholdFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thresholdFrame.setSize(640, 480);
thresholdFrame.setBounds(0, 0, cameraFrame.getWidth(),
cameraFrame.getHeight());
Panel panelThreshold = new Panel();
thresholdFrame.setContentPane(panelThreshold);
thresholdFrame.setVisible(true);

// Video akiin, 0 ilevarsaylankameraybalatacaz


VideoCapture capture = new VideoCapture(0);
// Parametreleri atyoruz
/*capture.set(3, 1366);
capture.set(4, 768);
capture.set(15, -2);*/
// Saf kameragrnrs
Mat webcam_image = new Mat();
// Hsv renk uzaynda grnts
Mat hsv_image = new Mat();
72

// 1. ve 2. threshold
Mat thresholded = new Mat();
Mat thresholded2 = new Mat();
// Kameradan grnt oku
capture.read(webcam_image);
// Kameradan alnan grntleri gsterecek olduumuz frame boyutlar
// kameradan okunang rntye gre ayarlanyor.

cameraFrame.setSize(webcam_image.width() + 50, webcam_image.height() + 50);


thresholdFrame.setSize(webcam_image.width() + 50, webcam_image.height() +
50);

Mat array255 = new Mat(webcam_image.height(), webcam_image.width(),


CvType.CV_8UC1);
array255.setTo(new Scalar(255));
Mat distance = new Mat(webcam_image.height(), webcam_image.width(),
CvType.CV_8UC1);

List<Mat> lhsv = new ArrayList<Mat>(3);


Mat circles = new Mat();
// Renktespitiburadabelirttiimizminve max deerleregreyaplacak
// hsvuzayndaverdiimizrenktonlararasndaki her renktespitedilecektir.
// Renkaralklariinhsvrenktablolarnagzatabilirsiniz.

Scalar minColor = new Scalar(5, 100, 100, 0);


Scalar maxColor = new Scalar(10, 255, 255, 0);
// Kamera aygt alyor ise
if (capture.isOpened()) {
while (true) {
capture.read(webcam_image);
// Bir grnt okunmu ve bodeilse
if (!webcam_image.empty()) {
// Kameradan okunan grnt hsv renk uzayna dntrlr
Imgproc.cvtColor(webcam_image, hsv_image,
Imgproc.COLOR_BGR2HSV);
Core.inRange(hsv_image, minColor, maxColor, thresholded);

// Erode ve dilate ilemi uygulanr yapsal element lleri


73

// iki ilemdede ayndr


Imgproc.erode(thresholded, thresholded,
Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new
Size(8, 8)));
Imgproc.dilate(thresholded, thresholded,
Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new
Size(8, 8)));
/*
* Split metodu
* ilegrntzerindekihistogramlarparalyoruz. Matrisin
* her boyutu ayr ayr nesnelere atanyor.
*/
Core.split(hsv_image, lhsv);
Mat S = lhsv.get(1);
Mat V = lhsv.get(2);
// dizileraras element farklarhesaplyoruz
Core.subtract(array255, S, S);
Core.subtract(array255, V, V);
S.convertTo(S, CvType.CV_32F);
V.convertTo(V, CvType.CV_32F);
// 2 boyutluvektrlerimizinbyklnhesaplyoruz
Core.magnitude(S, V, distance);
/*
* Verilendeerlerarasnda thresholding uyguluyor.
* pikselindeeriverilendeerlerarasndaise o
* piksel,beyazdeilsesiyahyaplyor.
*/
Core.inRange(distance, new Scalar(0.0), new Scalar(200.0),
thresholded2);
Core.bitwise_and(thresholded, thresholded2, thresholded);
// thresholded iingaussian blur filtresiuyguluyoruz
Imgproc.GaussianBlur(thresholded, thresholded, new Size(9, 9),
0, 0);
// eklindhatlar
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Imgproc.HoughCircles(thresholded, circles,
Imgproc.CV_HOUGH_GRADIENT, 2, thresholded.height() / 8,
200, 100, 0, 0);
74

// thresholding sonrasnesnenin binary


// halizerindebalnoktalartesiediyoruz
Imgproc.findContours(thresholded, contours, thresholded2,
Imgproc.RETR_LIST,
Imgproc.CHAIN_APPROX_SIMPLE);
// Nesneninkonumunaaadakirenkileiziyoruz
Imgproc.drawContours(webcam_image, contours, -2, new Scalar(10,
0, 0), 4);

/*
* Panellerzerinegrnrleriatayp frame'lerin
* tekrardanizilmesinisalyoruz
*/
panelCamera.setimagewithMat(webcam_image);
panelThreshold.setimagewithMat(thresholded);
cameraFrame.repaint();
thresholdFrame.repaint();

} else {
JOptionPane.showMessageDialog(null, "Kamera aygtna
balanlamad!");
break;
}
}
}

RENGN KULLANARAK NESNENN TESPT


Opencv ile kamerada yakalanan objelerin tespit edilmesinin farkl yollar vardr, bu yazda nesnelerin
renklerine gre nasl yakalanabileceine bakacaz. Tek bir snfmz olacak bu snf ile ilk olarak
sistemdeki kameraya balanp ardndan yakalanan grntde istediimiz renge sahip nesneyi
yakalayarak bu nesnenin etrafn izeceiz. Bu ilemlerin hepsi iin pratik opencv snf ve metotlar
mevcuttur. Renkleri karlatrrken R G B kodlarna gre karlatrma yapabilirsiniz. Projede renklerin
kameradaki farkl parametrelere gre farkl grnebileceini dnerek minumum ve maksimum diye
nitelendirdiimiz o rengin a ve koyusunu belirterek istediimiz rengi yakalayacaz yakalanan
fotorafa thresholding uygulayarak gereksiz yerleride atacaz.
75
Proje rnek olarak kullanacam renk sar olacak. Ayn anda bir den fazla objeyi yakalamakta mmkn
bunun iin gerekli aklamalar proje kodlar ierisinde bulabilirsiniz.

Kullandm opencv versiyonu 2.4.11 u anda 3 srm mevcut fakat birok snf ve metot deitii iin
3x srmlerinde sknt kabileceini unutmayn.Kullanmak istiyorsanz da opencv.org zerindeki 3
dokmanna gz atabilirsiniz,uyarlamanz iin size yardmc bilgiler iermektedir.

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
//OPENCV 2.4.11
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.highgui.*;
import org.opencv.imgproc.*;
import org.opencv.core.CvType;

class Panel extends JPanel {

private static final long serialVersionUID = 1L;


private BufferedImage image;

public Panel() {
super();
}

private BufferedImage getimage() {


return image;
}

public void setimage(BufferedImage newimage) {


76
image = newimage;
return;
}

public void setimagewithMat(Mat newimage) {


image = this.matToBufferedImage(newimage);
return;
}

public BufferedImage matToBufferedImage(Mat matrix) {


int cols = matrix.cols();
int rows = matrix.rows();
int elemSize = (int) matrix.elemSize();
byte[] data = new byte[cols * rows * elemSize];
int type;
matrix.get(0, 0, data);
switch (matrix.channels()) {
case 1:
type = BufferedImage.TYPE_BYTE_GRAY;
break;
case 3:
type = BufferedImage.TYPE_3BYTE_BGR;
//renk dnm
byte b;
for (int i = 0; i < data.length; i = i + 3) {
b = data[i];
data[i] = data[i + 2];
data[i + 2] = b;
}
break;
default:
return null;
}
BufferedImage image2 = new BufferedImage(cols, rows, type);
image2.getRaster().setDataElements(0, 0, cols, rows, data);
return image2;
}
77
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);

BufferedImage temp = getimage();

if (temp != null)
g.drawImage(temp, 10, 10, temp.getWidth(), temp.getHeight(), this);

}
}

public class ColorTracking {

public static void main(String arg[]) {

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

try {
//Yakalamak istediim renklerin kodlar min ve max olarak verilmitir
Scalar hsv_min = new Scalar(21, 100, 100);
Scalar hsv_max = new Scalar(31, 255, 255);
//Varsaylan webcam 0 dr sistemdeki dier kameralar 1,2,3,4 eklinde
indexlenmektedirler
trackColor(1, hsv_min, hsv_max);
} catch (AWTException e) {

e.printStackTrace();
}
return;
}
//Renge gre objeyi takip eder
private static void trackColor(int webcam, Scalar colorMin, Scalar colorMax)
throws AWTException {

//Kamera frame orjinal grntye sahiptir


JFrame frmeaCamera = new JFrame("Kamera");
78

frmeaCamera.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frmeaCamera.setSize(640, 480);
frmeaCamera.setBounds(0, 0, frmeaCamera.getWidth(),
frmeaCamera.getHeight());
Panel panel1 = new Panel();
frmeaCamera.setContentPane(panel1);
frmeaCamera.setVisible(true);

//HSV grntye sahiptir


JFrame frameHsv = new JFrame("HSV");
frameHsv.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frameHsv.setSize(640, 480);
frameHsv.setBounds(300, 100, frameHsv.getWidth() + 300, 100 +
frameHsv.getHeight());
Panel panel2 = new Panel();
frameHsv.setContentPane(panel2);
frameHsv.setVisible(true);

//Yakalanan objelerin grntsne sahiptir


JFrame frameThreshold = new JFrame("Threshold");
frameThreshold.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frameThreshold.setSize(640, 480);
frameThreshold.setBounds(900, 300, frameHsv.getWidth() + 900, 300 +
frameHsv.getHeight());
Panel panel4 = new Panel();
frameThreshold.setContentPane(panel4);
frameThreshold.setVisible(true);
// Vivdeo ak
VideoCapture capture = new VideoCapture(webcam);
//Video znrllkleri
capture.set(3, 1024);
capture.set(4, 768);

Mat webcam_image = new Mat();


Mat hsv_image = new Mat();
Mat thresholded = new Mat();
Mat thresholded2 = new Mat();
79

capture.read(webcam_image);
frmeaCamera.setSize(webcam_image.width() + 40, webcam_image.height() + 60);
frameHsv.setSize(webcam_image.width() + 40, webcam_image.height() + 60);

frameThreshold.setSize(webcam_image.width() + 40, webcam_image.height() +


60);
Mat array255 = new Mat(webcam_image.height(), webcam_image.width(),
CvType.CV_8UC1);
array255.setTo(new Scalar(255));
Mat distance = new Mat(webcam_image.height(), webcam_image.width(),
CvType.CV_8UC1);

List<Mat> lhsv = new ArrayList<Mat>(3);


Mat circles = new Mat();

double[] data = new double[3];

//Webcam alm ,alyor ise


if (capture.isOpened()) {
while (true) {
capture.read(webcam_image);
if (!webcam_image.empty()) {

Imgproc.cvtColor(webcam_image, hsv_image,
Imgproc.COLOR_BGR2HSV/* COLOR_BGR2RGB */);

//Min ve max renk uzaylarna gre karlatrma


Core.inRange(hsv_image, colorMin, colorMax,thresholded);
//birden fazla renk yakalamak iin
//Core.inRange(hsv_image, colorMin2, colorMax2,thresholded2);
Imgproc.erode(thresholded, thresholded,
Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new
Size(8, 8)));
Imgproc.dilate(thresholded, thresholded,
Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new
Size(8, 8)));

Core.split(hsv_image, lhsv);
80

Mat S = lhsv.get(1);
Mat V = lhsv.get(2);
Core.subtract(array255, S, S);
Core.subtract(array255, V, V);
S.convertTo(S, CvType.CV_32F);
V.convertTo(V, CvType.CV_32F);
Core.magnitude(S, V, distance);
Core.inRange(distance, new Scalar(0.0), new Scalar(200.0),
thresholded2);
Core.bitwise_and(thresholded, thresholded2, thresholded);

Imgproc.GaussianBlur(thresholded, thresholded, new Size(9, 9),


0, 0);
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Imgproc.HoughCircles(thresholded, circles,
Imgproc.CV_HOUGH_GRADIENT, 2, thresholded.height() / 8,
200, 100, 0, 0);

Imgproc.findContours(thresholded, contours, thresholded2,


Imgproc.RETR_LIST,
Imgproc.CHAIN_APPROX_SIMPLE);
//Yakalanan nesneyi nokta izerek belirtir,scalar izim rengi,
2 ise kalnlktr
Imgproc.drawContours(webcam_image, contours, -1, new
Scalar(255, 0, 0), 5);

System.out.println(contours.size());

// -- Resimi panellere ekler

//Data dizisi renk kodlarn tutmaktadr


panel1.setimagewithMat(webcam_image);
panel2.setimagewithMat(hsv_image);
panel4.setimagewithMat(thresholded);
frmeaCamera.repaint();
frameHsv.repaint();
81

// frame3.repaint();
frameThreshold.repaint();

} else {
System.out.println("GRNT ALINAMADI");
break;
}
}
}

}
}

HAAR CASCADE CLASSFER YZ VE GZ TESPT


Nesneyi tespit etmek iin ncelikle nesneyi sisteme tantmamz ve daha sonra bu tanmlanm veri setini
kullanarak grnt zerinde arama yapmamz gerekir. Haar cascade snflandrc bizden xml dosyas
alr bu xml dosyalar bir nesnenin binlerce negatif ve pozitifi ile hazrlanm veri setidir. Pozitif olarak
tanmlanan grntler istenilen nesnenin bulunduu negatif olarak tanmlananlar ise bulunmas istenilen
nesnenin bulunmad grntlerdir. Daha detayl bilgi iin Haar cascade algoritmasna gz atabilir ve
Haar cascade snflandrc eitimleri ile de nasl nesne tanmlanr renebilirsiniz.

OpenCV ierisinde birok nesne hali hazrda retilmi olarak gelir bunlardan yz ve gz kullanarak
anlk olarak bir yz ve gz tespiti yapacaz. Aklamalar kaynak kod zerinde yapacam adm adm
giderek kurguyu anlayabilirsiniz. Koda gemeden nce aadaki dier yazlarm okumanz neririm bu
sayede izim ilemlerini ve gui uygulama gelitirme hakknda bilgi edinebilirsiniz.

import java.awt.FlowLayout;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
82
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import org.opencv.videoio.VideoCapture;
/*
* OpenCV version 3.1
*/
public class DetectFace {

static JFrame frame;


static JLabel lbl;
static ImageIcon icon;

public static void main(String[] args) {


System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
/*Cascade Classifier iin retilmi veri kmesi, opencv
build/etc/haarcascades/ ierisinde yer almaktadr
Daha fazla bilgi iin Haar Cascade snflandrclarna bakabilirsiniz.
*/

CascadeClassifier cascadeFaceClassifier = new CascadeClassifier(

"D:/Programlar/Opencv/3.1.0/opencv/build/etc/haarcascades/haarcascade_frontalface_d
efault.xml");
CascadeClassifier cascadeEyeClassifier = new CascadeClassifier(

"D:/Programlar/Opencv/3.1.0/opencv/build/etc/haarcascades/haarcascade_eye.xml");

CascadeClassifier cascadeNoseClassifier = new CascadeClassifier(

"D:/Programlar/Opencv/3.1.0/opencv/build/etc/haarcascades/haarcascade_mcs_nose.xml"
);
//CascadeClassifier cascadeMouthClassifier = new
CascadeClassifier("OpenCV/haarcascades/haarcascade_mcs_mouth.xml");
haarcascade_mcs_mouth on 2.4.11
83

//Varsaylan kamera aygtn balat


VideoCapture videoDevice = new VideoCapture();
videoDevice.open(0);
if (videoDevice.isOpened()) {
//Sonsuz bir dng ile srekli olarak grnt ak salanr
while (true) {
Mat frameCapture = new Mat();
videoDevice.read(frameCapture);

//Yakalanan grnty nce dntr ve frame ierisine ykle


MatOfRect faces = new MatOfRect();
cascadeFaceClassifier.detectMultiScale(frameCapture, faces);
//Yakalanan ereve varsa ierisinde dn ve yzn boyutlar
lsnde bir kare iz
for (Rect rect : faces.toArray()) {
//Sol st kesine metin yaz
Imgproc.putText(frameCapture, "Face", new Point(rect.x,rect.y-
5), 1, 2, new Scalar(0,0,255));
Imgproc.rectangle(frameCapture, new Point(rect.x, rect.y), new
Point(rect.x + rect.width, rect.y + rect.height),
new Scalar(0, 100, 0),3);
}

//Gzleri bul ve bulunan array ierisinde dnerek kare iz


MatOfRect eyes = new MatOfRect();
cascadeEyeClassifier.detectMultiScale(frameCapture, eyes);
for (Rect rect : eyes.toArray()) {
//Sol st kesine metin yaz
Imgproc.putText(frameCapture, "Eye", new Point(rect.x,rect.y-
5), 1, 2, new Scalar(0,0,255));
//Kare iz
Imgproc.rectangle(frameCapture, new Point(rect.x, rect.y), new
Point(rect.x + rect.width, rect.y + rect.height),
new Scalar(200, 200, 100),2);
}

//Burunlar bul ve bulunan array ierisinde dnerek kare iz


MatOfRect nose = new MatOfRect();
84

cascadeNoseClassifier.detectMultiScale(frameCapture, nose);
for (Rect rect : nose.toArray()) {
//Sol st kesine metin yaz
Imgproc.putText(frameCapture, "Nose", new Point(rect.x,rect.y-
5), 1, 2, new Scalar(0,0,255));
//Kare iz
Imgproc.rectangle(frameCapture, new Point(rect.x, rect.y), new
Point(rect.x + rect.width, rect.y + rect.height),
new Scalar(50, 255, 50),2);
}

//Az bul ve bulunan array ierisinde dnerek kare iz


/*MatOfRect mouth = new MatOfRect();
cascadeMouthClassifier.detectMultiScale(frameCapture, mouth);
for (Rect rect : mouth.toArray()) {

Imgproc.rectangle(frameCapture, new Point(rect.x, rect.y), new


Point(rect.x + rect.width, rect.y + rect.height),
new Scalar(129, 90, 50),2);
}

*/
//Resmi swing nesnesinde gsterebilmek iin nce image haline evir
ve ekrana bas
PushImage(ConvertMat2Image(frameCapture));
System.out.println(String.format("%s yz(FACES) %s gz(EYE) %s
burun(NOSE) detected.",
faces.toArray().length,eyes.toArray().length,nose.toArray().length));
}
} else {
System.out.println("Video aygtna balanlamad.");
return;
}
}
//Mat nesnesini image tipine dntr
private static BufferedImage ConvertMat2Image(Mat kameraVerisi) {
85

MatOfByte byteMatVerisi = new MatOfByte();


//Ara bellee verilen formatta grnt kodlar
Imgcodecs.imencode(".jpg", kameraVerisi, byteMatVerisi);
//Mat nesnesinin toArray() metodu elemanlar byte dizisine evirir
byte[] byteArray = byteMatVerisi.toArray();
BufferedImage goruntu = null;
try {
InputStream in = new ByteArrayInputStream(byteArray);
goruntu = ImageIO.read(in);
} catch (Exception e) {
e.printStackTrace();
return null;
}
return goruntu;
}
//Bir frame (ereve) oluturur
public static void PencereHazirla() {
frame = new JFrame();
frame.setLayout(new FlowLayout());
frame.setSize(700, 600);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//Resmi gsterecek label oluturur
public static void PushImage(Image img2) {
//Pencere oluturulmam ise hazrlanr
if (frame == null)
PencereHazirla();
//Daha nceden bir grnt yklenmi ise yenisi iin kaldrr
if (lbl != null)
frame.remove(lbl);
icon = new ImageIcon(img2);
lbl = new JLabel();
lbl.setIcon(icon);
frame.add(lbl);
//Frame nesnesini yeniler
frame.revalidate();
}
86

}
HAAR CASCADE LE YZ TESPT (PYTHON)
import cv2

capture = cv2.VideoCapture(0)
cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

while True:

ret, frame = capture.read()


faces = cascade.detectMultiScale(frame, 1.5, 3)

for (x,y,w,h) in faces:


cv2.rectangle(frame,(x,y),(x+w,y+h),(255,255,255),2)

cv2.imshow('Kamera',frame)
if cv2.waitKey(30) & 0xff ==27:
break

capture.release()
cv2.destroyAllWindows()

YZ TANIMAYA GR
Yz tanmaya girmeden nce deinmemiz gereken bir konu var. Grnt ilemede yz tespiti iin birok
yntem mevcut bu yntemlere daha nce gerek video eitimlerimde gerekse yazlarmda deinmitim.
Yz tanma iinde farkl yntemler mevcut, burada dikkat edilmesi gereken konu yz tanma ilemi ile
yz tespit ileminin farkl olmal. Baz yntemler ile grntlerdeki insan yzlerini dier nesnelerden ayrt
ederek tespit edebiliriz nk insan yz geometrik olarak ok fazla farkllk gstermez bu farklln az
oluuda yz tespit etmeyi kolaylatrr. Yz tanma ise daha nceden tespit edilen bir kaynak yzn,
87
yeni alnacak yz ile karlatrlp aradaki benzerlii tespit edebilmekir. Bu balamda yz tanma tespit
etme ilemine gre daha zordur. Ortamdaki k veya yzde meydana gelecek kk deiiklikler
algoritmanzn hatal sonu vermesine yol aabilir. Bu durumlardan dolay tespit ile tanma ilemini bir
birinden iyi ayrt etmek gerekir.

Yz tanma insanlar iin olduka kolay bir itir. Baz deneyler gstermitir ki gnlk bir bebek bile
grd yz daha sonra ayrt edebilmektedir. Peki, bilgisayarlar iin bu durum ne kadar zor olabilir?
Bizler bu gne kadar yz tanma konusunda ok az ey biliyorduk. Yz tanma esnasnda gzleri, burnu,
az veya kafa eklini, salarmz kullanyor muyduk? Beynimiz bunlar nasl analiz ediyor, nasl
kodlanm olabilir ki? David Hubel ve Torsten Wiesel bize gstermitir ki beynimiz izgileri, kenarlar,
hareketleri, grntnn belirli zelliklerini belirli sinir hcreleri ile anlayabiliyoruz. Btn bir grseli
paralayarak veya paralanm bir grseli kullanarak oluturulabilecek bir btnden anlaml sonular
kartabiliyoruz. Yz tanma ise btn bir grntden anlaml zelliklerin ayklanmas ve onlarn
snflandrlarak karlatrlmas ile oluyor.

Bir yzn geometrik zelliklerine gre yaplacak yz tanma ilemi, muhtemelen yz tanma iin en kolay
yaklamdr. lk otomatik yz tanma sistemlerinden biri Kanade73: iaretleyici noktalar (gzler, kulaklar
ve burun pozisyonu) zellik vektr (noktalar arasndaki mesafe, bunlar arasndaki a) oluturmak iin
kullanld. zellik vektrn kullanarak yaplan tanmada kaynak ve referans grntnn zellik vektrleri
arasndaki klid mesafe hesaplanarak yapt. Bu gibi bir yntem baarl oldu, doas gerei parlaklk gibi
deiikliklere kar dayanklyd, ancak ok byk bir dezavantajlar davard. Geometrik yz tanma
yntemi ile yaplan bir baka alma [Bru92]. A 22 boyutlu zellik vektr kulland ve byk veri setleri
zerinde deneyler yapt. Tek bana geometrik zelliklerin yz tanma iin yeterli olmayaca bu alma
ile fark edilmitir.

[TP91], Eigenfaces yntemi, yz tanma iin btnsel bir yaklam ald. Yz grntsnn bir
noktasndan yksek boyutlu grnt alan ve kk boyutlu bir temsil alnd ve snflandrma kolay hale
getirildi. Dorusal diskriminant analizi ile bir snfa zel projeksiyon [BHK97] yntemi olarak yz tanmada
uyguland. Temel fikri, snflar arasnda varyans maksimize ederken, bir snf iinde varyans en aza
indirmekti.

OpenCV 2.4 srm ile birlikte baz yz tanma algoritmalar geldi. Mevcut algoritmalar unlardr:

Eigenfaces (createEigenFaceRecognizer())
Fisherfaces (createFisherFaceRecognizer())
Local Binary Patterns Histograms LBPH (createLBPHFaceRecognizer())
88
Yz tanma iin baz rnek yz verilerine ihtiyacmz olacaktr. Kendi veri kmenizi oluturabilir veya hazr
olarak oluturulmu veri kmesini indirerek kullanabilirsiniz.

http://face-rec.org/databases/
http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html
http://vision.ucsd.edu/~leekc/ExtYaleDatabase/ExtYaleB.html
http://vision.ucsd.edu/content/yale-face-database

Algoritmalar iin Veri Setinin Hazrlanmas


Elde ettiimiz verileri programmz tarafndan okuyabiliyor olmamz gerekir. Bunun iin basit bir yntem
olan CSV dosyasn tercih edeceiz. Neden CSV? nk CSV platform bamsz bir dosya format. Daha
farkl zmlerde kullanlabilir.

/path/to/image.ext;0

Buradaki adres grntnn dosya yoludur. Windows kullanyor iseniz dosya yolunuz muhtemelen
C:/faces/person0/image0.jpg eklinde olacaktr. Dosya adresinden sonra ; ayrac vardr ve bundan
sonra grnt etiketi 0 olarak atanr. Bu etiket grntye eklenen bir veri olarak dnlebilir rnein
kaydn aldnz kiinin id bilgisi olabilir.

AT&T Facedatabaseden (http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html) at.txt ye


karlk gelen CSV dosyasn indirin.

./at/s1/1.pgm;0
./at/s1/2.pgm;0
...
./at/s2/1.pgm;1
./at/s2/2.pgm;1
...
./at/s40/1.pgm;39
./at/s40/2.pgm;39

Dosyalar D:/data/at altna karttm. CSV dosyam artk D:/data/at.txt dizinde. imdi tm dosyada bir
arama yaparak ./ olan yerleri D:/data/ ekline getiriyorum bylelikle dizini gstermi oluyorum. Herhangi
bir metin editr (notepad, notepad++ vb.) ile bu ilemi yapabilirsiniz.

Artk demo uygulamaya dosya dizinini vererek altrabilirsiniz. rnein:

facerec_demo.exe D:/data/at.txt

CSV Dosyas Oluturma


Elle manuel olarak CSV dosyas oluturmak skc bir i. Bunu yapmas iin create_csv.py adnda bir
Python scriptimiz var. Bu script src / create_csv.py dizininde mevcuttur, otomatik olarak bizim iin CSV
dosyas oluturacaktr.
89
(/basepath/<subject>/<image.ext>) bu ekilde hiyrerarik grntlere sahipseniz:

philipp@mango:~/facerec/data/at$ tree
.
|-- s1
| |-- 1.pgm
| |-- ...
| |-- 10.pgm
|-- s2
| |-- 1.pgm
| |-- ...
| |-- 10.pgm
...
|-- s40
| |-- 1.pgm
| |-- ...
| |-- 10.pgm

Sadece klasr yolunu vererek create_csv.py scriptini altralm:

philipp@mango:~/facerec/data$ python create_csv.py


at/s13/2.pgm;0
at/s13/7.pgm;0
at/s13/6.pgm;0
at/s13/9.pgm;0
at/s13/5.pgm;0
at/s13/3.pgm;0
at/s13/4.pgm;0
at/s13/10.pgm;0
at/s13/8.pgm;0
at/s13/1.pgm;0
at/s17/2.pgm;1
at/s17/7.pgm;1
at/s17/6.pgm;1
at/s17/9.pgm;1
at/s17/5.pgm;1
at/s17/3.pgm;1
[...]
90
Gelitirilen Baz Yz Tanma Algoritmalarn Karlatrlmas

YZ TANIMA EGENFACES, FSHERFACES, LBPH


Daha nce yz tanmaya giri yapmtk, bu defa yz tanma iin OpenCV de adet algoritma olduunu
belirtmitik (Eigenfaces, Fisherfaces, LBPH ). rnek olarak kullanlabilecek veritabanlarna da
deinmitik bu rnekte de att rnek yz veri tabann kullanacaz. rnek uygulamay JavaCV ile
gerekletirereceiz.

Bu algoritmalar iin yaplm birok alma mevcut daha akademik bir alma ierisindeyseniz veya
algoritmalarn mantn kavramak istiyorsanz bu konuda bilgi edinebileceiniz baz kaynaklarn linkine
yaznn altndan eriebilirsiniz.

Bu algoritmalar ncelikle bir eitim gerektirir. Eitim yz resimlerinin algoritmaya verilerek bu


grntlerden bir vektr oluturur bu vektr eitimde kullanlan yzlerin belirgin zelliklerinden oluur. Bu
sayede elde edilen vektr veri tabanndaki tm yzlerden yararlanarak oluturulmu olur. Daha sonra
karlatrma iin gnderilecek yzler bu vektr ile karlatrlr. Her eitim sonras, bu vektr deiir ve
eitim iin kullanlan veri ne kadar fazla ise baar oran da bir o kadar artar.
91
Algoritmann Eitilmesi
Eitim iin en az iki adet grntye ihtiya vardr ve eitim iin kullanlacak her dosyann genilii ve
ykseklii ayn boyutta olmaldr. Eitim iin rnek veritabanlarn indirip kullanacanz gibi kendinizde
ekmi olduunuz resimleri kullanabilirsiniz. Kullanlacak grsellerin formatlar genellikle jpg, jpeg, png,
pmg vb. dir. Att veritabann indirirseniz, ierisindeki grnt formatlar pmg dir.

OpenCV de eitim iin FaceRecognizer snf altnda train() metodu mevcuttur. Bu metot parametre
olarak eitim iin kullanlacak mat vektrlerini yani yzleri ve bu yzler iin kullanlacak etiketleri (label)
alr. Etiket kavramn daha nce aklamtk fakat tekrardan deinmek gerekirse, eitilen her yz
grntsnn eleme sonucunda adlandrlmas iin verdiimiz id numaralardr. Bu etiketler grnt
dosyasnn isimlerinde kullanlr. rnein att ierisinde 1.pgm 2.pgm olarak giderken baz
veritabanlarnda 1-jon_doe_1.pgm veya 1-jon_doe.jpg gibi olabilir. Bu etiketler yzn kime ait olduunu
belirlemek iin kullanlabilir.

Bizim kullanacamz att veritabannda 1.pgm olarak adlandrlm fakat benimde kullanl bulduum 1-
jon_doe_1.pgm etiketlendirmesini kullanacaz. 1-jon_doe_1.pgm isimlendirmesinde ilk rakam kiinin id
numaras, ikincisi tahmin edebileceiniz zere kiinin ismi ve sonuncu rakam ise bu kiinin veritabannda
ki yz saysna gre verilmi id si, rnein jon doe kiisinin veritabannda 2 adet yz varsa isimlendirmesi
1-jon_doe_1.pgm ve 1-jon_doe_2.pgm eklinde olacaktr. Eitim iin kullanacamz yz grntlerini
okurken gri renk uzayna evireceiz.

92

Hazrladm rnek veri seti


Eletirme
ncelikle eitim iin kullanacamz yz veri setinin dosya dizinine giderek buradaki tm grntleri
alacaz. Bu grntlerin etiketlerini almak iin split edeceiz, bu ilemin ardndan grntleri ve etiketleri
train() metoduna vererek eitimi tamamlayacaz. FaceRecognizer snfnnn predict metodu ile
eletirme iin bir yz vereceiz. Bu metot ilem sonucunda aradmz yz veri setinde eleiyor ise
yani yz veritabannda var ise bu yzn etiketini dndrecektir. predict metodunun farkl overloadlar
vardr bunlara buradaki (http://docs.opencv.org/2.4/modules/contrib/doc/facerec/facerec_api.html)
balantdan ve ekilden gz atabilirsiniz. Eleme deerlerini ve birden fazla kayt ile eleiyor ise,
bunlarn hepsini almak iin parametre olarak double ve int tipinde diziler metoda veriler. Bu diziler ilem
sonucu etiketler ve eleme oranlar ile doldurulur. Veya sadece eletirme resmini parametre olarak
vererek eleen yzn etiketini alabilirsiniz.

Predict Metodunun Overloadlar


93
Aadaki rnek kodda Eigenfaces, Fisherfaces, LBPH algoritmalar kullanlabilir durumdadr, kullanmak
istediiniz algoritmay seerek dierlerini yorum satr haline getirmeniz yeterli olacaktr. Uygulamaya
istediiniz gibi grsellik katarak projelerinize uyarlayabilirsiniz.

import java.io.File;
import java.io.FilenameFilter;
import java.nio.IntBuffer;

import static org.bytedeco.javacpp.opencv_core.CV_32SC1;


import static org.bytedeco.javacpp.opencv_core.CV_8UC1;
import static org.bytedeco.javacpp.opencv_face.createFisherFaceRecognizer;
import static org.bytedeco.javacpp.opencv_face.createEigenFaceRecognizer;
import static org.bytedeco.javacpp.opencv_face.createLBPHFaceRecognizer;
import org.bytedeco.javacpp.BytePointer;
import org.bytedeco.javacpp.opencv_face.FaceRecognizer;
import org.bytedeco.javacpp.opencv_core.Mat;
import org.bytedeco.javacpp.opencv_core.MatVector;
import org.bytedeco.javacpp.opencv_face;
import static org.bytedeco.javacpp.opencv_highgui.cvWaitKey;
import static org.bytedeco.javacpp.opencv_highgui.imshow;
import static org.bytedeco.javacpp.opencv_imgcodecs.CV_LOAD_IMAGE_GRAYSCALE;
import static org.bytedeco.javacpp.opencv_imgcodecs.imread;

public class OpenCVFaceRecognizer {

public static void main(String[] args) {


//Eitim iin kullanacam veri setinin dizini
String trainingDir = "C:/Users/mesutpiskin/Desktop/faces/";
//Eletirme iin kullanacam dier yz
Mat testImage = imread("C:/Users/mesutpiskin/Desktop/40.pgm",
CV_LOAD_IMAGE_GRAYSCALE);

File root = new File(trainingDir);

FilenameFilter imgFilter = new FilenameFilter() {


public boolean accept(File dir, String name) {
name = name.toLowerCase();
94
return name.endsWith(".jpg") || name.endsWith(".pgm") ||
name.endsWith(".png");
}
};

File[] imageFiles = root.listFiles(imgFilter);

MatVector images = new MatVector(imageFiles.length);

Mat labels = new Mat(imageFiles.length, 1, CV_32SC1);


IntBuffer labelsBuf = labels.createBuffer();

int counter = 0;

for (File image : imageFiles) {


Mat img = imread(image.getAbsolutePath(), CV_LOAD_IMAGE_GRAYSCALE);

int label = Integer.parseInt(image.getName().split("\\-")[0]);


System.out.println("Eitilen Yz: "+label);
images.put(counter, img);
labelsBuf.put(counter, label);
counter++;
}
FaceRecognizer faceRecognizer = createEigenFaceRecognizer();
//FaceRecognizer faceRecognizer = createFisherFaceRecognizer();
//FaceRecognizer faceRecognizer = createLBPHFaceRecognizer();

faceRecognizer.train(images, labels);

int predictedLabel = faceRecognizer.predict(testImage);


faceRecognizer.predict(testImage);
System.out.println("Bulunan Yz ID: " + predictedLabel);
cvWaitKey(0);
}
}
95
lem Sonucu

96

You might also like