Tuesday, June 9, 2009

OpenCV, Python ile Yuz Takip Etme

OpenCV ve Python ile dinamik olarak yuz takibi kodlamak oldukca basit. Onceki kurulum paketlerine iki tane ek var, bunlar libcv-dev ve CVtypes adli ek kodlar. Bunlardan birincisini apt-get ile kurun, ikincisini indirin ve o dizini ayri tutmak istiyorsaniz sys.path.append('[CVTYPES DIZINI]') ile path eklemesi yapin (ya da test kodunuzla ayni yere koyun, size kalmis). Bundan sonra, ayrica, Haar Cascade dosyasi denen bir dosyayi alin, bunu test kodunuz ile ayni dizine koyun.

Guzel; simdi su kodu isletebilirsiniz.
import sys
sys.path.append('[benim cvtypes dizini]')
from CVtypes import cv

def detect(image):
image_size = cv.GetSize(image)

# create grayscale version
grayscale = cv.CreateImage(image_size, 8, 1)
cv.CvtColor(image, grayscale, cv.BGR2GRAY)

# create storage
storage = cv.CreateMemStorage(0)
cv.ClearMemStorage(storage)

# equalize histogram
cv.EqualizeHist(grayscale, grayscale)

# detect objects
cascade = cv.LoadHaarClassifierCascade('haarcascade_frontalface_alt.xml', cv.Size(1,1))
faces = cv.HaarDetectObjects(grayscale, cascade, storage, 1.2, 2, cv.HAAR_DO_CANNY_PRUNING, cv.Size(50, 50))

if faces:
print 'face detected!'
for i in faces:
cv.Rectangle(image, cv.Point( int(i.x), int(i.y)),
cv.Point(int(i.x + i.width), int(i.y + i.height)),
cv.RGB(0, 255, 0), 3, 8, 0)

if __name__ == "__main__":
print "OpenCV version: %s (%d, %d, %d)" % (cv.VERSION,
cv.MAJOR_VERSION,
cv.MINOR_VERSION,
cv.SUBMINOR_VERSION)

print "Press ESC to exit ..."

# create windows
cv.NamedWindow('Camera', cv.WINDOW_AUTOSIZE)

# create capture device
device = 0 # assume we want first device
capture = cv.CreateCameraCapture(0)
cv.SetCaptureProperty(capture, cv.CAP_PROP_FRAME_WIDTH, 640)
cv.SetCaptureProperty(capture, cv.CAP_PROP_FRAME_HEIGHT, 480)

# check if capture device is OK
if not capture:
print "Error opening capture device"
sys.exit(1)

while 1:
# do forever

# capture the current frame
frame = cv.QueryFrame(capture)
if frame is None:
break

# mirror
cv.Flip(frame, None, 1)

# face detection
detect(frame)

# display webcam image
cv.ShowImage('Camera', frame)

# handle events
k = cv.WaitKey(10)

if k == 0x1b: # ESC
print 'ESC pressed. Exiting ...'
break


Kaynak:

14 comments:

Anonymous said...

Merhabalar,

Ben OpenCv'yi Java Eclipse ile kullanmak istiyorum. Kameradan görüntüyü alabiliyorum ancak bunu ekranda gösteremiyorum. Yardımcı olursanız sevinirim.

Anonymous said...

Uzgunum biz OpenCV Python uzerine odaklandik, Java Eclipse tecrubesine sahip degiliz. Ama Java ile ekrana goruntu basmak icin Ardabot kodumuzdaki Java kodlari belki faydali olabilir, sitede Ardabot ile arama yaparsaniz cikar.

-Burak

ahmet said...

merhaba burdaki yüz tanıma yöntemini mantığı neye dayalı olarak çalışıyor.yani hangi algoritmaya göre çalışıyor.benim dönem tezim yüz yakalam sistemi.bana bu konu hakkında bilgi edinebileceğim siteler veya kitaplar önerebilirmisiniz? bu arada kullanacağım programlama dili Python.

Burak Bayramli said...

aslinda tanima algoritmasi yuz tanimasi yaninda herhangi bir objeyi de taniyabiliyor. Hangi objenin 'egitim verisi' girilirse, algoritma onu taniyor. OpenCV'ye verilmesi gereken .xml dosyasi bu sablon verisini iceriyor. Hangi algoritma? Arama yaptigimda "Cascade of Boosted Classifiers" diye bir ibare cikti.

http://note.sonots.com/SciSoftware/haartraining.html

OpenCv zaten acik yazilim, kodunu indirerek bakabilirsiniz.

ahmet said...

ben zaten opencvyi kullanmak için hocamdan izin aldım. ama ben direk bir kodu alıp hocaya bu benim tezim diye sunmak istemiyorum.ben biraz çalışıp yapmak istiyorum.ve türkçe bir tane bile algoritma yok.vede türkçe olarak opencv nasıl kullanılacağını gösteren tek bir kaynak bile yok.Bir başkasının kodunun mantığını anlamak çok zor bişey bende o yüzden kendim yapmaya uğraşmak istiyorum.

Burak Bayramli said...

opencv oldukca genel kullanim disinda bir konu, bu tur konularda mesela O'Reilly kitaplari kivaminda Turkce kaynak bulmak cok zor. Teknoloji cok hizli ilerliyor, ve TR'de yeteri kadar insanin ilgilenebilecegi bir konu olacak ki Turkce kitap basilabilsin, bu da olamiyor tabii. Bu isi takip etmenin en iyi yolu bunu Ingilizce yapmak. Isi ogrenirken Turkce yayinlari siz yaparsiniz.

Baskasinin kodu ufak tefek bir yerde bir cevap saglayabilse bile faydali. Kendinizin yapmasi da cok iyi muhakkak. Bol bol Google aramasi yapin, hangi algoritmayi kullandigini bulduk iste, sonra o algoritmanin pesine dusun, mevcut koda bakin. Kodun acik olmasinin bir faydasi su: Icine debug komutlari koyarak, tekrar derleyip, islerken degisken icerigini gorebilirsiniz. Algoritmayi yeterince ogrenince, opencv mevcut fonksiyonun icini tamamen bosaltip, sifirdan baslayarak kendi kodunuzu yazarsiniz, test edersiniz.

Kerem said...

Windows üzerinde kullanmak isterseniz, VS2010 kullanarak yaratabileceğiniz proje örneği için:
http://dissipatedheat.com/2011/04/24/opencv-ile-webcam-goruntusu-isleme/

emre said...

merhaba, çalışmanız gerçekten çok güzel. ben de Python ve OpenCv'yi windowsa kurdum.opencv nin içindeki samplelardan face_Detect uygulamasını çalışrtırdığımda şöyle bir hata aldım Traceback (most recent call last):
File "C:\opencv\samples\python\facedetect.py", line 63, in
cascade = cv.Load(options.cascade)
TypeError: OpenCV returned NULL..daha sonra sizin dediğiniz dosyaları o klasörün içine attım ama değişen bir şey olmadı.bu konuada bilginiz varsa paylaşabilirminiz?

Burak Bayramli said...

bu hatayla daha once karsilasmadim, bilemeyecegim.

emre said...

merhaba daha önceden bahsetmiş olduğum windowsta python dosyası içindeki facedetect.py uygulaması çalışmıyor demiştim. onun için başlat kısmına cmd yazıyoruz ardından
çıkan siyah ekrana cd C:\opencv\samples\python\facedetect.py 0 yazdığımızda sorun çözülmüş olacaktır

the Delilah said...

Merhabalar, bitirme projem yüz tanıma ile ilgili, ve koca bir resimden yüz bölgesini çıkarabilmem gerekiyor.Ama nasıl yapacağımı bilemiyorum, şu anda sadece kameradan görüntü alabiliyorum. Yüz bölgesini nasıl alabilirim bi öneriniz var mı?

Burak Bayramli said...

OpenCv ile bunu yapabilirsiniz,

http://stackoverflow.com/questions/20757147/opencv-and-cdetect-face-in-image

the Delilah said...

merhabalar,
benim bitirme tezi konum yüz tanıma sistemi, ubuntu da çalışıyorum derleyicim de qt creator. Sorum şu;
kameradan görüntüyü alıyorum ama face detection bir türlü yapamıyorum, internetten hazır kodlar denedim face detection ile ilgili, hata vermiyor ama kamera açılıp yüzü de tanımıyor. Sadece çalıştırıyor kodu ama ekrana birşey gelmiyor. Neden acaba bi fikri olan varsa yardım etsin ALLAH rızası için!!!

Burak Bayramli said...

Bende Ubuntu 12 var, onun uzerine OpenCV 2.4.1 kurdum (kaynaklardan derledik). OpenCV-2.4.1/samples/python2 altinda face_detect.py adli Python script'i calistirdim ve calisti. Kameraya baglanildi, oradaki (benim) goruntum gosterildi, ve orada yuz tanima yapildi. Yorumunuzdaki "derleyicim qt creator" ile ne demek istediginizi anlayamadim. Fakat eger OpenCV duzgun kurulmus ise, Python + Ubuhtu ile bu sistemin islemesi lazim. Ilk yapmaniz gereken ornek kodlari isletebilmek bence..