Opencv C++ ile Haar Cascade Negatif Örnek Listeleyicisi

talhakoc 15 Mart 2015OpenCv

Merhabalar, Önceki derslerimizde haar cascade sınıflandırıcısının çalışma mantığını ve nasıl eğitildiğini işlemiştir. Sınıflandırıcı eğitiminde pozitif ve negatif örneklerin teker teker txt dosyasına kaydetmek çok zor ve uzun zaman almaktadır. Şimdi öncelikle haar cascade sınıflandırıcı eğitiminde kullanacağınız negatif resimleri otomatik olarak negatif.txt dosyasına nasıl kaydedeceğimiz üzerine çalışalım.

Bu derste hem bir önceki derste gösterilen negatif dosyanın dosya isim ve yollarının negatif.txt dosyasına nasıl kolayca kaydedilebileceğini, hem de opencv C++ kullanarak bir klasördeki resimleri nasıl okuyup işleyebileceğinizi öğreneceksiniz. Visual Studio da bir c++ projesi oluşturun opencv kütüphanesini ekledikten sonra aşağıdaki kodları kopyalayıp yapıştırın. Komutlarda geçen uzun yorulmarın satır başlarına gelmemesine dikkat ediniz.

#include “stdafx.h”
#include <iostream>
#include <opencv2\opencv.hpp>
#include “dirent.h”
#include<fstream>
#include <string>

using namespace std;
using namespace cv;

int main(int argc, char* argv[])
{

string girisdosya = “C:\\OpencvCascadeEgitim\\img\\negatif”; //negatif resimlerimizin bulunduğu klasörün yolunu string olarak tutar.
DIR *klasor = opendir (girisdosya.c_str()); //okunmak istenen klasör açılır. ve klasor değişkenine atanır
struct dirent *dosyagirdisi = NULL; //Klasordeki o anki göstericideki dosyanın hangisi olduğu sonucunu tutar. Başlangıçta null verilmiştir.

ofstream file; //yazı dosyası klasından bir dosya oluşturulur.
file.open(“negatif.txt”, ios::end); //pozitif.txt isimli text dosyası açar.

if(klasor == NULL) //eğer klasör açılmazsa program sonlandırılır.
{
printf(“Giriş Dosyası acilamadi\n”);
return 1;
}
while((dosyagirdisi = readdir(klasor)) != NULL)
{
string dosyaismi = girisdosya + “\\” +string(dosyagirdisi->d_name); //dosya yoluyla beraber dosya ismini dosyaismi değişkenine atar.
Mat araresim = imread(dosyaismi.c_str());
if(araresim.data == NULL) //resim açılmazsa döngüye geri dön
{
printf(“resim acilamadi\n”);
continue;
}
file<<dosyaismi<<endl;
}
closedir(klasor);
}

http://www.softagalleria.net/download/dirent/ sitesinden en son dirent zip dosyasını indirin ve zip dosyasının içerisindeki dirent.h dosyasını oluşturduğunuz C++ projenizin bulunduğu dizine kopyalayın.

opencv-haarcascade-negatif-ornek

 

İşlem tamamlandıktan sonra Visual Studio üzerinde Solution explorerdaki Header Files sekmesine sağ tıklayarak Add>Existing Item yolunu izleyin ve dirent.h dosyasını seçerek projenize ekleyin.

opencv-haarcascade-negatif-ornek1

 

Bu kütüphane dosyası, klasör işlemlerinin yapılabildiği kullanışlı bir başlık dosyasıdır ve klasör açmak, içerisindeki dosyaları okumak veya bir klasördeki dosyaları başka bir klasöre yazmak gibi işlemleri yapabilir. Bu Dosyayı ekledikten sonra programınız çalışabilir duruma gelecektir. Yukarıdaki uygulama, sınıflandırıcı eğitimi için oluşturduğunuz  OpencvCascadeEgitim klasöründe bulunan img klasöründeki negatif klasörün içerisine attığınız negatif resimlerin dosya ismi ve yolunu negatif.txt isimli bir dosyaya yazar ve bu dosya  da c++ programınızın kayıtlı olduğu dizinde oluşturulur. Programı çalıştırdıktan sonra oluşan exe dosyasını OpencvCascadeEgitim klasörüne yani sınıflandırıcıyı eğittiğiniz klasöre kopyalarsanız oradaki negatif.txt dosyasına işlem yapacaktır. bunu yapmazsanız negatif.txt dosyasını projenizin bulunduğu dizinden sınıflandırıcıyı eğittiğiniz (OpencvCascadeEgitim) dizine kopyalamalısınız.  Şimdi ilk defa karşılaştığımız kodları inceleyelim:

* DIR *klasor = opendir (girisdosya.c_str()); komutu dirent.h da bulunan dir klasında klasör isimli bir gösterici değişkeni oluşturur. opendir fonksiyonu ile fonksiyonun parametresi içerisindeki isimdeki klasör açılır. Bu göstericiye değer olarak girisdosya isimli değişken, yani negatif resimlerimizin bulunduğu klasörümüzün yolu verilir. c_str() ise string ifadenin fonksiyonun tanıyabileceği karakter haline (char) dönüşmesini sağlar.

* struct dirent *dosyagirdisi = NULL; komut satırı ise dirent yapı sınıfında dosyagirdisi isimli bir gösterici tanımlar. Bu gösterici belirtilen klasörün içerisindeki dosya bilgilerinin yerlerini tutacaktır. Böylelikle klasörün içerisindeki dosyaların isimlerine ulaşabileceğiz.

* ofstream file; komutu ise ofstream sınıfında bir file değişkeni oluşturulur ve bu sınıf text dosyası işlemleri yapabilmemizi sağlar.

* file.open(“negatif.txt”, ios::end); Bu komut negatif.txt isimli bir dosyayı açar ve eğer dosya yoksa oluşturur. Fonksiyonun ikinci parametresi ise mevcut text dosyasının içerisinde veri varsa onun silinip üzerine bilgilerin yazılması anlamı taşır. Eğer “ios::end” , “ios::app” komutu ile değiştirilirse text dosyasının içindeki veriler silinmez ve mevcut yeni bilgiler text dosyasındaki bilgilere eklenir.

* while((dosyagirdisi = readdir(klasor)) != NULL) while döngüsünün içerisinde, readdir(klasor) fonksiyonu ile klasor değişkenindeki negatif isimli klasörden bir dosya okunur ve okunan değer dosyagirdisi isimli daha önce oluşturulan göstericide tutulur. Eğer klasörde okunan dosyalar biterse dosya girdisi boş, yani NULL değerini vereceği için döngüden çıkılarak program sonlanır. Yani aynı zamanda bu komut programı klasördeki dosyalar bitene kadar devam ettirir.

* string dosyaismi = girisdosya + “\\” +string(dosyagirdisi->d_name); bu komut negatif isimli dosya yoluna dosya ismini ekler. string(dosyagirdisi->d_name) ifadesinde dosyagirdisi göstericisinin ismi string olarak döndürülür.

*  file<<dosyaismi<<endl; bu komut file değişkeninde açılan negatif.txt dosyasına dosyaismi değişkeninin tuttuğu klasör yoluyla beraber dosya ismini yazar.

* closedir(klasor); bu komut açılan klasörü kapatır.

Böylelikle bir dosyada bulunan resimlerin nasıl işlenebildiğini ve dışarıdan eklediğimiz resimleri negatif.txt dosyasına program kullanarak kaydetmeyi öğrenmiş olduk.

Bir sonraki ders: Opencv C++ Ders 24(Haar Cascade Pozitif Örnek Listeleme, İşaretleme)

2 thoughts on “Opencv C++ ile Haar Cascade Negatif Örnek Listeleyicisi

  1. keşke bu dersleri de videoda anlatılsaymış verdiğin kodları ve anlatılanları uyguladım fakat boş bir siyah ekran açılıp hemen kapanıyor bir hata almıyorum

  2. Bu yazılanları uygulayarak sınıflandırıcı eğitenler var. ” işaretlerine dikkat edin. Video konusunda yeterli imkanım olmadı.

Serdar 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