Professional Documents
Culture Documents
Programmer's Guide
Programmer's Guide
Pylon Programcı El Kitabı,Basler pylon .NET API kullanarak nasıl programlama yapılacağına
ilişkin bir kılavuzdur.Başlamak için bu kılavuzu pylon kod örnekleri ile kullanabilirsiniz.Ek olarak
API referansı Basler pylon .NET arayüzü hakkında belge sağlar.
1.Bir Visual Studio Projesi Oluşturma
Başlamadan önce Visual Studio 2010 veya sonraki sürümlerinin C# veya Visual Basic geliştirme
desteğinin yüklü olduğundan emin olun.Basler pylon’u kullanmak için herhangi bir .NET dili
için yeni bir proje oluşturun.Projenin .NET Framework 4.0 veya sonraki bir sürümü
hedeflemesi gerekiyor.Bundan sonra Basler.Pylon montajına bir montaj referansı
eklemelisiniz.Bunu yapmak için seçilen .NET dili için standar Visual Studio iletişim kutusunu
kullanın.
2.Bilmeniz Gereken .NET Dili Özellikleri
Pylon.NET API’yi kullanmada zorluk yaşamamak için aşağıda açıklanan .NET dil özelliklerini
bilmelisiniz.
2.1 System.IDisposable Arabirimi
Çoğu pylon nesnesi yönetilmeyen sistem kaynaklarını içerdiği için atılması gereken nesnelerle
nasıl başa çıkılacağını bilmek önemlidir.Pylon nesnelerinin çöp toplayıcı tarafından otomatik
olarak temizlenmesi gerekmiyor.Bu nedenle pylon nesneleri System.IDisposable arabirimini
uygular.IDisposable uygulanan bir nesnenin örneğinin Dispose() işlevini çağırarak veya “using”
deyimini kullanarak uygun şekilde imha edilmesi gerekir.Alternatif olarak “try-finally” ifadesi
kullanabilirsiniz.Bu durumda Dispose() çağrısı “finally” blokta bulunmalıdır.
// Create a camera object that selects the first camera device found.
// More constructors are available for selecting a specific camera device.
using (Camera camera = new Camera())
{
// Open the connection to the camera device.
camera.Open();
// Close the connection to the camera device.
camera.Close();
}
IDisposable arayüzü karşılık gelen tamponlarını kontrol etmek için grab sonuçlarıyla da
gerçekleştirilir.pylon görüntüleri grablamak için sabir miktarda tampon içeren(varsayılan:10)
bir tampon havuzu kullanır.Bu gereklidir,çünkü tamponun hafıza sayfalarını kilitlemek gibi
hazırlıklar görüntüleri bir tamponun içine alabilmek için sürücü tarafından yapılmalıdır.Bu
nedenle bir tampon havuzu kullanmak yakalanan her görüntü için yeni bir tampon ayırmaktan
çok daha etkilidir.Dispose() işlevini çağırarak başka bir görüntüyü yakalamak için arabellğin
yeniden kullanılabileceğini işaret edersiniz.Bu,çöp toplayıcı tarafından tam olarak ele alınamaz
çünkü çöp toplama işlemlerinin ne zaman gerçekleştirileceği tahmin edilemez.
// Yakalamaya başla
camera.StreamGrabber.Start();
// Yakalamayı durdur
camera.StreamGrabber.Stop();
2.2 Events
pylon nesneleri, örneğin CameraOpened, ImageGrabbed veya ParameterChanged gibi ilginç
bir şey olduğunda bildirimde bulunmak için .NET olay dili özelliğini kullanır. Bu olaylara nasıl
abone olunacağını, tüketileceğini ve abonelikten çıkacağınızı bilmeniz gerekir. Ancak, olayları
bilmeden temel parametreleştirme ve yakalamayı kullanabilirsiniz.
DİKKAT
Bir olay işleyicide ortaya çıkan istisnalara açıkça özen gösterin. Aksi takdirde,ortaya çıkan bir
istisna, görüntü yakalamayı durdurmak gibi istenmeyen etkilere neden olabilir. Olay kaynağı
tarafından belirtilen istisnaların nasıl işlendiğiyle ilgili olarak, belirli olay kaynağının
belgelerine bakın, örneğin, CameraOpened.
3. Camera Class
API,tüm kamera cihaz tipleri için tek bir Camera sınıfı sağlar.Camera sınıfının bir örneği tek bir
fiziksel kamera cihazını temsil eder.Aşırı yüklenmiş talimatlar belirli bir kamera cihazını örneğin
bilinen bir IP Adresine veya Cihaz Kullanıcı Kimliğine sahip bir kamerayı seçmek için
kullanılabilir.Gerekirse,bağlı tüm kamera cihazları hakkında bilgi almak için CameraFinder
uygulamasını kullanabilirsiniz.
Kamera cihaz parametrelerine erişmek veya görüntüleri yakalayabilmeniz için ilgili sürücüleri
başlatmanız ve fiziksel kamera cihazıyla bağlantı kurmanız gerekir.Bunu yapmak için Open()
işlevini çağırın.Kamera cihazıyla bağlantıyı kapatmak için Close() ı kullanın.
Kamera sınıfının bir örneği yönetilmeyen sistem kaynaklarını tahsis eder.Bu nedenle sınıf
IDisposable arabirimi uygular.Örneğin,Dispose() işlevini çağırarak veya “using” deyimini
kullanarak uygun şekilde imha edilmesi gerekir.
// Bulunan ilk kamera cihazını seçen bir kamera nesnesi oluştur.
// Belirli bir kamera cihazını seçmek için daha fazla talimat mevcuttur.
using (Camera camera = new Camera())
{
// Kamera cihazıyla bağlantıyı açın.
camera.Open();
// Kamera cihazıyla bağlantıyı kapatın.
camera.Close();
}
4. Parameter Access
Kamera yapılandırması ve diğer parametrelere erişmek için pylon API,GenlCam standardı
tarafından tanımlanan teknolojileri kullanır.Standar,ayrıca kamera açıklama dosyaları için bir
format tanımlar.Bu dosyalar GenlCam uyumlu kameraların yapılandırma arayüzünü
tanımlar.Açıklama dosyaları XML olarak yazılmıştır ve kamera kayıtlatını,bağımlılıklarını ve üst
düzey özelliklere erişmek için gereken diğer tüm bilgileri açıklar.Bu Kazanç(Gain),Pozlama
Süresi(Exposure Time) veya Piksel Formatı(Pixel Format) gibi özellikleri içerir.Özelliklere düşük
seviyeli kayıt okuma ve yazma işlemleri yoluyla erişilir.
4.1 Parameter Collections
Tüm parametrelere erişmek için Camera sınıfı veya diğer pylon nesneleri teknir
IParameterCollection sağlar.Parametre koleksiyonu yol(path),ad(name) ve tür(type) ile
tanımlanmış bir dizi parametreyi temsil eder.
Pylon API’sı önceden tanımlanmış parametre isimlerini listeler.Bu parametre listeleri bir
programlama dilinin numaralandırmasına benzer bir dizi parametre adı içerir.Tüm parametre
liste sınıf tanımlayıcıları “PL” ön ekiyle başlarçBu,API belgelerinde veya Visual Studio
editöründe IntelliSense kullanırken gerekli parametre listesini bulmayı kolaylaştırır.
PLCamera parametre listesi,tüm kamera cihaz tiplerinin mevcut tüm parametrelerinin birliğini
temsil eder.Yalnızca bir kamera cihaz tipi kullanıyorsanız cihaza özel bir parametre listesi
kullanabilirsiniz.Örneğin yalnızca GigE kamera kullanıyorsanız PLGigECamera parametre
listesini kullanabilirsiniz.Camera sınıfının bir örneğinin parametrelerine erişmek için
PLCameraInstance parametre listesini kullanabilirsiniz.
Parametre Kamera kodu örneğinde aşağıdaki kod örneği bulunabilir:
/*************************************************************************
* Kamera parametrelerine erişme *
*************************************************************************/
Console.WriteLine("OffsetX : {0}",
camera.Parameters[PLCamera.OffsetX].GetValue());
Console.WriteLine("OffsetY : {0}",
camera.Parameters[PLCamera.OffsetY].GetValue());
Console.WriteLine("Width : {0}",
camera.Parameters[PLCamera.Width].GetValue());
Console.WriteLine("Height : {0}",
camera.Parameters[PLCamera.Height].GetValue());
// Some camera models may have auto functions enabled. To set the gain value to
a specific value,
// the Gain Auto function must be disabled first (if gain auto is available).
camera.Parameters[PLCamera.GainAuto].TrySetValue(PLCamera.GainAuto.Off); // Set
GainAuto to Off if it is writable.
Tüm değerler "double" tipindedir (IEEE 754 standardında tanımlandığı şekilde çift
kesinlikli kayan nokta sayıları).
Artış değeri isteğe bağlıdır ve değerler otomatik olarak geçerli bir artışa düzeltilir.
Boolean Parametreler
Boolean parametresi, etkinleştirilebilen veya devre dışı bırakılabilen binary-değerli bir özelliği
temsil eder. IBooleanParameter arayüzü ile temsil edilir. Örneğin, bir Boolean parametresi,
kameranın harici tetikleyici girişi gibi belirli bir özelliği etkinleştirmek veya devre dışı bırakmak
için bir "anahtar" olabilir.
Numaralandırma Parametreleri
IEnumParameter arayüzü, önceden tanımlanmış bir setten herhangi bir değeri alabilen kamera
parametrelerine erişim sağlar. Numaralandırma parametrelerinin örnekleri PixelFormat ve
TestImageSelector parametreleridir.
Command Parameters
Try Methods
Pilon parametresi arayüzleri, "Try" ile eklenmiş ilave uzatma yöntemleri sağlar; örneğin,
TrySetValue (IEnumParameter, String). Bu yöntemlerde, parametre yazılabilir ise eylem
gerçekleştirilir. Bazen değerin de ayarlanabilir olması gerekir.
// Bazı kamera modellerinde otomatik fonksiyonlar etkin olabilir. Kazanç
değerini belirli bir değere ayarlamak için, önce Kazanç Otomatik işlevi (eğer
kazanç otomatik varsa) devre dışı bırakılmalıdır.
camera.Parameters[PLCamera.GainAuto].TrySetValue(PLCamera.GainAuto.Off); //
Yazılabilir ise GainAuto'yu Kapalı'ya ayarlayın.
DİKKAT
"Try" yönteminin tam anlamı için belgelerine bakın.
OrDefault Methods
Kodunuz, farklı SFNC sürümleriyle uyumlu birden fazla kamera aygıtı türüyle çalışmak
zorundaysa, parametre adı ve davranışındaki farklılıkları ele almak için GetSfncVersion ()
öğesini kullanabilirsiniz.
if (camera.GetSfncVersion() < sfnc2_0_0) // Handling for older cameras
{
// In previous SFNC versions, GainRaw is an integer parameter.
camera.Parameters[PLCamera.GainRaw].SetValuePercentOfRange(50);
// GammaEnable is a boolean parameter.
camera.Parameters[PLCamera.GammaEnable].TrySetValue(true);
}
else // Handling for newer cameras (using SFNC 2.0, e.g. USB3 Vision cameras)
{
// In SFNC 2.0, Gain is a float parameter.
camera.Parameters[PLUsbCamera.Gain].SetValuePercentOfRange(50);
// For USB cameras, Gamma is always enabled.
}
DİKKAT
SFNC versiyonunu okumak için kamera açık olmalıdır.
DİKKAT
Parametrelerin erişim izinleri değişebilir, yani bir parametre okunamaz veya yazılamaz
olabilir. Bir parametre değiştirilmiş olay işleyicisi bunu ele almalıdır.
DİKKAT
Bir olay işleyicide ortaya çıkan istisnalara açıkça özen gösterin.
Görüntü edinme, kameranın içinde görüntü alma işlemidir. Bir kamera görüntü elde
etmeye başladığında, sensör ortaya çıkar. Pozlama tamamlandığında, görüntü verileri
sensörden okunur.
Görüntü veri aktarımı, elde edilen görüntü verilerini kameranın hafızasından PC'ye
aktarma işlemidir. Bu, USB3 veya Gigabit Ethernet gibi bir arayüz kullanılarak yapılır.
“Grabbing” görüntüleri, görüntü verilerini bilgisayarın ana belleğine yazma işlemidir.
DİKKAT
Yakalama sonuçları hiçbir zaman atılmazsa, görüntü yakalama bir arabellek akışı ile durur.
5.3 Buffer Handling
Start () çağrıldığında, her yakalama oturumu için yeni tamponlar otomatik olarak tahsis edilir.
Bu kameranın StreamGrabber tarafından yapılır. Yakalanan bir görüntünün piksel veri
tamponu, yakalama sonucuna göre tutulur. Yakalama işlemi devam ederken yakalama sonucu
atılırsa, piksel veri arabelleği yeniden kullanılır. Görüntü yakalama durduğunda yakalama
sonucu elimine edilirse, piksel veri arabelleği "serbest bırakılır".
MaxNumBuffer parametresini kullanarak maksimum görüntü veri arabelleği sayısını
ayarlayabilirsiniz. Yakalama için kullanılan varsayılan görüntü verisi arabelleği sayısı 10'dur.
Yakalama için gereken tampon boyutu otomatik olarak belirlenir. Ayrıca, MaxNumBuffer,
örneğin 5 değerinden daha küçük bir sayıda görüntü yakaladığınızda, ayrılmış arabellek sayısı
otomatik olarak azalır.
// Yakalamayı durdur.
camera.StreamGrabber.Stop();
DİKKAT
Eğer yakalama sonuçları hiçbir zaman atılmazsa veya tüm yakalama tamponları
kullanımdaysa, RetrieveResult () çağrısı zaman aşımına uğrar.
DİKKAT
Olay işleyicide ortaya çıkan istisnalara özen gösterin.Yükseltilmiş bir istisna
RetrieveResult(Int32,TimeoutHandling)’un çağrısı tarafına yayılır.Eğer yakalama döngüsü
dişi stream grabber(ProvidedByStreamGrabber) tarafından sağlanıyorsa görüntü yakalama
otomatik olarak durdurulur.Yukarıdaki kod örneği yükseltilmiş istisnalar dışında kalmayı
ihmal eder çünkü büyük olasılıkla konsol çıktısına yazılarak istisnalar ortaya çıkmaz.
5.8 Grabbing Images Using the Grab Loop Thread Provided by the Stream Grabber
StreamGrabber isteğe bağlı olarak yakalama döngüsü dişi sağlayabilir.Diş art arda
RetrieveResult(Int32,TimeoutHandling) öğesini çağırarak döngüdeki görüntüleri
yakalar.Sağlanan yakalama döngüsü dişi kullanırken yakalama sonuçlarını işlemek için bir
ImageGrabbed olay işleyicisi gerekir(yukarıda gösterilmiştir.)
Aşağıdaki örnek,yukarıdaki olay işleyicisini ve StreamGrabber tarafından sağlanan yakalama
döngüsü dişi kullanarak nasıl yakalama yapılacağını gösterir:
// Görüntüleri işlemek için bir işleyici ayarlayın.
camera.StreamGrabber.ImageGrabbed += OnImageGrabbed;
key = Console.ReadKey(true).KeyChar;
if ((key == 't' || key == 'T'))
{
// Yazılım tetikleyicisini yürütün. Kamera tetiklenmeye hazır olana
kadar 100 ms kadar bekleyin.
if (camera.WaitForFrameTriggerReady(100,
TimeoutHandling.ThrowException))
{
camera.ExecuteSoftwareTrigger();
}
}
}
while ((key != 'e') && (key != 'E'));
// Yakalamayı durdur.
camera.StreamGrabber.Stop();
İlk olarak,görüntü olayı işleyicisi kaydedilir.Bu örnekte bir mesaj görüntülemek ve görüntüyü
işlemek için kullanılır.Görüntü yakalama,sınırsız sayıda görüntü için
Start(GrabStrategy,GrabLoop) kullanılarak başlatılır.Start() yönteminin ikinci parametresini
ProvidedByStreamGrabber olarak ayarlayarak,StreamGrabber tarafından sağlanan yakalama
döngüsü dişi kullanılır.Ana diş şimdi kullanıcı klavye girdisini sorgulamak için
kullanılabilir.Kullanıcının hangi tuşa basacağına bağlı olarak bir görüntü tetiklenir veya giriş
döngüsü sonlandırılır.Giriş döngüsü sonra ererse görüntü yakalama Stop() çağrılarak
durdurulur.
Yukarıdaki kod parçacığını Yakalama Döngü Dişi kod örneğinde bulabilirsiniz.
DİKKAT
.NET Bitmap nesneleri yönetilmeyen kaynaklar içerdiklerinden IDisposable arabirimini
uygular.Bu nedenle doğru şekilde atılmalıdır.
DİKKAT
PixelDataConverter nesneleri yönetilmeyen kaynaklar içerdiklerinden IDisposable
arabirimini uygular.Bu nedenle doğru şekilde atılmalıdır.
6.2 Saving Images
ImagePersistence sınıfı,görüntüleri diske kaydetmeyi ve diskten yüklemeyi destekler.
6.3 Image Window
ImageWindow sınıfı DisplayImage(Int32,IImage) kullanarak görüntüleri ekranda kolayca
görüntülemenizi sağlar.Stream grabber’dan alınan görüntüleri incelemek için bu sınıfı
kullanabilirsiniz.
// Yakalamaya başla.
camera.StreamGrabber.Start();
// Yakalamayı durdur.
camera.StreamGrabber.Stop();
Yukarıdaki kod parçasını Grab kod örneğinde bulabilirsiniz.
6.4 Video Writer
VideoWriter, MP4 formatında video formatları oluşturmak için kullanılabilir.Daha fazla bilgi
için Grab Video kod örneğine bakın.
VideoWriter ı kullanmak için Basler web sitesinde bulunan MPEG-4 için pylon ek paketini
kurmanız gerekir.
Alternatif olarak video yazmak için AviVideoWriter kullanılabilir.Dahili olarak Windows için
Video API’sini kullanır.AVI videolarının boyut sınıfır 2 GB olduğundan Basler bunun yerine
VideoWriter kullanılmasını önerir.
DİKKAT
IstreamGrabber.RetrieveResult yönteminde görüntüler beklenirken kamera olayları
görüntü akışına eşzamanlı olarak işlenir.
DİKKAT
Yakalama döngüsü dişi stream grabber(ProvidedByStreamGrabber) tarafından sağlanıyorsa
ParameterChanged olay işleyicisi çağrısı dahili yakalama döngüsü dişinden yapılır.
DİKKAT
Teknik nedenlerden dolayı bir aygıtın kaldırılmasından kaynaklanan ilk hatadan hemen
sonra IsConnected özelliği güncellenemez.
Bir kameranın kaldırıldıktan sonra yeniden açılıp açılmayacağını kontrol etmek için
GetDeviceAccessibilityInfo(ICameraInfo) öğesini de kullanabilirsiniz.
8. Camera Emulation
Pylon diğer taşıma katmanlarına benzer bir kamera emülasyonu taşıma katmanı sunar.Kamera
emülasyon taşıma katmanı bilgisayarınıza takılı fiziksel bir kamera aygıtı olmadan uygulama
geliştirmenize olanak sağlayan basit kamera emülasyon aygıtları oluşturabilir.Emülasyon işlevi
sınırlıdır ancak farklı bit derinlikleri için test görüntüleri oluşturmanıza olanak sağlar.
Mevcut emülasyon cihazlarının sayısı PYLON_CAMEMU ortam değişkenini ayarlayarak kontrol
edilebilir.Örneğin PYLON_CAMEMU=2 ayarı iki emülasyon cihazı sağlayacaktır.Bu cihazlara
pylon API’si ve pylon Viewer programı kullanılarak erişilebilir.
PYLON_CAMEMU ayarlanmadığında hiçbir emülasyon cihazı sağlanmaz.256 adete kadar
kamera emülasyon cihazı oluşturabilirsiniz.
9. Debugging pylon Applications Using GigE Cameras
GigE kameraları kullanarak bir pylon uygulamasında hata ayıklama yaparken “heartbeat”
olarak adlandırılan zaman aşımına uğrayabilirsiniz.Uygulama,belirli aralıklarla kameraya özel
ağ paketleri göndermelidir.Kamera bu heartbeat’ları zamanında alamazsa bağlantıyı kopmuş
kabul edecek ve uygulamadan herhangi bir komut kabul etmeyecektir.
Bu soruna geçici bir çözüm bulmak için geliştirme sırasında kalp atışı zaman aşımını uzatmanız
gerekir.Bunu PYLON_GIGE_HEARTBEAT ortam değişkenini ayarlayarak yapabilirsiniz.Bu,pylon
kamerayı açarken kalp atışı aralığını verilen değere değiştirmesini söyleyecektir.Alternatif
olarak kamera taşıma katmanının Heartbeat Timeout özelliğini kodunuzda ayarlayabilirsiniz.
camera.Parameters[PLTransportLayer.HeartbeatTimeout].TrySetValue(1000,
IntegerValueCorrection.Nearest); // 1000 ms timeout
Bir hata ayıklayıcı altında çalışırken pylon GigE taşıma katmanı bir cihazın kalp atışı zaman
aşımını otomatik olarak 5 dk olarak ayarlar.Bu PYLON_GIGE_HEARTBEAT ortam değişkenini
ayarlayarak geçersiz kılınabilir.Varsayılan mekanizmaya güvenmemenizi,ancak yukarıda
açıklandığı gibi uygun bir kalp atışı zaman aşımı ayarı ayarlayarak kalp atışı zaman aşımını
açıkça belirtmenizi öneririz.
DİKKAT
Kalp atışı zaman aşımını yüksek bir değere ayarladıysanız ve Close() öğesini çağırarak cihazı
düzgün bir şekilde kapatmadan uygulamanızı durdurursanız,kamerayı tekrar
açamazsınız.Ayrıca cihazın kullanımda olduğunu bildiren bir hata mesajı
alırsınız.Uygulamanızı hata ayıklayıcısını kullanarak durdurursanız bu olabilir.Kamerayı
tekrar açmak için zaman aşımı süresi doluncaya kadar beklemeniz veya ağ kablosunu
kameradan çıkarmanız gerekir.
You should now be able to run your application under the debugger with native debugging enabled.
You should now be able to run your application under the debugger with native debugging enabled.