Opencv C++ ile Webcamdan Pozitif Örnek Oluşturma

talhakoc 15 Mart 2015OpenCv

Pozitif örnek oluşturmak sınıflandırıcı eğitiminin en zor en meşakkatli işidir. binlerce örnek resmin bulunması bir yana, herbir resimden seçilmesi istenen nesnenin tek tek işaretlenmesi gerekmektedir. Bunun da webcam ile kolaylaştırılması mümkündür. Webcam’dan alınan görüntü ekrana yansıtılır ve ekranda çizgilerle bir dikdörtgen oluşturularak seçilmesini istenen nesne dikdörtgenin içerisine tutulur. Çerçeve boyutu trackbarlar ile kontrol edilir ve saniyede 3-4 frame alarak farklı açılarda örnekler elde edilir.

Yeni bir proje oluşturun ve opencv kütüphanesini ekledikten sonra aşağıdaki kodu yapıştırın.

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

using namespace std;
using namespace cv;

int main(int argc, char* argv[])
{
VideoCapture vid(1);
if (!vid.isOpened())
{
cout<<“webcam yüklenemedi”<<endl;
waitKey();
}
int sayici=0;
cout<<“Devam eden pozitif resim sayi ismini giriniz…”<<endl;
cin>>sayici;
namedWindow(“Nesneyi ortaya gösterin.”,CV_WINDOW_AUTOSIZE);
ofstream file;
file.open(“pozitif.txt”, ios::app);
Mat gec; //siyah arka plan için geçici mat değişkeni
vid.read(gec);
Mat arka; //üzerine çizgi çizmek ve yazı yazmak için kullanılan değişken.

vector<int> sparam;
sparam.push_back(CV_IMWRITE_JPEG_QUALITY);
sparam.push_back(50);
char yazi[250]; //yüzde d li terimleri yazabilmek için kullanılan dizi
int bekle=0; //başladıktan sonra geri sayıcı için kullanılan değişken

int genislik = 120;
createTrackbar(“Genislik”, “Nesneyi ortaya gösterin.”, &genislik, 320);
int yukseklik = 120;
createTrackbar(“Yukseklik”, “Nesneyi ortaya gösterin.”, &yukseklik, 240);
int xeks1=200,xeks2=440,yeks1=120,yeks2=360;
int basla=-1;

while (1)
{

Mat frame;
bool kont=vid.read(frame);
flip(frame,frame,1); //ücüncü 1 parametresi y eksenine göre resmin simetriğini alır ki videodan alınan görüntü düzleşir. 0 olsa x e göre
if (!kont)
{
cout<<“frame yuklenmedi”<<endl;
}
xeks1=(640-(genislik*2))/2;
xeks2=xeks1+(genislik*2);
yeks1=(480-(yukseklik*2))/2;
yeks2=yeks1+(yukseklik*2);
arka=Mat::zeros(gec.size(),gec.type());
line(arka,Point(xeks1,0),Point(xeks1,480),Scalar(0,255,0),1); //arka plana belirlenen büyüklükte frame oluşturulur.
line(arka,Point(xeks2,0),Point(xeks2,480),Scalar(0,255,0),1);
line(arka,Point(0,yeks1),Point(640,yeks1),Scalar(0,255,0),1);
line(arka,Point(0,yeks2),Point(640,yeks2),Scalar(0,255,0),1);
char a=waitKey(480);
if (basla==-1) //eğer foto kaydı başlamadıysa bilgilendirme yazisi için.
{
bekle=0;
putText(arka,”Nesneyi Ekranin Ortasina Tutunuz”,Point(20,30),CV_FONT_HERSHEY_COMPLEX,1,Scalar(255,255,255));
putText(arka,”‘b’ tusu ile egitime baslayiniz…”,Point(20,60),CV_FONT_HERSHEY_COMPLEX,1,Scalar(255,255,255));
putText(arka,”cikis icin esc tusuna basili tutunuz.”,Point(10,460),CV_FONT_HERSHEY_COMPLEX,1,Scalar(255,255,255));
}
if(a==’b’) //klavyeden b ye basılırsa baslayı değiştirir.
basla=basla*(-1);
if(basla==1&&bekle<=10) //foto kayıta başlandı.
{
if (bekle%2==0)
{
_snprintf_s(yazi,250,”%d”,5-bekle/2); //geri sayıcı
putText(arka,yazi,Point(20,20),CV_FONT_HERSHEY_COMPLEX,1,Scalar(255,255,255));
}
bekle++;
}
if(bekle>=10)
{
putText(arka,”Resim Ekleniyor…”,Point(20,20),CV_FONT_HERSHEY_COMPLEX,1,Scalar(255,255,255));
_snprintf_s(yazi,250,”C:/OpencvCascadeEgitim/img/pozitif/%d.jpg”,sayici);
imwrite(yazi,frame,sparam); //belirtilen yola kaydedildi.
_snprintf_s(yazi,250,”C:\\OpencvCascadeEgitim\\img\\pozitif\\%d.jpg”,sayici);
file<<yazi<<” 1 “<<xeks1<<” “<<yeks1<<” “<<(genislik*2)<<” “<<(yukseklik*2)<<endl; //belirtilen yolla beraber kırpılma oranı girildi.
sayici++;
}
frame=frame+arka; //webcamdan alınan frame e yazılar ve çizgiler eklenerek kullanıcıya gösterildi.
imshow(“Nesneyi ortaya gösterin.”,frame);
if (waitKey(20)==27)
{
file.close();
break;
}
}
return 0;
}

Bir önceki dersteki kodlamalardan faklı olarak:

Mat gec; //siyah arka plan için geçici mat değişkeni
vid.read(gec);
Mat arka; //üzerine çizgi çizmek ve yazı yazmak için kullanılan değişken.

Bunlar video frameinin üzerine çizgi çizmek için kullanılır.

int genislik = 120;
createTrackbar(“Genislik”, “Nesneyi ortaya gösterin.”, &genislik, 320);
int yukseklik = 120;
createTrackbar(“Yukseklik”, “Nesneyi ortaya gösterin.”, &yukseklik, 240);
int xeks1=200,xeks2=440,yeks1=120,yeks2=360;

Bu kodlar resmin üzerindeki çerçevenin yükseklik ve genişliğinin ayarlanmasını sağlayacak trackbarlardır. en alttaki integer değerler çerçevenin sol üst ve sağ alt koordinantlarıdır.

int basla=-1;

Bu kod videodan resim kaydetmeye başlayıp başlamamasını kontrol etmek için tanımlanmıştır.

Sonsuz bir döngü kurup videodan frame alınmıştır ve kontrolü yapılmıştır. Farklı olarak flip(frame,frame,1); komutu vardır. Bu komutta birinci parametre giriş resmi, ikinci parametre çıkış resmi, üçüncü parametre ise y veya x eksenine göre mi simetri alınacağıdır. Eğer “1” olursa “y”, “0” olursa “x” eksenine göre simetrisi alınır. webcamdan alınan görüntü y eksenine göre ters alındığı için bu kod ile düzeltilmiştir.

xeks1=(640-(genislik*2))/2;
xeks2=xeks1+(genislik*2);
yeks1=(480-(yukseklik*2))/2;
yeks2=yeks1+(yukseklik*2);
arka=Mat::zeros(gec.size(),gec.type());
line(arka,Point(xeks1,0),Point(xeks1,480),Scalar(0,255,0),1); //arka plana belirlenen büyüklükte frame oluşturulur.
line(arka,Point(xeks2,0),Point(xeks2,480),Scalar(0,255,0),1);
line(arka,Point(0,yeks1),Point(640,yeks1),Scalar(0,255,0),1);
line(arka,Point(0,yeks2),Point(640,yeks2),Scalar(0,255,0),1);

Bu komutlarla trackbarlardan alınan yükseklik ve genişlik değerleri kullanılarak sıfır matrisi olan siyah arka isimli resme çerçeve çizilir.

if (basla==-1) //eğer foto kaydı başlamadıysa bilgilendirme yazisi için.
{
bekle=0;
putText(arka,”Nesneyi Ekranin Ortasina Tutunuz”,Point(20,30),CV_FONT_HERSHEY_COMPLEX,1,Scalar(255,255,255));
putText(arka,”‘b’ tusu ile egitime baslayiniz…”,Point(20,60),CV_FONT_HERSHEY_COMPLEX,1,Scalar(255,255,255));
putText(arka,”cikis icin esc tusuna basili tutunuz.”,Point(10,460),CV_FONT_HERSHEY_COMPLEX,1,Scalar(255,255,255));
}

Eğer resim kaydı başlamadıysa ekrana belirtilen noktalara putText fonksiyonların ikinci parametreleri yazılır.

if(a==’b’) //klavyeden b ye basılırsa baslayı değiştirir.
basla=basla*(-1);

Yukarıdaki koda göre eğer kullanıcı “b” tuşuna basarsa basla değişkeni -1 ise 1, 1 ise -1 değerini alacaktır. basla değişkeni 1 olduğunda geri sayıcı başlatılır ve beş saniye sonra resimler kaydedilmeye başlar.

if(basla==1&&bekle<=10) //foto kayıta başlandı.
{
if (bekle%2==0)
{
_snprintf_s(yazi,250,”%d”,5-bekle/2); //geri sayıcı
putText(arka,yazi,Point(20,20),CV_FONT_HERSHEY_COMPLEX,1,Scalar(255,255,255));
}
bekle++;
}

yukarıdaki kod ile başla aktif edildikten sonra beşten geriye sayım ekrana putText komutuyla yansıtılır.

if(bekle>=10)
{
putText(arka,”Resim Ekleniyor…”,Point(20,20),CV_FONT_HERSHEY_COMPLEX,1,Scalar(255,255,255));
_snprintf_s(yazi,250,”C:/OpencvCascadeEgitim/img/pozitif/%d.jpg”,sayici);
imwrite(yazi,frame,sparam); //belirtilen yola kaydedildi.
_snprintf_s(yazi,250,”C:\\OpencvCascadeEgitimtrain\\img\\pozitif\\%d.jpg”,sayici);
file<<yazi<<” 1 “<<xeks1<<” “<<yeks1<<” “<<(genislik*2)<<” “<<(yukseklik*2)<<endl; //belirtilen yolla beraber kırpılma oranı girildi.
sayici++;
}

Ekrana resim ekleniyor yazısı yansıtılır ve frame belirtilen klasöre kaydedildikten sonra pozitif.txt dosyasına resimler çerçevenin koordinantlarıyla beraber yazılır. Nesne çerçevenin içerisine tutulacağı için o koordinantlar nesnenin koordinantları olacaktır. Tekrar “b” tuşuna basılarak resim kaydı durdurulup başlatılabilir.

opencv pozitif resim1

“b” ile başlatıyorsunuz. ve geri sayım başlıyor…

opencv-haarcascade-egitimi-pozitif-resim

 

Geri sayım bittikten sonra resim eklenmeye başlıyor.

opencv pozitif resim2

 

Veri eklenen pozitif klasörü:

opencv pozitif resim3

pozitif.txt dosyası:

opencv pozitif resim4

Böylelikle pozitif ve negatif yöntemleri anlatmış olduk. İkisinin de birbirine göre avantajlı ve dezavantajlı noktaları vardır. İstediğiniz şekilde sınıflandırıcı oluşturabilirsiniz.

Bir sonraki ders:Opencv Ders 27(Haar Cascade xml Dosya Kullanımı)

5 thoughts on “Opencv C++ ile Webcamdan Pozitif Örnek Oluşturma

  1. programı çalıştırdığımda,ekranda “Devam eden pozitif resim sayi ismini giriniz…” bundan sonra hata veriyor,frame yüklenmedi uyarısı geliyor,nerede hata olabilir ?

    1. webcaminizden yeni bir frame alamamışsınız demektir. webcaminizin çalışıp çalışmadığından emin olun. eğer çalışıyorsa mevcut webcam’a ulaşılamamış demektir. VideoCapture vid(1); komutundaki “1” sayısı yerine “0” ve diğer sayıları deneyin.

  2. “Unhandled exception at 0x000007feedae421d in OpenCVCascadeEgitimi3.exe: 0xC0000005: Access violation reading location 0x0000000000000024.” Bu şekilde bir hata alıyorum. Ne yapmalıyım bir öneriniz var mı? Teşekkürler

  3. Hocam bahsettiğim sorunu çözdüm ancak bir başka sorum olcaktı pozitif.txt dosyası nerde olmalı. Fotoğrafları kaydediyor ancak txt dosyasına yazmıyor. Aynı durum bir önceki negatif resim oluşturmada da vadı.

Bir cevap yazın

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

WordPress spam blocked by CleanTalk.

Arama

Twitterda

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