(Ders 47) OpenCV ile Arka Plan Çıkarma (C++)

(Ders 37) OpenCV ile Kameradaki Görüntüyü Yakınlaştırma (C++)
(Ders 50) OpenCV ile Resim Üzerine Transparan Resim Ekleme (C++)

Size faydalı olduysa, sosyal medyada paylaşarak bize destek olun. Teşekkürler.

Ekran Görüntüsü:

Açıklama:

Arka plan çıkarma işlemi; video’lardan yada kameradan, hareketsiz görüntülerin temizlenerek sadece hareket eden nesnelerin yakalanmasıdır.

Bu işlemi c++ ve opencv ikilisiyle aşağıdaki kod yardımıyla yapabilirsiniz.

Programı başlatırken kameranın önünden çekilin.

Program ilk yakaladığı kareyi arka plan kabul edecektir.

Sonraki kareleri ise hareketli nesne kabul edecek.

Program arka plan ve hareketli nesne bilgilerini referans alarak bir maske oluşturacaktır.

Bu maske vasıtasıyla da ekrana sonradan çıkan bütün nesneler yakalanacaktır.

Uyarı:

arkaPlanCikarmaYontemi->apply(goruntu, arkaPlanMaskesi, false); fonksiyonundaki false ifadesini true yaparak belirli sürelerle arkaplanın güncellenmesini sağlayabilirsiniz.

Bu ne işe yarar diyecek olursanız.

Bu durum şunu ifade eder;

Ekrana sonradan çıkan bir nesne belirli bir süre sabit durursa, program onuda artık arka plan olarak algılayacak ve program maskeyi güncelleyecektir.

Artık Yeşil Perdeye Gerek Yok:)

Dikkat:

OpenCV arka plan çıkarmada eskiden BackgroundSubtractorMOG ve BackgroundSubtractorGMG gibi yöntemleride / algoritmalarıda destekliyormuş. Şuan bu algoritmalar desteklenmiyor.

Biz programımızda BackgroundSubtractorMOG2 algoritmasını kullandık.

Ayrıca createBackgroundSubtractorMOG2() ifadesinin bulunduğu yere createBackgroundSubtractorKNN() yazarak BackgroundSubtractorKNN() algoritmasını kullanabilirsiniz.

Benim tavsiyem BackgroundSubtractorMOG2 algoritmasını kullanmanız.

Bu konu çok önemli bir konu.

Kişi sayma, araba sayma gibi işlemlerde bile kullanılıyor.

Program Kodları:

#include "opencv2/core.hpp"
#include <opencv2/core/utility.hpp>
#include "opencv2/imgproc.hpp"
#include "opencv2/video/background_segm.hpp"
#include "opencv2/videoio.hpp"
#include "opencv2/highgui.hpp"
#include <stdio.h>

using namespace std;
using namespace cv;

//yöntem olarak createBackgroundSubtractorKNN() 'de seçilebilir
Ptr<BackgroundSubtractor> arkaPlanCikarmaYontemi = createBackgroundSubtractorMOG2();

Mat goruntu; //kameradan alınan görüntü
Mat arkaPlanMaskesi; //maske
Mat	arkaPlaniCikarilmisGoruntu;
Mat arkaPlanGoruntusu; //arka plan

int main()
{
	//arkaPlaniCikarilmisGoruntu yü yumuşatmak ve pürüzler kaldırmak isterseniz burayı true olarak değiştiriniz
	bool puruzleriKaldir = true; 

	VideoCapture yakala(0);

	while (waitKey(30) != 27) 	//esc'ye basılmadığı sürece döngü çalışsın
	{
		yakala >> goruntu;
		flip(goruntu, goruntu, 1); //goruntu nün yatayda simetrisi aliniyor

		if (arkaPlaniCikarilmisGoruntu.empty()) //arkaPlaniCikarilmisGoruntu eğer yoksa oluşturuldu
			arkaPlaniCikarilmisGoruntu.create(goruntu.size(), goruntu.type());

		//burası true olursa belirli bir süre sabit duran yeni görüntüler artık arkaplan olarak kabul edilecektir
		arkaPlanCikarmaYontemi->apply(goruntu, arkaPlanMaskesi, false);

		if (puruzleriKaldir)
		{
			//histogram eşitlemesi yapıldı
			equalizeHist(arkaPlanMaskesi, arkaPlanMaskesi);
			
			//resim bulanıklaştırılıyor yani
			//bir nevi yumuşatılıyor
			GaussianBlur(arkaPlanMaskesi, arkaPlanMaskesi, Size(11, 11), 3.5, 3.5);
		
			//belli eşik değerinin altındaki pikseller siyah, diğerleri beyaz yapılıyor
			threshold(arkaPlanMaskesi, arkaPlanMaskesi, 100, 255, THRESH_BINARY);

			//morfolojik acma yapiliyor
			//resimdeki beyaz gurultuler engelleniyor
			//once asindirma sonra genisletme yapiliyor
			erode(arkaPlanMaskesi, arkaPlanMaskesi, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));
			dilate(arkaPlanMaskesi, arkaPlanMaskesi, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));

			//morfolojik kapanma yapiliyor
			//beyaz olan nesnelerin arasindaki kucuk siyah holler temizleniyor
			//once genisletme sonra asindirma yapiliyor
			dilate(arkaPlanMaskesi, arkaPlanMaskesi, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));
			erode(arkaPlanMaskesi, arkaPlanMaskesi, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));
		}

		arkaPlaniCikarilmisGoruntu = Scalar::all(0);//arkaplanın tüm pikselleri 0 yani siyah ayarlandı

		//burada goruntu üzerine arkaPlanMaskesi uygulanarak arkaPlaniCikarilmisGoruntu elde edildi
		//goruntu giriş matrisi, arkaPlaniCikarilmisGoruntu çıkış matrisi, arkaPlanMaskesi maske
		goruntu.copyTo(arkaPlaniCikarilmisGoruntu, arkaPlanMaskesi); 
	
		arkaPlanCikarmaYontemi->getBackgroundImage(arkaPlanGoruntusu); //arka plan arkaPlanGoruntusu nesnesine aktarıldı
		imshow("Arka Plan Görüntüsü", arkaPlanGoruntusu); //arka plan pencerede gösteriliyor

		imshow("Kameradan Alınan Görüntü", goruntu); //kameradan alınan görüntü pencerede gösteriliyor
		imshow("Maske Görüntüsü", arkaPlanMaskesi); //arkaPlanMaskesi pencerede gösteriliyor
		imshow("Arka Planı Çıkarılmış Görüntü", arkaPlaniCikarilmisGoruntu); //arka planı çıkarılmış görüntü pencerede gösteriliyor

	}
	return 0;
}

 

Size faydalı olduysa, sosyal medyada paylaşarak bize destek olun. Teşekkürler.

(Ders 37) OpenCV ile Kameradaki Görüntüyü Yakınlaştırma (C++)
(Ders 50) OpenCV ile Resim Üzerine Transparan Resim Ekleme (C++)