MATLAB ile OpenCV'yi birlikte kullanmak
Joaquim Luis tarafından yazılan ve benim de eklemeler yaparak geliştirdiğim bir kodu paylaşacağım. Önceki bir yazıda MPT araçkutusunu kullanarak bir resimdeki yüzleri ve gözleri bulmuştuk. Şimdi sadece yüzleri bulacağız ama bu sefer öyle saniyelerce beklemeden, bir saniyeden çok daha kısa bir sürede! Bunu da OpenCV'nin yüz bulma fonksiyonunu MATLAB'ten çağırarak başaracağız. Bunun dışında OpenCV'ye ait olan cvAbsDiff
, cvAdd
, cvAddS
, cvAddWeighted
, cvCanny
, cvCircle
, cvCvtColor
, cvFindContours
, cvCvtScale
, cvDilate
, cvDiv
, cvApproxPoly
, cvEllipseBox
, cvErode
, cvExp
, cvFilter2D
, cvFillPoly
, cvFlip
, cvFloodFill
, cvGoodFeaturesToTrack
, cvHoughLines2
, cvHoughCircles
, hypot
, cvInpaint
, cvLaplace
, cvLine
, cvLog
, cvMatchTemplate
, cvMorphologyEx
, cvMul
, cvPolyLine
, cvPow
, cvPyrDown
, cvPyrUp
, cvRectangle
, cvResize
, cvSmooth
, cvSobel
, cvSub
, cvSubS
ve cvPutText
fonkiyonlarını da kullanabileceğiz. Bunların hepsini denemedim, garantisi yok. Neyse konuyu pek dağıtmayalım ve yüz bulmak için adımlara geçelim. O kısmını ben ekledim. Diğer fonksiyonların kullanımı için kaynaklarına bakarsınız.
OpenCV'nin bilgisayarınızda kurulu olduğunu düşünüyorum ama yazıyı takip etmek için bu gerekli değil.
Öncelikle Using_OpenCV_in_MATLAB.zip dosyasını bilgisayarınıza indirip arşivi açın. Ardından MATLAB'i açın ve çalışma dizininizi indirdiğiniz dosyaların bulunduğu klasör olarak değiştirin.
make_cvlib
fonksiyonunu çağırarak cvlib_mex.mexw32
(donanıma ve versiyona göre cvlib_mex.mexw64 veya cvlib_mex.dll de olabilir) dosyasını oluşturun. Benim bilgisayarımda oluşmuş halini dosyalara ekledim ama sizinkinde çalışmalayabilir, o yüzden kendiniz oluşturabilirseniz iyi olur.
Artık MATLAB fonksiyonu yazar gibi OpenCV fonksiyonlarının bir kısmına ulaşabileceğiz.
cvlib_mex
yazarak imkanlarımızı görebilirsiniz. Özel olarak bir fonksiyonun kullanımı için, örneğin "resim ölçeklemek nasılmış?" sorusu için
cvlib_mex('resize')
yazmak gerekiyor.
Yüz bulma fonksiyonu için de test_face_detect
kodunu inceleyerek nasıl çalıştığını anlayabilirsiniz. Kısaca şöyle;
clear, clc % Seçenekler (isteğinize göre değiştirin) % Sınıflandırıcı xml dosyaları. Normalde % "OpenCV dizini"\data\haarcascades adresinde bulunurlar ve oradan % alarak istediğiniz yere kopyalayabilirsiniz. Biz karşıya bakanları bulalım. classifierFilename = 'haarcascade_frontalface_default.xml'; currentPath = [fileparts([mfilename('fullpath') '.m']) filesep]; classifierFileFullPath = [currentPath 'haarcascades' filesep classifierFilename]; % Yüz olarak seçilebilecek izin verilen en küçük alan minFaceSize = 25; % Harcanan zamanı göstereyim mi? shouldViewElapsedTime = 1; % Resmi oku ve gri seviye resme çevir img = imread('1.jpg'); imgGray = rgb2gray(img); % Yüzleri bul ve dikdörtgen içinde çiz rectangleMatrix = face_detect( imgGray, classifierFileFullPath, minFaceSize, shouldViewElapsedTime ); imshow(img); for iRectangle = 1:size(rectangleMatrix,1) rectangle('Position',rectangleMatrix(iRectangle,:), 'EdgeColor', 'r') end
Sonuçlar
Değerlendirme
Hız konusunda muhteşem! Sadece yüz bulma değil, diğer fonksiyonlar da MATLAB'in kendi fonksiyonlarına oranla hızlı olabiliyor. Örneğin resize
fonksiyonu için öyleydi.
Bazı yüzleri bulamamış gözüküyor. Parametreler ile oynanarak veya xml sınıflandırıcı dosyasını değiştirerek farklı sonuçlar almak mümkün. Bunun için ya facedetect
kodunun içine girip isteğe göre değiştirmek lazım ya da farklı yüzler/pozlar/ırklar/vb. kapsayan sınıflandırıcı dosyası hazırlamak. İkincisi hiç kolay bir iş değil.
Tüm fonksiyonlarını denemedim ama halihazırdakilere bakarak OpenCV'de yazılan bir fonksiyonu MATLAB'ten çağırabilmek için bu dosyaya geçirebiliriz artık!
Yorumlarınızı ve katkılarınızı beklerim...
Düzeltme (25.08.08, Albert Ali Salah'ın katkısı): Yüz bulma fonksiyonunun çok kullanılması sonucu hafıza şişmesi oluyordu ('memory leak' vardı). Jfacedetect
fonksiyonundan çıkmadan önce hafızayı boşaltmak gerekiyordu. Sonuna:
cvReleaseHaarClassifierCascade( &cascade );
ekleyince olay halloldu. Şu anki dosya güncelleştirilmiş halidir.
6 yorum
ismailciim, çok faydalı olmuş :) blogun için genel olarak da aynı şeyi söyleyebilirim, hele köy enstitüleri için yazdığın girdiyi okuyunca içim sızladı, komünist işi diye demiryolu yapmayan bir zihniyetten söz ediyoruz.
Ooo, böyle değerli okurların olması ve fayda görmesi beni çoook mutlu etti. Motive de ediyor açıkçası :)
Sevgiler.
Evet gerçekten güzel bir makale. Ben haar-like features ve integral image (viola and Jones) ile ilgili döküman ararken rastladım. Eğer makalenin yazarı bu konuda bilgi verirse gerçekten memnun olacağım. Hatta matlab örnek kod (anlatımlı) çok faydalı olacaktır.
Bu konuyu ayrıntısıyla ben de merak ediyorum. Önümüzdeki dönem listemde var, öğrenirsem bir yazı yazayım.
iyi günler hocam. Bu konu bana çok gerekli. İşlemleri aynen gerçekleştirdim. Ancak "cvlib_mex.mexw32" dosyasını oluştururken aşağıdaki hatayı veriyor. Lütfen yardımcı olun.
>> make_cvlib
Select a compiler:
[0] None
Compiler: 0 // bu kısma 0,1,2 gibi sayılar verdim. bir tek 0 da cevap verdi. benim derleyici 0. derleyici sanırıım
mex: No compiler selected. No action taken.
**************************************************************************
Warning: The MATLAB C and Fortran API has changed to support MATLAB
variables with more than 2^32-1 elements. In the near future
you will be required to update your code to utilize the new
API. You can find more information about this at:
http://www.mathworks.com/support/solutions/data/1-5C27B9.html?solution=1-5C27B9
Building with the -largeArrayDims option enables the new API.
**************************************************************************
C:\PROGRA~1\MATLAB\R2009B\BIN\MEX.PL: Error: No compiler options file could be found to compile source code. Please run "mex -setup" to rectify.
??? Error using ==> mex at 221
Unable to complete successfully.
Error in ==> make_cvlib at 26
eval(cmd)
>>
[0]None diyerek compiler yok diyor sanırım. ancak "ver" yazdığımda çıkan listede MATLAB Compiler var.