Professional Documents
Culture Documents
OpenCV Kitap
OpenCV Kitap
OpenCV Kitap
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.
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.
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.
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
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 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.
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.
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.
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.
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.
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.
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.
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
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
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.
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.
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.
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.
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");
...
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 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.
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.
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;
img.getRaster().setDataElements(0, 0,
mat.cols(), mat.rows(), dat);
return img;
}
static{
//Open cv native library
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
}
import java.awt.image.BufferedImage;
import org.opencv.core.Core;
import org.opencv.highgui.Highgui;
import org.opencv.highgui.VideoCapture;
VideoCapture cap;
Mat2Image mat2Img = new Mat2Image();
VideoCap(){
BufferedImage getOneFrame() {
cap.read(mat2Img.mat);
return mat2Img.getImage(mat2Img.mat);
}
}
import java.awt.EventQueue;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
/**
* 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
new MyThread().start();
}
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.
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
CV_CAP_PROP_FOURCC
CV_CAP_PROP_FRAME_COUNT
CV_CAP_PROP_FORMAT
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
CV_CAP_PROP_WHITE_BALANCE
CV_CAP_PROP_ISO_SPEED
CV_CAP_PROP_BUFFERSIZE
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.
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.
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.
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.
Daire izmek iin circle() metodu bulunmaktadr. Parametre olarak ilem yaplacak mat tipinde grnt,
point tipinde merkez koordinat, int tipinde yarap ve renk almaktadr.
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.
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.
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.
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
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;
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.
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.
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.
COLOR_RGB2BGR
COLOR_RGB2BGRA
COLOR_RGB2GRAY
COLOR_GRAY2RGB
COLOR_RGB2HLS
COLOR_HSV2RGB
COLOR_RGB2HSV
COLOR_RGB2Luv
COLOR_HSV2RGB
COLOR_RGB2YUV
COLOR_RGB2Lab
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 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;
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;
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.
(Imgproc.MORPH_OPEN)
Erosion ve dilation operatrlerinin grnt zerine birlikte uygulanmas ile gerekleir. ncelikli olarak
erosion operatr uygulanr ve ardndan dilation operatr uygulanr.
53
Closing (Kapanm) Morfolojik Operatr
(Imgproc.MORPH_CLOSE)
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.
Bu operatr giri olarak verilen grntden, opening (anm) operatr uygulanm halini karr.
THRESH_BINARY
THRESH_BINARY_INV
THRESH_TRUNC
THRESH_TOZERO
THRESH_TOZERO_INV
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.
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).
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.
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.
pyrUp()
pyrDown()
pyrMeanShiftFiltering()
boxFilter()
filter2D()
Scharr()
sepFilter2D()
buildPyramid()
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.
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 {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
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.
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 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;
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");
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 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;
public Panel() {
super();
}
private BufferedImage getimage() {
return image;
69
}
public void setimage(BufferedImage newimage) {
image = newimage;
return;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (temp != null)
g.drawImage(temp, 10, 10, temp.getWidth(), temp.getHeight(), this);
}
}
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 {
// 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.
/*
* Panellerzerinegrnrleriatayp frame'lerin
* tekrardanizilmesinisalyoruz
*/
panelCamera.setimagewithMat(webcam_image);
panelThreshold.setimagewithMat(thresholded);
cameraFrame.repaint();
thresholdFrame.repaint();
} else {
JOptionPane.showMessageDialog(null, "Kamera aygtna
balanlamad!");
break;
}
}
}
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;
public Panel() {
super();
}
if (temp != null)
g.drawImage(temp, 10, 10, temp.getWidth(), temp.getHeight(), this);
}
}
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 {
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);
capture.read(webcam_image);
frmeaCamera.setSize(webcam_image.width() + 40, webcam_image.height() + 60);
frameHsv.setSize(webcam_image.width() + 40, webcam_image.height() + 60);
Imgproc.cvtColor(webcam_image, hsv_image,
Imgproc.COLOR_BGR2HSV/* COLOR_BGR2RGB */);
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);
System.out.println(contours.size());
// frame3.repaint();
frameThreshold.repaint();
} else {
System.out.println("GRNT ALINAMADI");
break;
}
}
}
}
}
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 {
"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");
"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
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);
}
*/
//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
}
HAAR CASCADE LE YZ TESPT (PYTHON)
import cv2
capture = cv2.VideoCapture(0)
cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
while True:
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
/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/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.
facerec_demo.exe D:/data/at.txt
philipp@mango:~/facerec/data/at$ tree
.
|-- s1
| |-- 1.pgm
| |-- ...
| |-- 10.pgm
|-- s2
| |-- 1.pgm
| |-- ...
| |-- 10.pgm
...
|-- s40
| |-- 1.pgm
| |-- ...
| |-- 10.pgm
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.
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
import java.io.File;
import java.io.FilenameFilter;
import java.nio.IntBuffer;
int counter = 0;
faceRecognizer.train(images, labels);
96