Opencv C++ Ders 29 (Nokta Takibi)

talhakoc 23 Mayıs 2015OpenCv

Haar Cascade sınıflandırıcısı  çok başarılı bir yöntem olsa da sistemi büyük oranda yavaşlatmaktadır. Bununla beraber diğer sınıflandırıcılar da genel olarak sistemi yormaktadır. İşte bu adımda istenilen nesne bulunduktan sonra takip işlemini çok büyük oranda hızlandıracak ve bilgisayardaki yükü kaldırabilecek bir uygulama mevcuttur. Bu uygulama opencv de optical flow olarak bilinmektedir. Algoritma, Bir resimdeki bir pikselin diğer resimdeki konumunu aramaktadır. Bunun için iki resmi karşılaştırmaktadır.

Şu an optik mouse diye isimlendirilen ve çok kullanılan mouse’lar bu yönteme göre çalışmaktadır. Mouse un altında gördüğümüz masaya yansıyan ışık aslında çok hızlı çekim yapan bir kameradır. En ufak harekette bir önceki resimle herhangi bir noktayı kontrol ederek ona göre sonuç üretmektedir. Nokta için bir vektör oluşturmakta, o vektöre göre imleci hareket ettirmektedir.

Nokta takibi için örnek kod opencv nin dizininde mevcuttur. Ancak o uygulama sadece köşe ve kenarları işaretlemeye müsade etmektedir. İstenilen herhangi bir nokta seçilerek nokta takibi yapmak pek mümkün olmamaktadır. Bu derste uygulama basitleştirilerek nokta takibinin anlaşılması ve uygulanabilmesi için gerekli kodlamanın öğrenilmesi hedeflenmiştir.

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

using namespace std;
using namespace cv;

int _tmain(int argc, _TCHAR* argv[])
{
VideoCapture vid(0);
if (!vid.isOpened())
{
cout<<“webcam yuk”<<endl;
system(“Pause”);
return -1;
}

Mat yeni,eski,frame;
vector<Point2f> enokta,ynokta; //eski ve yeni noktalar
vector<uchar> durum; //nokta var mı yok mu
vector<float> hata; //hesaplama hatası
enokta.push_back(Point(320,240)); //ilk noktanın yeri
vid>>frame;
cvtColor(frame,yeni,CV_BGR2GRAY);

while (true)
{
eski=yeni.clone(); //hata vermesin diye clone kullanıldı.
vid>>frame;
cvtColor(frame,yeni,CV_BGR2GRAY);
calcOpticalFlowPyrLK(eski,yeni,enokta,ynokta,durum,hata); //eski resimdeki noktayı yeni resimde arar
line(frame,ynokta[0],ynokta[0],Scalar(255,255,255),3,8,0);
imshow(“deneme”,frame);
enokta[0]=ynokta[0]; //yeni bulunan noktayı eski yapar.

if (durum[0]==1)
{
cout<<“nokta var”<<endl;
}
else
cout<<“nokta yok”<<endl;

if (waitKey(30)==27)
{
break;
}
}
return 0;
}

Amaç iki resmi karşılaştırmak ve ilk resimde belirlenen noktanın ikinci resimdeki nokta karşılığını bulmaktır.

Mat yeni,eski,frame;
vector<Point2f> enokta,ynokta; //eski ve yeni noktalar
vector<uchar> durum; //nokta var mı yok mu
vector<float> hata; //hesaplama hatası
enokta.push_back(Point(320,240)); //ilk noktanın yeri

karşılaştırmak üzere eski ye yeni resim dosyaları tanımlanmıştır. İlk resimde hangi noktaların bulunacağı ve ikinci resimde hangi noktaları göstereceği ise “x” ve “y” koordinant değerlerini tutacağı için Point2f vektörü olarak tanımlanmıştır. Bu noktaların karşılığı ikinci resimde olmayabilir. Bu durumda durum değişkeni “0” değerini alacaktır. Eğer varsa ise “1” değerini alacaktır. hata ise hata oranını verecektir. enokta ile başlayan kod ise istenilen nokta değerini ayarlamaktadır. Bu bulunan bir nesnenin noktası ile değiştirilebilir.

cvtColor(frame,yeni,CV_BGR2GRAY);
calcOpticalFlowPyrLK(eski,yeni,enokta,ynokta,durum,hata); //eski resimdeki noktayı yeni resimde arar
line(frame,ynokta[0],ynokta[0],Scalar(255,255,255),3,8,0);

nokta takibi opencv deki fonksiyon için gri tonlamalı resimde çalışmaktadır. Onun için videodan alınan resim gri tonlamalı resme çevrilmiştir. calcOpticalFlowPyrLK fonksiyonu da eski resimdeki noktanın yeni resimde hangi noktada olduğunu hesaplamaktadır. Birinci parametre ilk noktanın bulunduğu resmi, ikinci parametre noktanın aranacağı resmi gösterir. Üçüncü parametre ise yukarıda belirtildiği gibi ilk resimde bulunan noktanın yerini göstermektedir. Dördüncü parametredeki değişkene yeni resimdeki hesaplanan noktanın koordinatları yazılacaktır. Beşinci parametre o noktanın ikinci resimde bulunup bulunmadığını ve altınca parametre hata oranını verecektir.

Eğer gerçek zamanda çalışılıyorsa yeni resim eski resme, yeni nokta eski noktaya eşitlenerek bir sonraki frame webcam’dan alınacaktır.

Bir sonraki ders: Opencv C++ Ders 30(Piksel İşlemleri)

2 thoughts on “Opencv C++ Ders 29 (Nokta Takibi)

  1. Hocam burada takip ettiğimiz noktanın boyutunu nasıl büyütebiliriz acaba ? Yardımcı olursanız sevinirim.

    1. Bu allgoritmanın mantığı çevresindeki noktalara göre bir noktanın takibi. Onun için farklı algoritmalar araştırıp kendi algoritmalarını geliştirebilirsin.

Bir cevap yazın

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Arama

Twitterda

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