19 Şubat 2009 Perşembe

OpenCV'ye Giriş - 3

OpenCV’ye Giriş - 1 ve OpenCV’ye Giriş – 2 yazılarımdan sonra OpenCV’ye giriş amaçlı yazılarımın sonuncusuna geldik. Bu yazımda OpenCV ile ilgili basit bir örnek vereceğim. Bu örnek ile hem derleyici için yaptığınız ayarların doğrululuğunu kontrol edip hem de OpenCV dünyasına ilk adımınızı atmış olacaksınız. Öncelikle size kodları vereyim, açıklamasını daha sonra yapacağım.

#include "highgui.h"

int main(int argc, char** argv){

IplImage* img = cvLoadImage(argv[1],1);

cvNamedWindow("Ornek", CV_WINDOW_AUTOSIZE);

cvShowImage("Ornek", img);

cvWaitKey(0);

cvReleaseImage(&img);

cvDestroyWindow("ornek");

}

Yukarıdaki kodlar gözünüze kısa gelmiş olabilir ama örneğimiz için yeterli bile. Programımız belirttiğimiz dizindeki bir resim dosyasını alıp bize bir Windows penceresinde bu resmi gösteriyor. Şimdi kodumuzu satır satır inceleyelim.

IplImage* img = cvLoadImage(argv[1],1);

Burada belirttiğimiz dizindeki resim alıyoruz. Dikkat ederseniz argv[1]’den sonra “1” koyduk. Bu resmimiz renkli ise bunu renkli göstermemizi sağlıyor. Eğer “0” koysaydık, resmimiz siyah beyaz olarak gözükecekti.

cvNamedWindow("Ornek", CV_WINDOW_AUTOSIZE);

Resmimizi göstermek için tabii ki bir pencereye ihtiyacımız var. Burada “Ornek” adında bir pencere oluşturuyoruz. CV_WINDOW_AUTOSIZE, pencerenin boyutunu otomatik olarak ayarlanmasını ve dışarıdan müdahale olmamasını sağlıyor. Eğer buraya 0 koysaydık pencere boyutunu manuel olarak istediğimiz boyuta ayarlayabilecektik. Tabii bu seferde resmimizin boyutu da değişecekti.

cvShowImage("Ornek", img);

Bu komut ile oluşturduğumuz “Ornek” adlı pencerede resmimizi gösteriyoruz.

cvWaitKey(0);

Fonksiyonun içine sıfır koyarak herhangi bir tuşa basılana kadar programa beklemesi gerektiğini söylüyoruz. Eğer 0 yerine bir sayı koysaydık, program o sayı kadar milisaniye olarak bekleyecek ve yine devam edecekti.

cvReleaseImage(&img);

cvDestroyWindow("ornek");

Programımızın son komutları. Bu komutlar ile hafızada yer kaplayan resmimizi ve penceremizi artık kullanmayacağımız için siliyoruz.

Komutları anlattıktan sonra programımızı nasıl çalıştıracağımızdan da kısaca bahsedeyim. Öncelik Windows komut satırını açmamız gerekli. Başlat->Çalıştır->cmd yazarak komut satırına ulaşabiliyoruz. cd komutu ile programımızı kaydettiğimiz dizine geliyoruz ya da direk dizin adresini yazarak da programımızı çalıştırabiliriz. Eğer sizde benim gibi programı ve resmi c dizinine kopyaladıysanız aşağıdaki komut ile programı başarılı bir şekilde çalıştırabilirsiniz.

c:\deneme.exe c:\resim.jpg

Bu örnek uygulamayla artık OpenCV’ye giriş yazılarını bitiyorum. Buraya kadar ki işlemlerde sorusu olan ya da biryerlerde takılan arkadaşlar varsa sorularını yorum bırakarak sorabilirler. unk

8 Şubat 2009 Pazar

Tekrardan Blog Yazılarına Devam

           Uzun süredir bloguma yazı yazamıyordum. Hem derslerin dönem sonuna doğru ödev sınav gibi şeylerle çok fazla zaman almaya başlaması hem de bitirme projem ile uğraştığım için buraya pek vakit ayıramadım. Artık mezunum ve bu kriz döneminde bir iş bulana kadar tekrardan buraya yoğunlaşmaya karar verdim. Şimdiye kadar neler yazdığıma bir baktım. Opencv ile ilgili bir yazı dizisine başlayıp onu yarım bırakmışım. İlk iş olarak onu bitirmeye karar verdim. Şu an "Opencv'ye Giriş - 3" yazısını hazırlıyorum. En yakın zamanda siteye ekleyeceğim. Ardından "mikrodenetleyici seçerken nelere dikkat etmeliyiz" başlıklı bir yazı var aklımda. Arayı çok uzatmadan herhalde onu da hazırlarım.

           Bu arada opencv için buraya gelen arkadaşlara çok güzel bir müjdem var. Opencv'nin kitabı çıktı. şimdilik türkçe çevirisi yok ve bildiğim kadarıyla Türkiye'de satılmıyor. Kitabı incelemek isteyenler için aşağıda pdf versiyonunun rapidshare linkini buradan bulabilirler. Kitabı almak isteyenlerse amazon.com dan sipariş verebilirler. unk


5 Kasım 2008 Çarşamba

Köklerin Yer Eğrisi

Bir kontrol mühendisi sistemin kararlı olup olmadığını ve kararlılık derecesini bilmek, diferansiyel denklem çözmeden analiz ile sistem performansını tahmin etmek ister. Bir sistemin açık çevriminin analizi ile elde edilecek bilgiler aynı sistemin kapalı çevrimi hakkında bilgi edinilmesini sağlar ve doğrusal kontrol sisteminin analizinde belirli bir sistem parametresine göre karakteristik denklem köklerinin değişiminin incelenmesinden bazı bilgilere ulaşılabilir. İlk kez W. R. Evans tarafından kök yer eğrilerinin temel özellikleri ve sistematik çizilişi geliştirilmiştir.

Kök yer eğrilerinin kullanımı sadece kontrol sistemleriyle sınırlı değildir. Genel kullanım alanımı değişik parametreli cebirsel denklemlerin köklerinin incelenmesi olmakla beraber bir kontrol mühendisi için kök yer eğrisi grafiği sistem parametrelerinin değişimi ile kapalı çevrim sistem köklerinin s düzlemindeki yerini gösteren grafiktir.

Kapalı çevrim sistemlerin geçici hal yanıt karakteristikleri kapalı çevrim kutularının yerlerine bağlıdır. Eğer sistem değişken kazanca sahipse kapalı çevrim sistemin kutuplarlı kazanca göre değişir. Bu yüzden sistemin kazancı değiştikçe kapalı çevrim sistemin kutuplarının nasıl hareket ettiğinin bilinmesi önemlidir. Kök yer eğrileriyle istenilen sistem cevabını elde etmek için uygun kutuplar seçilebilir ve belirlenen bu kutuplar için sistem kazancı belirlenebilir.

Pozitif Kök Yer Eğrisi Çizim Aşamaları

1. K=-∞’dan + ∞’ a giderken bir kökün yer eğrisinde izlediği yola kol denir. Bir kök yer eğrisi grafiğinde açık çevrim sistemin(G(s)H(s)) transfer fonksiyonunda yer alan kutup sayısı kadar kol vardır.

2. K=0 noktalarının açık çevrim sistemin kutuplarında yer alan kök eğrisi K=±∞’da sisteminin sıfırlarındadır.

3. Kök yer eğrileri s-düzlemi reel eksene göre simetriktir.

4. Kök yer eğrisinde K=±∞ giden kolların davranışı asimptotlar tarafından belirlenir. Kök yer eğrisi grafiğinde asimptotların sayısı açık çevrim sistemin kutup sayısı ile açık çevrim sistemin sıfır sayısının farkı kadardır. Asimptot açıları ise aşağıdaki formül ile belirlenir.

5. Asimptotların gerçek eksen üzerindeki kesişme noktası aşağıdaki formül ile hesaplanır.

Asimptotların kesişme noktası aynı zamanda kök eğrisinin ağırlık merkezidir ve bu nokta her zaman s-düzlemi üzerinin reel ekseninde yer alır.

6. Pozitif kök yer eğrisinin sağında yer alan kutup ve sıfırların sayısının toplamı daima tek sayıdır. Bu kural yardımıyla pozitif kök yer eğrilerinin yerleri belirlenebilir.

7. Reel eksen üzerinde yer alan bir noktadan karmaşık eşlenik kutup ve sıfırlarına çizilen doğruların açılarının toplamı sıfırdır. Bu kural açı koşulunu oluşturmaktadır ve aşağıdaki formül yardımıyla pozitif kök eğrisinde yer alan kutup ve sıfırların giriş çıkış açıları belirlenir.

İ=0, 1, 2,… olmak üzere


8. Routh-Hurtwiz kriteri yardımıyla kök eğrisinin s-düzleminde sanal ekseni kestiği ve bu noktanın K değeri hesaplanabilir. Eğer kök eğrisi sanal ekseni birden fazla noktada kesiyorsa bode diyagramından ya da Matlab gibi bir bilgisayar çizim programı yardımıyla bu noktalar bulunabilir.

9. Kök eğrilerinde kopma noktaları G(s)H(s) in s’e göre türevinin sıfır olduğu yerlerdir. Bu noktalar pozitif kök eğrisinin iki kolunun karşılaşma ve ayrılmasının olduğu noktalardır. Aynı zamanda bu noktalar karakteristik denklemde yer alan katlı kutuplardır. Kopma noktaları reel eksen üzerinde olabileceği gibi reel eksen dışında da yer alan kopma noktaları olabilir. Bu durumda pozitif kök eğrisinin reel eksene göre simetrik olma özelliğinden dolayı reel eksen dışındaki kopma noktaları karmaşık eşlenik sayılar olmak zorundadır.

Kök Eğrisi Üzerindeki Bir Noktanın K Kazancının Hesaplanması

Çizdiğimiz kök yer eğrisiyle yardımıyla kök yer eğrisi üzerindeki bir noktaya karşılık gelen K kazancı genlik koşulu yardımıyla hesaplanabilir. K kazancı için genlik koşulu denklemi aşağıdaki gibidir.

Açık Çevrim Sisteme İlave Edilen Kutup ve Sıfırlarının Kök Yer Eğrilerine Etkisi

Bir kontrol tasarımında açık çevrim sisteme eklenecek olan kutup ve sıfırların sisteme üzerindeki etkilerinin bilinmesi tasarımın kolaylaşması açısından önemlidir.

Açık çevrime eklenecek olan kutuplar kök eğrisini sağ yarı s-düzlemine doğru ötelerler.

Açık çevrime eklenecek olan sol yarı s-düzlemi sıfırları kök eğrisinin sol yarı s-düzlemine doğru ötelenmesine neden olur.

Ayrık Verili Sistemlerin Kök Yer Eğrileri

Şimdiye kadar anlatılanlar doğrusal sistemlerde kök yer eğrilerinin çizimi ile ilgiliydi. Aynı yöntem ayrık verili sistemlere de uygulanabilir. Yalnız dikkat edilmesi gerekilen tek nokta, ayrık zamana geçerken transfer fonksiyonun z dönüşümü alındığı için kök yer eğrilerinin s-düzlemi yerine z-düzleminde çizilecek olmasıdır.

MATLAB Yardımıyla Kök Yer Eğrisi Çizimi

Her ne kadar yukarıdaki basit kurallar ile kök yer eğrisinin çizimi yapılabilse de bazen kök yer eğrilerini doğru çizebilmek ya da el ile çizmekle uğraşmamak için bir bilgisayar programına ihtiyaç duyulabilir. Sistem analizinde kontrol tasarımcısına büyük kolaylıklar sağlayan MATLAB Control Toolbox ile kök yer eğrisinin çizimi yapılabilir. Bunun için rlocus fonksiyonu kullanılır. Kullanış biçimi;

[r,k]=rlocus(pay,payda) ya da [r,k]=rlocus(a,b,c,d)

şeklindedir. Burada r, k matrisinde tanımlı K kazançlarına karşılık gelen karmaşık kökleri içeren matristir. Aşağıda rlocus fonksiyonun kullanımına örnek olması amacıyla aşağıda küçük bir örnek verilmiştir.

>>Sistem_pay = [1 1];

>>Sistem_payda = [1 1 2];

>>Sistem_transfer_fonksiyonu = tf(Sistem_pay,Sistem_payda);

>>rlocus(Sistem_transfer_fonksiyonu)

Umarım yazım bu konu hakkında bilgi edinmek arkadaşlar için faydalı olmuştur. Yazım hakkındaki yorumlarınızı ve eklemek istediklerinizi yorum bırakarak iletebilirsiniz. unk

22 Ekim 2008 Çarşamba

Ölü zamanlı sistemlere değişik mühendislik alanlarında sıklıkla karşılaşılmaktadır. İletişim ağları ve kimyasal süreçlerin yer aldığı sistemlerde geri beslemelerde yer alan zaman gecikmeleri ölü zamanlara örnek olarak verilebilir. Kimyasal sistemlerdeki zaman gecikmeleri genellikle bir tüple ya da başka bir taşıyıcı ile taşınan malzemenin yer değiştirmesi sırasında oluşan gecikmelerdir. Uzay araçlarında yüksekliklerin belirlenmesinde ışık hızının sınırlı olmasından dolayı ölçüm bilgisinin Dünya’ya geç ulaşması ölü zaman oluşmasına neden olmaktadır. Dijital kontrol sistemlerde de bilgisayarın cycle zamanına bağlı olarak ve bilginin ayrık olarak işlenmesinden dolayı ölü zamanlar oluşmaktadır. Sistemlerdeki bu ölü zamanlar (özellikler büyük gecikmeler), sistemlerin verimliğinin ve kararlılığının daha az olmasına sebep olur. Aynı zamanda ölü zamanlar bir kontrolcü için sistemlerin analizini ve sistemlere uygun bir kontrolün tasarlanmasını zorlaştırır.

Sistemlerde yer alan ölü zamanlar

G(s) = e-sT

biçiminde ifade edilir. Fakat bir polinom yerine üstel bir fonksiyon olarak tanımlanan ölü zaman bu haliyle kök yer eğrisinde çizilemediği için analizinin yapılması da zor olmaktadır. Bunun için iki yöntem önerilmiştir. Bunlardan biri “yaklaştırma”, diğeri ise “açı koşulunun direk uygulanması”dır.

“Yaklaştırma” yönteminde rasyonel olmayan üstel fonksiyon rasyonel bir fonksiyon olarak ifade edilmeye çalışılacaktır. Bir kontrolcü genellikle düşük frekanslı sistemlerle ilgilendiği için küçük s değerleri için yapılacak yaklaşımlar (genelikle s=0 dolaylarında) yeterli olacaktır. Rasyonel olmayan üssel denklemlerin rasyonel denklemlere dönüştürülmesinde en sık kullanılan yöntem Henri Pade tarafından geliştirilen Pade yaklaşımıdır. Bu yaklaşımda üssel ifade biçiminde ifade edilen ölü zaman, payının derecesi p ve paydasının derecesi q olan rasyonel bir ifadeye dönüştürülür. p ve q değerlerinin 1 olarak alındığı bir Pade yaklaşımında

olarak bulunur. Eğer p ve q değerlerimizi 2 olarak alacak olursa rasyonel ifademiz

şeklinde olacaktır. Tabii ki 2. yaklaşımımız 1. yaklaşımımıza göre daha fazla değer içerdiği için daha doğru bir sonuç verecektir. Bununla beraber genellik ölü zamanın küçük olduğu sistemlerde p=0 ve q=1 olarak alındığı yaklaşımlar sistemdeki ölü zamanın rasyonel ifadeye çevrilmesi için yeterli hassasiyette olacaktır. Böyle bir yaklaşım

biçiminde ifade edilir.

Açı koşulunun direk uygulanması yönteminde ise gecikmeli sistemin kök yer eğrisi çizilebilir. Transfer fonksiyonunu

olarak ifade ettiğimiz sistemde G(s) sisteminin fazı ’nin fazıyla λw toplamına eşittir. Burada s=λ +jw olarak alınmıştır. ’nin fazını 180o + λw +360o(l-1) formülü ile hesaplayarak ölü zamanlı sistemin kök yer eğrisini çizebiliriz. Bunun için öncelikle frekansı(w) sabitleriz ve s düzleminde bir yatay çizgi boyunca noktayı bulana kadar devam ederiz. Daha sonra frekans değeri arttırılıp, açı değiştirilerek aynı işlemler tekrarlanır. Aynı şekilde kopma açıları da hesaplanarak gerekli değerler bulunmuş olur. Kök yer eğrisinin çiziminin ardından kök yer eğrisi incelenerek gerekli kontrolör tasarımı yapılabilir.

Ne yazık ki, MATLAB ölü zamanlı sistemlerin kök yer eğrisini ve birim basamak cevabını direk olarak çizememektedir. Gerekli çizimler için öncelikle Pade yaklaşımıyla üssel fonksiyon ile ifade edilen zaman gecikmesi rasyonel hale dönüştürülmelidir. Pade yaklaşımında gerekli değerleri bulmak için MATLAB Control toolbox içerisinde yer alan pade(T,p) komutunu kullanabiliriz. Burada T, saniye cinsinden ölü zaman olup, p ise kaçıncı dereceden yaklaşım yapacağımızı belirten ifadedir. Komutu MATLAB’ta

[num,den]=pade(T,p)

olarak çalıştırmamız çıkış değerlerini almamızda kolaylık sağlayacaktır.

Umarım yazım bu konu hakkında bilgi edinmek arkadaşlar için faydalı olur. Yazım hakkındaki yorumlarınızı ve eklemek istediklerinizi yorum bırakarak iletebilirsiniz. unk

9 Eylül 2008 Salı

OpenCV'ye Giriş - 2

Önceki yazımda OpenCV’nin ne olduğundan ve OpenCV ile neler yapabileceğimizden kısaca bahsetmiştim. Bu yazımda ise Windows ortamında bilgisayarımıza OpenCV kütüphanesini nasıl yükleyeceğimizi ve OpenCV’yi Dev C++’a entegre etmeyi anlatacağım.

Öncelikle eğer hala indirmediyseniz OpenCV kütüphanesini buradan indirebilirsiniz. İndirdiğiniz bu dosyaya çift tıkladığınızda karşınıza bir yükleme ekranı çıkacaktır. Karşınıza çıkan adımları takip ederek OpenCV’yi bilgisayarınıza yükleyiniz.

OpenCV’yi başarılı bir şekilde bilgisayarınıza yüklemeniz onu hemen kullanabilmeniz için yeterli olmuyor. Aynı zamanda kullandığınız derleyicide de bir takım ayarlar yapmanız gerekli. Eğer Visual C++ kullanıyorsanız gerekli ayarlar için buraya ya da buraya bakabilirsiniz. Eğer Dev C++ kullanıyorsanız ya da kullanmayı düşünüyorsanız yazımı okumaya devam edebilirsiniz.

Öncelikle belirtmek isterim ki OpenCV için vereceğim Dev C++ ayarları OpenCV’nin C:\Program Files\OpenCV dizininde yüklü olduğunu düşünülerek verilmiştir. Eğer OpenCV’yi farklı bir klasöre yüklediyseniz derleyici ayarlarınızı buna göre yapınız. Dev C++’da yazdığımız OpenCV programlarını sorunsuz bir şekilde derleyebilmemiz için gerekli tüm header ve dll dosyalarının yerlerinin nerde olduğunu derleyiciye göstermemiz gerekli. Bunun için ilk olarak “Araçlar” menüsünden “Derleyici Ayarları”nı açıyoruz.

Burada ilk iş olarak eski ayarlarımızı kaybetmemek için “artı işaretine” tıklayarak yeni bir isim ile yeni bir derleyici takımı oluşturuyoruz. Bir problem oluşursa buradan eski ayarlarınıza geri dönebilirsiniz.

“Bağlayıcı (Linker) komutuna bunları ekle” yazan yerin yanındaki kutucuğu işaretleyerek altına şunları ekliyoruz : -lhighgui -lcv -lcxcore -lcvaux –lcvcam

Şimdi “Dizinler” sekmesine geçip header ve dll dosyalarını ekleyebiliriz. “Kütüphaneler” bölümüne sadece C:\Program Files\OpenCV\lib dizinini ekleyiniz.

“C Includeları” bölümüne aşağıdaki tüm dizinleri ekleyiniz.
C:\Program Files\OpenCV\cxcore\include
C:\Program Files\OpenCV\cv\include
C:\Program Files\OpenCV\otherlibs\highgui
C:\Program Files\OpenCV\cvaux\include
C:\Program Files\OpenCV\otherlibs\cvcam\include

Eğer programlarınızı yazarken C++ kullanmayı düşünüyorsanız aynız dizinler “C++ Includeları” bölümüne de ekleyiniz.

Son olarak da dll dosyalarını ekledik mi tamamdır. “Binaryler” sekmesine C:\Program Files\OpenCV\bin dizinini ekleyip ve ardından “Tamam” deyip “Derleyici Ayarları” penceresini kapatabiliriz.

Şimdi sıra yaptığımız ayarların doğruluğundan emin olmak için örnek bir programı Dev C++’da derlemeye geldi. OpenCV’nin yer aldığı dizindeki Samples klasöründe OpenCV uygulamaları ile ilgili çeşitli örnek programlar ve kodları var. Bunlardan birini Dev C++ ile açıp derlemeye çalışarak yaptığımız ayarların çalışıp çalışmadığını test edebilirsiniz.

“OpenCV’ye Giriş” yazı dizisinin son yazısında OpenCV ile programlamanın temellerini oluşturacak bir iki örnek programı açıklamalı olarak vermeyi düşünüyorum. Arayı çok uzatmadan en kısa zamanda yazıyı hazırlayıp buraya koyacağım. Hoşçakalın. unk