Opencv C++ ile Haar Cascade Pozitif Örnek İşaretleyici

talhakoc 15 Mart 2015OpenCv

Bir önceki dersimizde “negatif” klasöründeki negatif örnek resimlerimizi negatif.txt dosyasına kaydetmeyi işlemiştik. Bu dersimizde yine aynı yöntemi kullanarak mouse çağırma fonksiyonu yardımıyla “pozitif” klasöründeki içerisinde bulmak istediğimiz nesnenin bulunduğu nesnelerin koordinantlarıyla beraber pozitif.txt dosyasına yazdıracağız. Bulunmasını istediğimiz nesnenin koordinantlarını ise bir işaretçi ile resmimizden seçerek belirleyeceğiz. “t” tuşu ile işaretlenen resmi text dosyasına koordinantları ile beraber yazdıracak, “y” tuşu ile bir sonraki resme geçiş yapacağız. çok fazla resim olabileceği için yanyana iki tuş seçiyoruz ki daha hızlı işlem yapabilelim. Pozitif klasörünüzü oluşturduktan sonra bir önceki dersimizdeki gibi yeni bir proje oluşturun ve gerekli kütüphanelerle beraber dirent.h dosyasını ekleyin. Projenize aşağıdaki kodları yapıştırın:

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

using namespace std;
using namespace cv;

Mat araresim;
bool isaretleme=false;
ofstream file; //yazı dosyası klasından bir dosya oluşturulur.
string dosyaismi; //dosya ismi string olarak tanımlanır.
struct dirent *dosyagirdisi = NULL; //Klasordeki o anki göstericideki dosyanın hangisi olduğu sonucunu tutar. Başlangıçta null verilmiştir.
int xeks1,xeks2;
int yeks1,yeks2;

void mausekont(int event, int x, int y, int flags, void *kullanici)
{
araresim = imread(dosyaismi.c_str());
if (event==EVENT_LBUTTONDOWN)
{
isaretleme=true;
xeks1=x;
yeks1=y;
cout<<“Mause sol tiklandi, lokasyon:”<<x<<“x”<<y<<endl;
}
if (event==EVENT_MOUSEMOVE&&isaretleme)
{
xeks2=x;
yeks2=y;
Point pt1(xeks1, yeks1);
Point pt2(xeks2, yeks2);
rectangle(araresim, pt1, pt2, cvScalar(0, 255, 0, 0), 1, 8, 0); //İlk ve ikinci seçilen noktaları dikdörtgen yapar
imshow(“Pozitif Resim Olusturucu”,araresim);
}
if(event==EVENT_LBUTTONUP)
{
if (isaretleme)
{
xeks2=x;
yeks2=y;
Point pt1(xeks1, yeks1);
Point pt2(xeks2, yeks2);
rectangle(araresim, pt1, pt2, cvScalar(0, 255, 0, 0), 1, 8, 0); //İlk ve ikinci seçilen noktaları dikdörtgen yapar
imshow(“Pozitif Resim Olusturucu”,araresim);
cout<<“Mause sol tiklandi, lokasyon:”<<x<<“x”<<y<<endl;
isaretleme=false;
char t=waitKey(0);
if (t==’t’)
{
file<<dosyaismi<<” 1 “<<xeks1<<” “<<yeks1<<” “<<(xeks2-xeks1)<<” “<<(yeks2-yeks1)<<endl; //eğer “t” ye basılırsa dosyaya yazar.
}
}
}
}
int main(int argc, char* argv[])
{

string girisdosya = “C:\\OpencvCascadeEgitim\\img\\pozitif”; //dosya yolunu tutan string değer

DIR *klasor = opendir (girisdosya.c_str()); //okunmak istenen klasör açılır. ve klasor değişkenine atanır

file.open(“pozitif.txt”, ios::end); //pozitif.txt isimli text dosyası açar.

namedWindow(“Pozitif Resim Olusturucu”,CV_WINDOW_AUTOSIZE);

if(klasor == NULL)
{
printf(“Giriş Dosyası acilamadi\n”);
return 1;
}
dosyagirdisi = readdir(klasor); //klasor isimli klasörden yeni bir dosya okuyup dosyagirdisi göstericisine atar.
while(1)
{

dosyaismi = girisdosya + “\\” +string(dosyagirdisi->d_name); //dosya yoluyla beraber dosya ismini dosyaismi değişkenine atar.
araresim = imread(dosyaismi.c_str()); //klasördeki dosyanın string ismi char haline çevrilerek imread fonksiyonu ile araresim Mat değişkenine atandı.
if(araresim.data == NULL)
{
printf(“resim acilamadi\n”); //eğer resim okunamazsa yeni bu mesajı verip yeni dosya okur.
dosyagirdisi = readdir(klasor);
continue;
}
imshow(“Pozitif Resim Olusturucu”,araresim);
setMouseCallback(“Pozitif Resim Olusturucu”,mausekont,NULL); //Mause fonksiyonunu çağırır.
char k=waitKey(0);
if (k==’y’)
{
if (dosyagirdisi == readdir(klasor)==NULL) //eğer y tuşuna basılırsa resmi değiştirir.
{
break;
return 0;
}
}

}
closedir(klasor);
}

Bu programda main ve mousekont isimli iki fonksiyonumuz olduğu için iki fonksiyonda da kullanmak istediğimiz değişkenleri global değişken olarak iki fonksiyonun da üzerinde tanımladık.

Mat araresim;
int sayac=0;
ofstream file; //yazı dosyası klasından bir dosya oluşturulur.
string dosyaismi; //dosya ismi string olarak tanımlanır.
struct dirent *dosyagirdisi = NULL; //Klasordeki o anki göstericideki dosyanın hangisi olduğu sonucunu tutar. Başlangıçta null verilmiştir.
int xeks1,xeks2; //işaretleyicinin sol üst ve sağ alt x eksen değerleri.
int yeks1,yeks2; //işaretleyicinin sol üst ve sağ alt y eksen değerleri.

Yukarıdaki komutlar iki fonksiyonun üzerinde tanımlanmıştır. “araresim” değişkenini dosyadaki resimleri okumak ve ekrana yansıtmak, xeks1,xeks2,yeks1 ve yeks2 değişkenlerini de işaretçimizi çizdirmek için kullanacağız. Diğer komutlar bir önceki dersimizdeki ile aynı işlevleri görecektir. Dileyenler bir önceki derse göz atabilirler. Opencv C++ Ders 23(Haar Cascade Negatif Örnek Listeleme,Klasör Okuma)

Negatif resimleri yazdırırken while döngüsü kontrol kısmında klasörden yeni resimler okutmuştuk ancak bu sefer resimler üzerinde işaretleme işlemi yapacağımız için while döngüsünü sonsuz döngü ayarlayıp resim okuma işini klavyeden girilecek olan bir karakter ile sağladık.

dosyaismi = girisdosya + “\\” +string(dosyagirdisi->d_name); //dosya yoluyla beraber dosya ismini dosyaismi değişkenine atar.
araresim = imread(dosyaismi.c_str()); //klasördeki dosyanın string ismi char haline çevrilerek imread fonksiyonu ile araresim Mat değişkenine atandı.

Yukarıdaki komutlarla dosya yolu ile dosya ismini string olarak tanmlayıp karakter haline çevirerek imread fonksiyonu ile okutarak araresim değişkenine atadık.

if(araresim.data == NULL)
{
printf(“resim acilamadi\n”); //eğer yeni resim okunamazsa bu mesajı verip yeni dosya okur.
dosyagirdisi = readdir(klasor);
continue;
}

Bu komutlarda önceki dersimize göre farklı dosyagirdisi = readdir(klasor); ifadesi var. Çünkü program yeni dosyayı while içerisinde okumadığından yeni resmi okuyana kadar tekrar okumasını istemeliyiz. Okunmamış resmi kaydetmek bir işimize yaramayacaktır.

setMouseCallback(“Pozitif Resim Olusturucu”,mausekont,NULL); //Mause fonksiyonunu çağırır.

Bu komutu Mause kontrol dersimizde işlemiştik. “Pozitif Resim Olusturucu” penceresi üzerinde mause hareketi olduğu taktirde ikinci parametre olan mausekont isimli fonksiyon çağrılıyordu. Şimdi o fonksiyonu inceleyelim:

araresim = imread(dosyaismi.c_str()); Bu komut o an klasörde okunan resmi bir daha araresim değişkenine yükler. Mause ile işaretleme yapıldığında o işaretleme yanlışsa ikinci işaretlemede ilk işaretleme işleminin silinmesi için resmin aslını tekrar yüklüyoruz.

if (event==EVENT_LBUTTONDOWN)
{
isaretleme=true;
if (isaretleme)
{
xeks1=x;
yeks1=y;
cout<<“Mause sol tiklandi, lokasyon:”<<x<<“x”<<y<<endl;
}
}

Bu komutlarda mause a sol tıklandığında işaretleme aktif olacaktırve aynı zamanda işaretçinin bulunduğu koordinant xeks1 ve yeks1 değişkenlerine kaydedilecektir.

if (event==EVENT_MOUSEMOVE&&isaretleme)
{
xeks2=x;
yeks2=y;
Point pt1(xeks1, yeks1);
Point pt2(xeks2, yeks2);
rectangle(araresim, pt1, pt2, cvScalar(0, 255, 0, 0), 1, 8, 0); //İlk ve ikinci seçilen noktaları dikdörtgen yapar
imshow(“Pozitif Resim Olusturucu”,araresim);
}

Bu komutlarla ise işaretçi aktifken mause hareket ettirildiğinde o anki mause konumuna göre xeks2 ve yeks2 oluşturularak dikdörtgen çizilecektir. Bu işaretlenecek dikdörtgeni seçmede kolaylık sağlayabilir.

if(event==EVENT_LBUTTONUP)
{
if (isaretleme)
{
xeks2=x;
yeks2=y;
Point pt1(xeks1, yeks1);
Point pt2(xeks2, yeks2);
rectangle(araresim, pt1, pt2, cvScalar(0, 255, 0, 0), 1, 8, 0); //İlk ve ikinci seçilen noktaları dikdörtgen yapar
imshow(“Pozitif Resim Olusturucu”,araresim);
cout<<“Mause sol tiklandi, lokasyon:”<<x<<“x”<<y<<endl;
isaretleme=false;
char t=waitKey(0);
if (t==’t’)
{
file<<dosyaismi<<” 1 “<<xeks1<<” “<<yeks1<<” “<<(xeks2-xeks1)<<” “<<(yeks2-yeks1)<<endl; //eğer “t” ye basılırsa dosyaya yazar.
}
}
}
}

Mause un tıklanmış olan sol tuşu bırakıldığında ise yine hareket ederkenki olduğu gibi xeks2 ve yeks2 oluşur ve o şekilde kalır. Eğer düzgün işaretlenmişse t tuşu ile file<<dosyaismi<<” 1 “<<xeks1<<” “<<yeks1<<” “<<(xeks2-xeks1)<<” “<<(yeks2-yeks1)<<endl; komutu devreye girerek pozitif dosyanın ismini sol üst köşe koordinantları ve genişlik, yüksekliğiyle beraber pozitif.txt dosyasına yazar.

Yine main fonksiyonuna dönülür ve eğer “y” harfine basılırsa klasörden yeni dosya okunur. Bu şekilde bütün klasördeki dosyalar kırpılma parametreleriyle birlikte text dosyasına kaydedilebilir.

Program çalıştırıldıktan sonra exe dosyası sınıflandırıcının bulunduğu OpencvCascadeEgitim klasörüne kopyalayınız ya da projenizin bulunduğu dizinden pozitif.txt dosyasını OpencvCascadeEgitim klasörüne kopyalayınız.

Bir sonraki ders:Opencv C++ Ders 25(Webcam ile Negatif Resimler Oluşturma)

Bir cevap yazın

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