(Ders 38) OpenCV ile Kameradaki Görüntüyü Sınırsız Yakınlaştırma (C++)

(Ders 26) OpenCV ile Fareyle Çizgi Çizme (C++)
(Ders 37) OpenCV ile Kameradaki Görüntüyü Yakınlaştırma (C++)

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

Ekran Görüntüsü:

Program Açıklaması:

Kamera’dan aldığımız görüntüyü bazen istediğimiz katsayıda yakınlaştırmak isteriz. Bu projede seçilen bölge ilk önce sekiz kat yakınlaşıyor. Daha sonra yeni oluşan pencereden bölge seçince tekrar sekiz kez daha yakınlaşmış oluyor. Bu şekilde video görüntüsündeki ilgili kare 64 kez yakınlaşıyor.

Bu ne işe yarar diyecek olursanız nokta takibinde çok işinize yarayacak profesyonel bir proje bence. Nokta takibi şu şekilde yapılıyor. Herhangi bir piksel işaretliyoruz ve program o pikselin komşularına göre görüntü takibi yapıyor.

Yakınlaştırma katsayısını program içerisinde değiştirebilirsiniz.

Uyarı:

Farenin sağ tuşuna basınca kamera duraklatılıyor istenen piksel daha iyi yakalanıyor.

Tekrar sağ tuşa basınca kamera tekrar çalışyor.

Program Kodları:

#include "opencv2/highgui/highgui.hpp"
#include "iostream" //cout için gerekli
#include   //rectangle nesnesi için

using namespace std;
using namespace cv;

Mat kameraGoruntusu; //kameradan alınan anlık görüntü
Mat zoom1Goruntu;
Mat zoom2Goruntu;

Point anaPencerePikselKoordinat = 0; //Ana Pencereden tıklanan pikselin koordinatı
Point zoom1PikselKoordinat;

Point noktaEk = 0; //"Zoom 1" deki piksellere tıklayınca ana penceredeki koordinatları değiştirmede kullanılıyor

bool goruntuHareketli = true; //goruntunun hareketli olması istendiğinde true olmalı, goruntunun duraklatılması için false olmalı

							  //görüntünün yakınlaştırma ayarını bu iki değişken belirliyor
int kareGenisligininYarisi = 25; //Ana Pencere ye çizilen karenin bir kenar uzunluğunun yarısı
int goruntuBuyutmeKatSayisi = 8; //görüntüyü kaçar kere yakınlaştırmak istediğimizi buraya yazıyoruz

void zoom1FareTakip(int event, int x, int y, int flags, void *kullanici)
{
	//farenin sol tuşuna basınca
	if (event == EVENT_LBUTTONDOWN)
	{
		//resmin kenarlarına yakın yerler seçilince
		//çizilecek dikdörtgen pencerenin dışına çıkacağından program hata verir.
		//bu durumu aşağıdaki koşul ifadesiyle engelledik
		if (x > kareGenisligininYarisi && x < zoom1Goruntu.cols - kareGenisligininYarisi && y >kareGenisligininYarisi && y < zoom1Goruntu.rows - kareGenisligininYarisi)
		{
			zoom1PikselKoordinat.x = x;
			zoom1PikselKoordinat.y = y;

			//noktaEk değişkeninin değerleri güncellenerek Ana Pencere deki dikdörtgenin yeri değişiyor
			noktaEk.x = x / goruntuBuyutmeKatSayisi - kareGenisligininYarisi;
			noktaEk.y = y / goruntuBuyutmeKatSayisi - kareGenisligininYarisi;
		}
	}
}

void anaPencereFareTakip(int event, int x, int y, int flags, void *kullanici)
{
	//farenin sol tuşuna basınca
	if (event == EVENT_LBUTTONDOWN)
	{
		//bu koşul ifadesinde resmin kenarlarını seçince programın kilitlenmesi engellendi
		if (x > kareGenisligininYarisi && x < kameraGoruntusu.cols - kareGenisligininYarisi && y >kareGenisligininYarisi && y < kameraGoruntusu.rows - kareGenisligininYarisi)
		{
			//bu noktalara göre zoom yapılacak
			anaPencerePikselKoordinat.x = x;
			anaPencerePikselKoordinat.y = y;

			//Zoom 1 penceresindeki hassas koordinatlar sıfırlandı
			noktaEk.x = 0;
			noktaEk.y = 0;
		}
	}

	//sağ tuşa basınca
	//görüntüyü duraklat veya canlı görüntüyü başlat
	if (event == EVENT_RBUTTONDOWN)
	{
		if (goruntuHareketli == true)
			goruntuHareketli = false;
		else
		{
			goruntuHareketli = true;
		}
	}
}

int main()
{
	VideoCapture video(0); //Dahili webcam icin 0 yaziniz. Harici webcamlar icin 1,2,3 gibi sayilar yaziniz
	if (!video.isOpened()) //Eger webcam acilamazsa
	{
		cout << "Webcam acilamadi" << endl;
	}

	namedWindow("Ana Pencere", CV_WINDOW_AUTOSIZE);
	namedWindow("Zoom 1", CV_WINDOW_AUTOSIZE);
	namedWindow("Zoom 2", CV_WINDOW_AUTOSIZE);

	Mat anaDikdortgen;

	while (true) //sonsuz dongu
	{
		if (goruntuHareketli == true) {
			video.read(kameraGoruntusu); //Kamera görüntüsünü kameraGoruntusu'ye frame frame okuyor		
			flip(kameraGoruntusu, kameraGoruntusu, 1); //kameraGoruntusu'nün yatayda simetrisi aliniyor
		}

		//sıfır matri oluşturuldu bu sayede oluşan dikdörtgen
		//kameraGoruntusu'nü etkilemiyor
		anaDikdortgen = Mat::zeros(kameraGoruntusu.size(), CV_8UC3);

		//Kamera açılır açılmaz Ana Pencere'de, sol üstte nokta şeklinde dikdörtgen beliriyordu
		//bu koşul ifadesiyle dikdörtgeni engelledik
		if (!(anaPencerePikselKoordinat.x == 0 && anaPencerePikselKoordinat.y == 0))
		{
			int x = anaPencerePikselKoordinat.x - kareGenisligininYarisi; //x eksenindeki başlangıç konumu
			int y = anaPencerePikselKoordinat.y - kareGenisligininYarisi; //y eksenindeki başlangıç konumu

																		  //Ana Pencere'de seçilen bölgenin etrafına dikdörtgen çiziliyor
			rectangle(anaDikdortgen, Point(anaPencerePikselKoordinat.x + noktaEk.x - kareGenisligininYarisi, anaPencerePikselKoordinat.y + noktaEk.y - kareGenisligininYarisi), Point(anaPencerePikselKoordinat.x + noktaEk.x + kareGenisligininYarisi, anaPencerePikselKoordinat.y + noktaEk.y + kareGenisligininYarisi), Scalar(255, 191, 0), 4, 8, 0);

			//Ana Pencerede'ki görüntüyü yakınlaştırmak için sanal dikdörtgen çizildi
			cv::Rect sanalDikdortgen0; //Ana Pencerede olduğu için 0 kullanılarak isimlendirildi
			sanalDikdortgen0.x = x; //Ana Pencere'den kesilen resmin x eksenindeki başlangıç konumu
			sanalDikdortgen0.y = y; //Ana Pencere'den kesilen resmin y eksenindeki başlangıç konumu
			sanalDikdortgen0.width = kareGenisligininYarisi * 2; //Ana Pencere'den kesilen resmin genişliği
			sanalDikdortgen0.height = kareGenisligininYarisi * 2; //Ana Pencere'den kesilen resmin yüksekliği				

			zoom1Goruntu = kameraGoruntusu(sanalDikdortgen0); //Ana Pencere'de oluşturulan dikdörtgene göre "Zoom 1" penceresi için resim kesiliyor

															  //önce resim büyütüldü sonra pencere gösterildi
			resize(zoom1Goruntu, zoom1Goruntu, Size(), goruntuBuyutmeKatSayisi, goruntuBuyutmeKatSayisi, INTER_LINEAR);//zoom1Goruntu sü büyütülüyor

																													   //"Zoom 1" penceresi ilk açıldığında, gereksiz sol üstte nokta şeklinde bir dikdörtgen çiziliyordu
																													   //bu koşul ifadesiyle bu dikdörtgenin çizilmesini engelledik
			if (zoom1PikselKoordinat.x != 0 && zoom1PikselKoordinat.y != 0)
			{
				rectangle(zoom1Goruntu, Point(zoom1PikselKoordinat.x - kareGenisligininYarisi, zoom1PikselKoordinat.y - kareGenisligininYarisi), Point(zoom1PikselKoordinat.x + kareGenisligininYarisi, zoom1PikselKoordinat.y + kareGenisligininYarisi), Scalar(0, 255, 0), 4, 8, 0);
			}

			imshow("Zoom 1", zoom1Goruntu);//Zoom 1 penceresi gösteriliyor

										   //başlangıçta 0,0 koordinatına yeşil dikdörtgeni çizme
			if (zoom1PikselKoordinat.x != 0 && zoom1PikselKoordinat.y != 0)
			{
				//Zoom 1 Penceresindeki görüntüyü yakınlaştırmak için sanal dikdörtgen çizildi
				cv::Rect sanalDikdortgen1; //Zoom 1 Penceresinde olduğu için 1 kullanılarak isimlendirildi
				sanalDikdortgen1.x = zoom1PikselKoordinat.x - kareGenisligininYarisi; //kesilen resmin x eksenindeki başlangıç konumu
				sanalDikdortgen1.y = zoom1PikselKoordinat.y - kareGenisligininYarisi; //kesilen resmin y eksenindeki başlangıç konumu
				sanalDikdortgen1.width = kareGenisligininYarisi * 2; //kesilen resmin genişliği
				sanalDikdortgen1.height = kareGenisligininYarisi * 2; //kesilen resmin yüksekliği

				zoom2Goruntu = zoom1Goruntu(sanalDikdortgen1); //Zoom 1 Penceresinde oluşturulan dikdörtgene göre "Zoom 2" penceresi için resim kesiliyor
				resize(zoom2Goruntu, zoom2Goruntu, Size(), goruntuBuyutmeKatSayisi, goruntuBuyutmeKatSayisi, INTER_LINEAR);//zoom2Goruntu sü büyütülüyor

				imshow("Zoom 2", zoom2Goruntu);
			}
		}

		//kameraGoruntusu + anaDikdortgen ifadesine dikkat ediniz, çizilen kare asıl resmi etkilemiyor
		imshow("Ana Pencere", kameraGoruntusu + anaDikdortgen);

		setMouseCallback("Ana Pencere", anaPencereFareTakip, NULL); //Ana Penceredeki fare hareketleri takip ediliyor
		setMouseCallback("Zoom 1", zoom1FareTakip, NULL); //Zoom 1 Penceresindeki fare hareketleri takip ediliyor

														  //esc'ye basılırsa programdan çıkılıyor
		if (waitKey(30) == 27) //27 ascii tus karsiligi ESC tusudur. 
		{
			break;
		}
	}
	return 0;
}

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

(Ders 26) OpenCV ile Fareyle Çizgi Çizme (C++)
(Ders 37) OpenCV ile Kameradaki Görüntüyü Yakınlaştırma (C++)