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

talhakoc 15 Mart 2015OpenCv

İçinde nesne bulunmayan negatif resimlerin ve içinde nesnenin bulunduğu pozitif resimlerin binlercesini toplamak kolay olmayacaktır. Mesela nesne olarak bir kalemi seçecekseniz kalemin farklı açılardan binlerce fotoğrafını çekmeniz gerekmektedir. Bunun yanında da kalemi seçeceğiniz arka plan resimlerinden yüzlercesini toplamanız, oluşturmanız gerekmektedir. Diğer türlü iyi bir sınıflandırıcı oluşturamazsınız. Resimlerin bir kısmını internette bulabilirsiniz ancak yeterli sayıda bulmak yine uğraştıracaktır.

Bu problemin bir kısmına çözüm olarak webcam üzerinden negatif ve pozitif resimler otomatik olarak oluşturabilmek için webcamdan negatif ve pozitif resim oluşturucusu üzerinde çalışalım. Eğer nesneniz bilgisayarınızın webcami ile algılanabilecek bir nesne ise bu yöntemi kullanmanız işinizi çok kolaylaştıracaktır. Yapacağımız iş, webcamdan belirli salise aralıklarla frame frame resim çekip onu sınıflandırıcımızın bulunduğu dizindeki img klasörünün içindeki “negatif” klasörüne ya da “pozitif” klasörüne kaydedecek ve kaydedilen resmin ismini text dosyasına yazacaktır. Eğer pozitif resim ise, nesnenin belirli bir aralıkta tutulması istenecek ve o aralık kırpma parametresi olarak pozitif.txt dosyasına eklenecektir. Böylelikle yapılan iş yükü büyük ölçüde azalabilecektir.

Webcamdan negatif resimlerin oluşturulması ile başlayalım. Yeni bir proje oluşturup opencv kütüphanesini ekledikten sonra aşağıdaki kodu kopyalayınız.

#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(0);
if (!vid.isOpened())
{
cout<<“webcam yüklenemedi”<<endl;
waitKey();
}
int sayici,bekle=0;
cout<<“Kaldiginiz negatif resim sayisini giriniz…”<<endl;
cin>>sayici;
ofstream file;
file.open(“negatif.txt”,ios::app);
vector<int> sparam;
sparam.push_back(CV_IMWRITE_JPEG_QUALITY);
sparam.push_back(50);
char yazi[250]; // sayici ile sürekli değişen dosya yolunu klasöre ve txt dosyasına yazabilmek için karakter dizisi gerekmektedir.
while (true)
{
bekle++;
Mat frame;
bool kont=vid.read(frame);
if (!kont)
{
cout<<“frame yuklenmedi”<<endl;
}

if(bekle>11)
{
_snprintf_s(yazi,250,”C:/OpencvCascadeEgitim/img/negatif/%d.jpg”,sayici);
imwrite(yazi,frame,sparam);
_snprintf_s(yazi,250,”C:\\OpencvCascadeEgitim\\img\\negatif\\%d.jpg”,sayici);
file<<yazi<<endl;
sayici++;
}
imshow(“Nesne olmasin.”,frame);
if (waitKey(450)==27)
{
file.close();
break;
}
}
return 0;
}

Yukarıdaki programı incelediğimizde VideoCapture klasıyla webcam a bağlanıldığını ve kontrol edildiğini görüyoruz. Eğer bilgisayarınıza sonradan bağladığınız harici bir webcam kullanıyorsanız VideoCapture vid(0); komutundaki “0” yerine “1” yazmalısınız. Daha sonra integer olarak sayici ve bekle değişkenleri tanımlandı. Program resimlerin farklı zamanlarda resim oluşturabilmesi için sayici isimli sayı değerinden başlamak üzere “C:\OpencvCascadeEgitim\img\negatif\” dosya yoluna webcamdan aldığı resimleri sırasıyla yazacaktır. Örneğin sayici değeri 50 olursa belirtilen dosya yoluna “50.jpg, 51.jpg, 52.jpg… ” tarzında artarak devam eden şekilde resimleri kaydedecektir. “bekle” değişkeni de resimler oluşturulmaya başlanmadan 4-5 saniye hazırlık süresi olması için koyulmuştur. Yani program 4-5 saniye sonra resim kaydetmeye başlayacaktır.

cout<<“Kaldiginiz negatif resim sayisini giriniz…”<<endl;
cin>>sayici;

yukarıdaki komutlarda kullanıcıdan sayici değişkeninin değerinin girilmesi istenmektedir. En son negatif klasöründe hangi resim sayısı kayıtlıysa bir fazlasının girilmesi gerekmektedir. Yoksa en son sayı ismindeki resmin üstüne yazılacaktır.

ofstream file;
file.open(“negatif.txt”,ios::app);

Yukarıdaki komutlar ise negatif.txt dosyasını açarak dosyadaki mevcut verilere dışarıdan veri eklenebilir hale getirir. Eğer ios::end olsaydı içindeki veriler silinip tekrar yazılacağını unutmayınız. Resim oluşturma işleme tekrar tekrar kullanılması gerektiği için ios::app durumunda olması gerekmektedir.

vector<int> sparam;
sparam.push_back(CV_IMWRITE_JPEG_QUALITY);
sparam.push_back(50);

Webcamdan alıcağımız resimlerin yüklenmesi için parametre oluşturulur. Kalite olarak da “50” yeterlidir. İsterseniz kaliteyi yükseltebilirsiniz.

while (true)
{
bekle++;
Mat frame;
bool kont=vid.read(frame);
if (!kont)
{
cout<<“frame yuklenmedi”<<endl;
}

Yukarıdaki kod parçacığında ise videodan yeni bir frame çekerek kontrol edilir.

if(bekle>11)
{
_snprintf_s(yazi,250,”C:/OpencvCascadeEgitim/img/negatif/%d.jpg”,sayici);
imwrite(yazi,frame,sparam);
_snprintf_s(yazi,250,”C:\\OpencvCascadeEgitim\\img\\negatif\\%d.jpg”,sayici);
file<<yazi<<endl;
sayici++;
}

Yukarıdaki kod parçacığında ise _snprintf komutuyla sayici değeri yazi karakter dizisine eklenir ve önce imwrite ile belirtilen parametrede belirtilen klasöre yazdırılır ve sonrasında text dosyasına eklenir. Burada imwrite komutunda dosya yolunun “/” ile, not defteri kısmını da “\” ile oluşturulduğunu göz önünde alınız. Bilgisayar “\” kullanırken program “/” kullanmaktadır. C++ ise “\\” işaretini tek “\” algılamaktadır.

if (waitKey(450)==27)
{
file.close();
break;
}

waitKey ile 450 ms beklemesi yaklaşık olarak saniyede iki frame çekmesi anlamına gelmektedir. Yani hareketli bir webcam ile farklı frameler elde edilecektir. Harici webcam kullananlar rahatlıkla bunu kullanabilir.

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

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