Opencv C++ haar cascade xml dosyası ile nesne bulma

talhakoc 16 Mart 2015OpenCv

Haar Cascade sınıflandırıcımızı eğittikten sonra belirlediğimiz dosyada cascade.xml dosyası oluşmuştu. Bu dosyayı herhangi bir resimdeki ya da videodaki nesneleri bulmada kullanacağımızı söylemiştik. Şimdi bu .xml dosyasını nasıl kullanacağımızı inceleyelim.

Yeni proje oluşturup opencv kütüphanesini ekleyin. ve aşağıdaki kodu yapıştırın.

#include “stdafx.h”
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <stdio.h>

using namespace std;
using namespace cv;
int main(int argc, const char** argv)
{
CascadeClassifier nesne;
nesne.load(“cascade.xml”);
VideoCapture vid;
vid.open(0);

if (!vid.isOpened())
{
cout<<“webcam yuklenemedi”<<endl;
system(“Pause”);
return -1;
}
Mat frame;
Mat grires;
namedWindow(“algilanan”, 1);

while(true)
{
vid>>frame;
cvtColor(frame, grires, CV_BGR2GRAY);  //resmi gri renk uzayına çevirir. 
//equalizeHist(grires, grires); //istenirse histogram eşitlenir. 
vector<Rect> nesvek;
nesne.detectMultiScale(grires, nesvek, 1.1, 3, 0, Size(30,30));
for(int i = 0; i < nesvek.size(); i++)
{
Point pt1(nesvek[i].x + nesvek[i].width, nesvek[i].y + nesvek[i].height);
Point pt2(nesvek[i].x, nesvek[i].y);
rectangle(frame, pt1, pt2, cvScalar(0, 255, 0, 0), 1, 8, 0);
}
imshow(“algilanan”, frame);
waitKey(33);
}
return 0;
}

Programın çalışması için oluşturduğunuz xml dosyasını projenin bulunduğu dizine eklemek zorundasınız. oluşan cascade.xml dosyasını bu dizine kaydedin ve Solution explorerda bulunan Source File dosyasına sağ tıklayarak add>Existing Item yoluyla dizininizdeki cascade.xml dosyasını seçin.

CascadeClassifier nesne;
nesne.load(“cascade.xml”);

Yukarıdaki kod parçacığında CascadeClassifier klasında nesne isimli bir değişken oluşturulur. Bu klas haar cascade ile eğitilmiş sınıflandırıcı ile işlemlerin yapılabildiği bir klastır. oluşturulan değişkene .load komutu ile dizinimizdeki cascade.xml dosyasını yüklüyoruz.

Daha sonraki komutlarla webcam açılıp kontrolü yapılır. Sonsuz bir döngü oluşturularak webcamdan frame okunur ve okunan frame gri renk uzayına dönüştürülür. Çünkü haar cascade sınıflandırıcısı gri renk uzayında tarama yapabilmektedir. İstenirse histogram eşitlenebilir ancak bu reel time çalışanları yavaşlatabilir.

vector<Rect> nesvek;
nesne.detectMultiScale(grires, nesvek, 1.1, 3, 0, Size(30,30));

bulmak istenilen nesnenin dikdörtgen çerçeve içerisine alınması için dikdörtgen nesne vektörü oluşturulur. detectMultiScale komutuyla eğitilmiş olan sınıflandırıcıya göre nesneler ilk parametrede verilen resimde bulunarak ikinci parametredeki dikdörtgen vektör değişkenine yüklenir. Bundan sonraki parametreler sınıflandırıcınızın resminiz üzerinde nasıl bir tarama yapacağıyla alakalıdır. sınıflandırıcı bütün bir resmi farklı boyutlarda defalarca tarayacaktır. Bu şekilde resimde bulunan nesneleri bulabilecektir. Ancak Bu bilgisayara büyük bir işlem yükü oluşturacağı için reel time çalışmalarda projenizin hızını yavaşlatacaktır. Üçüncü parametre resimdeki parametrenin ölçümüyle alakalıdır. Dördüncü parametre ise komşu çerçeve taraması ile alakalıdır. Dördüncü parametre haartraining denilen eski haar cascade sınıflandırıcı eğitimini kullananlar için gereklidir. Biz yeni versiyonunu kullandığımız için bu parametreye ihtiyacımız yoktur. Ve son parametre de hangi büyüklükten sonrasının taranması gerektiğidir. Eğer bu değeri çok düşük tutarsanız bilgisayarınız çok daha fazla işlem yapacaktır. Eğer çok yüksek tutarsanız sadece çok büyük nesneleri bulabilecektir.

for(int i = 0; i < nesvek.size(); i++)
{
Point pt1(nesvek[i].x + nesvek[i].width, nesvek[i].y + nesvek[i].height);
Point pt2(nesvek[i].x, nesvek[i].y);
rectangle(frame, pt1, pt2, cvScalar(0, 255, 0, 0), 1, 8, 0);
}

Yukarıdaki kodlar ise elde edilen nesne dikdörtgenlerini çizdirme görevini görür. nesne dikdörtgen değişkeni, çerçevelerin sol üst köşe koordinantları ve genişlik ve yükseklik değerlerini tutar. Bu değerler kullanılarak dikdörtgenin iki noktası Point sınıfında birer değişken ile tutularak rectangle komutuyla birleştirilir. rectangle fonksiyonunda birinci parametre çizilmesini istediğiniz resim, ikinci ve üçüncü parametreler çerçevenin karşılıklı iki köşe noktası, dördüncü parametre rengini, beşinci parametre kalınlığını, altıncı çizgi tipini ve yedinci de kayma miktarını belirtir.

Aşağıdaki el takip örneği yaklaşık 3500 pozitif, 850 negatif örnekle eğitilmiş sınıflandırıcı kullanılmıştır.

Videonun donması, yavaş olması eğitim parametrelerinin ince ayarlı olmasındandır. parametreler biraz gevşetilirse daha hızlı ve daha az duyarlı bir algılayıcı elde edilebilir.

Bir sonraki ders: Opencv Ders 28(Haar Cascade Yüz ve Göz Algılama ve Takip)

28 thoughts on “Opencv C++ haar cascade xml dosyası ile nesne bulma

    1. Emre Bey, güzel yorumunuz için teşekkür ederim. Opencv kurulu ve siz başka projeleri çalıştırabiliyor musunuz? Bir de solution itemde bulunan dosyaları exe dosyanızın bulunduğu dizine kopyaladınız mı?

      1. cevap verdiğiniz için teşekkür ederim evet çalışıyor ancak son attığım gibi bir veriyor calışmaya deva ediyor bu yüzden pc ye format attım ve tekrar yüklüyorum
        http://i.hizliresim.com/3YMqBO.png
        sıkıntı çıkaran asıl hata bu ama çözemedim bir türlü

          1. maalesef çözemedim o halde bıraktım eğer siz çözerseniz benide haberdar ederseniz çok memnun kalırım

          2. Ben size yazdıktan sonra şu şekilde bir çözüme ulaştım. Solution explorer kısımında oluşturduğunuz dosya ismine sağ tıklayıp properties i seçin linker->input kısmında additional dependencies kısmına sadece opencv_world310d.lib yazın diğeri ile çakışıp hata veriyorlar. Ben bu şekilde çözdüm.

          3. Teşekkürler çok makbule geçti sizede başarılar dilerim

  1. Ben size yazdıktan sonra şu şekilde bir çözüme ulaştım. Solution explorer kısımında oluşturduğunuz dosya ismine sağ tıklayıp properties i seçin linker->input kısmında additional dependencies kısmına sadece opencv_world310d.lib yazın diğeri ile çakışıp hata veriyorlar. Ben bu şekilde çözdüm.

    1. sorunu buldum. VideoCapture vid;
      vid.open(0); kısmında vid.open(-1) yapınca sorun düzeldi. büyük ihtimalle kameradan görüntü alamayınca hata verdi.

  2. Teşekkürler 60 pozitif 24 negatif resim kullanarak çok iyi sonuç alamasamda çalıştırmayı başardım.

  3. Merhabalar Talha Hocam;
    Paylaşımlarınızdan dolayı teşekkür ederim bir sorum olacaktı xml dosyasının içeriği ne anlama gelmektedir

    BOOST
    LBP
    24
    24

    GAB
    0.9950000047683716
    0.5000000000000000
    0.9500000000000000
    1
    100

    256
    20

    3
    -0.7520892024040222

    0 -1 46 -67130709 -21569 -1426120013 -1275125205 -21585
    -16385 587145899 -24005

    -0.6543210148811340 0.8888888955116272
    .
    .
    .

    9 5 1 1

    1. Her birinin geniş izahatı var ama kabaca sınıflandırıcı eğitimindeki parametre değerlerini tutmaktadır. Bu parametrelerle nesneleri bulabiliyorsunuz.

  4. Merhaba, ben bu uygulamaayı yaptım fakat çalışması webcam açılıyor. ama yüz veya göz algılarken o kutu lar çıkmıyor onları nasıl çıkaracağım

  5. Merhaba. Öncelikle bukadar emeğiniz için teşekkürlerimi sunmak isterim. Projemde opencv kullanacağım.

    Şöyle bir sorun yaşıyorum: farklı bir haarcascade xml dosyasını nasıl kullanacağım?(yüz tanıma, göz tanıma) Aynı kodlar üzerinde değişiklik yaptım ancak program çalışıp öylece duruyor. VS2015 ile projemi geliştiriyorum. Yardımcı olurmusunuz?

      1. Teşekkür ediyorum bu büyük yardımınız için. Farklı sorularımla rahatsızlık vermem inş.

  6. Merhaba, öncelikle dersleriniz için çok teşekkür ederim çok yararlı bir paylaşım olmuş.Bu projenin xml dosyasını paylaşmanız mümkün mü acaba?

    1. Rica ederim, ben yöntemi gösterdim, xml dosyaları özel emek harcayan şeyler, bunları da sizler hazırlarsanız paylaşabiliriz.

  7. Merhaba,öncelikle sayenizde opencv ile ilgili birçok şey öğrendim bunun için teşekkür ederim.Bu hazırladığımız xml dosyasını java,c# gibi dillerde opencv içinde kullanabilir miyiz ?

    1. Bildiğim kadarıyla opencv ile bütün platformlarda haar cascade detector için kullanabilirsiniz.

yalçın için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Arama

Twitterda

© 2014 - Talha Koç. All Rights Reserved. Powered by Wordpress and Design by We Create Web Designs