Hoşgeldin Misafir

OpenCV ile Nokta Takibi (C++)

SurHan

28 Kas 2017
4,186 Mesaj

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
nokta-takibi-opticflow.jpg



-Program Açıklaması:--
Arkadaşlar yukarıdaki görseli dikkat çekmek için kullandık.-
Aşağıdaki kod bu konuya giriş mahiyetinde bir kod.-
Daha sonra bu konuda gelişmiş bir örnek paylaşacağız.-
Bu kodda koordinatı verilen herhangi bir nokta (piksel) calcOpticalFlowPyrLK foksiyonuyla takip ediliyor ve yeni nokta işaretleniyor.-

Tabiki örneğimiz resim ile değil:) webcam ile çalışıyor.-
(çünkü resim hareketsiz :) webcam’deki görüntü hareketli:))-
Yani webcam’de işaretlenen bir noktayı takip ediyor.-
Bu sayede koordinatları bilinen (yeri bulunan) bir cisim yer değiştirsede program onu takip etmeye devam ediyor.-


PROGRAM KODLARI

Kod:
#include <opencv2\opencv.hpp>
#include "iostream"
 
using namespace std;
using namespace cv;
 
//takip edilecek pikselin koordinatları
int x = 320;
int y = 240;
 
int main()
{
	//0. kamera yani dahili kamera seçildi
	VideoCapture kamera(0);
 
	//eğer kamera açılmazsa
	if (!kamera.isOpened())
	{
		cout << "webcam bulunamadi" << endl;
		system("Pause");
		return -1;
	}
 
	Mat yeni, eski;
	Mat goruntu; //kameranın anlık görüntüsü bu değişkene atanacak
	
	vector<Point2f> oncekiNokta, sonrakiNokta; //önceki ve sonraki noktalar
	vector<uchar> durum; //nokta var mı yok mu
	vector<float> hata; //hesaplama hatası
	
	oncekiNokta.push_back(Point(x, y)); //önceki noktanın yeri
	
	kamera >> goruntu; //görüntü kameradan frame frame alınıyor
	cvtColor(goruntu, yeni, CV_BGR2GRAY); //kameradan alınan görüntü gri formata dönüştürüldü
 
	while (true)
	{
		eski = yeni.clone(); //aynı özelliklere sahip resim kopyalandı 
		kamera >> goruntu; //görüntü kameradan frame frame alınıyor
		cvtColor(goruntu, yeni, CV_BGR2GRAY); //kameradan alınan görüntü gri formata dönüştürüldü
		calcOpticalFlowPyrLK(eski, yeni, oncekiNokta, sonrakiNokta, durum, hata); //eski resimdeki noktayı yeni resimde arar
		
		//takip edilen nokta yerine beyaz piksel koyuyor
		line(goruntu, sonrakiNokta[0], sonrakiNokta[0], Scalar(0, 0, 255), 3, 8, 0);
		imshow("Nokta Takibi", goruntu);
		oncekiNokta[0] = sonrakiNokta[0]; //sonraki bulunan noktayı önceki nokta yapar.
 
		if (durum[0] == 1)
		{
			cout << "nokta bulundu" << endl;
		}
		else
			cout << "nokta kayboldu" << endl;
 
		if (waitKey(30) == 27)
		{
			break;
		}
	}
	return 0;
}