You are on page 1of 21

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();

// Çok sayıda görüntü yakala.


for (int i = 0; i < 10; ++i)
{
// Bir görüntü bekle ve sonra onu al. 5000 ms'lik bir zaman aşımı
kullanılır.
IGrabResult grabResult = camera.StreamGrabber.RetrieveResult(5000,
TimeoutHandling.ThrowException);
using (grabResult)
{
// Görüntü başarıyla yakalandı mı?
if (grabResult.GrabSucceeded)
{
// Görüntü verilerine eriş.
Console.WriteLine("SizeX: {0}", grabResult.Width);
Console.WriteLine("SizeY: {0}", grabResult.Height);
byte[] buffer = grabResult.PixelData as byte[];
Console.WriteLine("Gray value of first pixel: {0}", buffer[0]);
Console.WriteLine("");
}
else
{
Console.WriteLine("Error: {0} {1}", grabResult.ErrorCode,
grabResult.ErrorDescription);
}
}
}

// 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.

2.3 Extension Methods


Pylon.NET,uzantı yöntemlerini kullanır.Bazı programlama dilleri için pylon API’sinin uzatma
yöntemleri açıkça kapsam dahiline alınmalıdır.C# kullanırken uzatma yöntemleri anında
kullanılabilir.
' Bring extension methods of the pylon API into scope.
Imports Basler.Pylon.IIntegerParameterExtensions
Imports Basler.Pylon.IBooleanParameterExtensions
Imports Basler.Pylon.ICommandParameterExtensions
Imports Basler.Pylon.IEnumParameterExtensions
Imports Basler.Pylon.IFloatParameterExtensions
Imports Basler.Pylon.IImageExtensions
Imports Basler.Pylon.IStringParameterExtensions

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 *
*************************************************************************/

// Kamera cihaz parametrelerine erişmeden önce kamera açılmalıdır.


camera.Open();

// DeviceVendorName, DeviceModelName ve DeviceFirmwareVersion, string


parametrelerdir.
Console.WriteLine("Camera Device Information");
Console.WriteLine("=========================");
Console.WriteLine("Vendor : {0}",
camera.Parameters[PLCamera.DeviceVendorName].GetValue());
Console.WriteLine("Model : {0}",
camera.Parameters[PLCamera.DeviceModelName].GetValue());
Console.WriteLine("Firmware version : {0}",
camera.Parameters[PLCamera.DeviceFirmwareVersion].GetValue());
Console.WriteLine("");
Console.WriteLine("Camera Device Settings");
Console.WriteLine("======================");

// AOI’yi ayarlama. OfsetX, OfsetY, Width ve Height, integer parametreleridir.


// Bazı kameralarda ofsetler salt okunurdur. Yazılabilir iseler, ofsetleri min.
a ayarlayın.
camera.Parameters[PLCamera.OffsetX].TrySetToMinimum();
camera.Parameters[PLCamera.OffsetY].TrySetToMinimum();
// Bazı parametrelerin kısıtlamaları vardır. Geçerli bir değer ayarladığınızdan
emin olmak için GetIncrement / GetMinimum / GetMaximum kullanabilirsiniz.
// Burada, pylonun gerekirse değeri düzeltmesine izin veriyoruz.
camera.Parameters[PLCamera.Width].SetValue(202, IntegerValueCorrection.Nearest);
camera.Parameters[PLCamera.Height].SetValue(101,IntegerValueCorrection.Nearest);

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());

// Set an enum parameter.


string oldPixelFormat = camera.Parameters[PLCamera.PixelFormat].GetValue(); //
Remember the current pixel format.
Console.WriteLine("Old PixelFormat : {0} ({1})",
camera.Parameters[PLCamera.PixelFormat].GetValue(), oldPixelFormat);

// Set pixel format to Mono8 if available.


if
(camera.Parameters[PLCamera.PixelFormat].TrySetValue(PLCamera.PixelFormat.Mono8)
)
{
Console.WriteLine("New PixelFormat : {0} ({1})",
camera.Parameters[PLCamera.PixelFormat].GetValue(), oldPixelFormat);
}

// 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.

4.2 Parameter Types


Integer Parametreler

IIntegerParameter arayüzü,integer parametrelere erişim sağlar.Bir integer parametresi piksel


cinsinden görüntü genişliği veya yüksekliği gibi bir integere sayısına göre ayarlanabilen bir
özelliği temsil eder.Bir tamsayı parametresinin geçerli değerinin yanı sıra,parametre için izin
verilen değer aralığını tanımlayarak minimum ve maksimum değerleri okuyabilirsiniz.Ayrıca
parametrenin artış değerini okuyabilirsiniz.Mevcut,minimum,maksimum ve artış değerinin
tümüne 64 bitlik değerler olarak erişilebilir.
Floating-Point Parametreler

Floating-point parametreler IFLoatParameter nesneleri tarafından temsil edilir.Floating-point


değerine ayarlanabilirler.Floating-point parametresi aşağıdaki istisnalar dışında integer
parametresine benzer:

 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

Komut parametreleri (ICommandParameter) kameranın içindeki bir işlemi veya eylemi


tetikler, örneğin bir yazılım tetikleyicisi verir. Eylem Execute () çağrılarak yürütülür. Eylemin
yürütülmesinin bitip bitmediğini belirlemek için IsExecuting () öğesini kullanabilirsiniz.
String Parameters

IStringParameter arabirimi, string parametrelerine erişim sağlar.

4.3 Accessing Parameters Without Using a Parameter List


Parametre listesi kullanmadan parametrelere erişmek, örneğin, henüz bir parametre listesine
dahil edilmemiş yeni eklenen kamera parametrelerini ayarlamak istiyorsanız, nadir
durumlarda gerekli olabilir. Bunun dışında, Basler yanlış parametre türleri kullanmaktan
kaçınmak ve yazım hatalarını önlemek için parametre listeleri kullanmanızı önerir.
// Varsa, piksel biçimini Mono8 olarak ayarlayın.
if
(camera.Parameters[PLCamera.PixelFormat].TrySetValue(PLCamera.PixelFormat.Mono8)
)
{
Console.WriteLine("New PixelFormat : {0} ({1})",
camera.Parameters[PLCamera.PixelFormat].GetValue(), oldPixelFormat);
}

// Parametrelere erişirken, ad ve tür genellikle önceden bilinmelidir.


// Herhangi bir kamera aygıtı parametresine erişmek için aşağıdaki sözdizimi
kullanılabilir.
// Parametre adını ("BrandNewFeature") ve erişmek istediğiniz parametreye göre
(IntegerName, EnumName, FloatName, vb.) Parametre türünü ayarlayın.
camera.Parameters[(IntegerName)"BrandNewFeature"].TrySetToMaximum();
// TrySetToMaximum yalnızca tanıtım amacıyla çağrılır.

// Bu, sadece eksiksizlik için gösterilen parametre listesini kullanmadan bir


parametreye erişmenin başka bir alternatifidir.
IIntegerParameter brandNewFeature = camera.Parameters["BrandNewFeature"] as
IIntegerParameter;
// brandNewFeature, yoksa mevcut değilse null olacaktır, çünkü IIntegerParameter
öğesine atılamaz
if (brandNewFeature != null)
{
brandNewFeature.TrySetToMaximum();
}

// Enumeration values are plain strings.


// Similar to the example above, the pixel format is set to Mono8, this time
without using a parameter list.
if (camera.Parameters[(EnumName)"PixelFormat"].TrySetValue("Mono8"))
{
Console.WriteLine("New PixelFormat : {0}",
camera.Parameters[(EnumName)"PixelFormat"].GetValue());
}

4.4 How Parameter Lists Work


Parametre listeleri, örneğin, PLCamera, pylonun derlenme zamanında otomatik olarak
oluşturulan sınıflardır. Parametre listeleri, her kamera parametresi için, örneğin, Genişlik için
bir özellik içerir. Bir özellik isim türlerinden birini döndürür, örneğin, IntegerName. Bir ad türü,
parametrenin tam adını düz string olarak içerir, örneğin, "@ CameraDevice / Width".Bu
şekilde, derleyici, geçen isim tipine göre aşırı yüklenen IParameterCollection endeksleyicilerini
(aşağıda gösterilmiştir) seçerek döndürülen parametre tipini belirleyebilir. Tam isim string i,
parametrenin dahili olarak seçilmesi ve döndürülmesi için kullanılır.
// IParameterCollection'ın aşırı yüklenen indeksleyicisi.
IParameter this[string name] { get; }
IFloatParameter this[FloatName name] { get; }
IBooleanParameter this[BooleanName name] { get; }
ICommandParameter this[CommandName name] { get; }
IStringParameter this[StringName name] { get; }
IEnumParameter this[EnumName name] { get; }
IIntegerParameter this[IntegerName name] { get; }

Numaralandırma parametreleri bunu daha da uzatır. Numaralandırma parametrelerinin


özellikleri, örneğin, PixelFormat, bir kamera tarafından sağlanan her numaralandırma tipi için
üretilen özel sınıflardır, örneğin, PLCamera.PixelFormatEnum. Bu özel sınıflar, bir
numaralandırma parametresinin olası değerlerini temsil eden özellikler içerir, örn., Mono8. Bir
numaralandırma parametresinin değeri her zaman yalnızca düz bir dizedir, örneğin "Mono8".
Tüm özel enum sınıfları derleyici tarafından dolaylı olarak EnumName öğesine aktarılabilir.

4.5 Predefined Camera Parameter Configurations


Yapılandırma sınıfı, önceden tanımlanmış bir kamera parametresi yapılandırmaları kümesi
sağlar. CameraOpened olayına bu sınıfın yöntemleri eklenebilir. Kamera açıldığında,
yapılandırma yöntemi otomatik olarak aranır ve kamera yapılandırması buna göre değiştirilir.
Örneğin, AcquireContinuous yöntemi, serbest çalışan sürekli kazanç sağlar (aşağıdaki örnek
koda bakın).
Ayrıca, kendi yapılandırma yöntemlerinizi oluşturabilir ve bunları CameraOpened olayına
ekleyebilirsiniz. Bu şekilde, kamera açıldığında daima doğru şekilde parametrelenir. Daha fazla
bilgi için, bkz. Kamera Yapılandırma Parametreleri kod örneği parametresi.
// Kamera açıldığında, çekim modunu serbest çalışan sürekli edinimi ayarlayın.
camera.CameraOpened += Configuration.AcquireContinuous;

// Kamera cihazıyla bağlantıyı açın.


camera.Open();

4.6 Kamera Modelleri Arasındaki Farkları Kullanma


Gain gibi özellikler GenICam Standart Özellik Adlandırma Sözleşmesine (SFNC) göre
adlandırılmıştır. SFNC ortak bir dizi özellik, davranışları ve ilgili parametre adlarını tanımlar.
USB3 Vision standardıyla uyumlu kameralar, SFNC 2.0 veya daha sonraki sürümlerine
dayanmaktadır. Basler GigE ve Firewire kameralar ise önceki SFNC versiyonlarına dayanıyor.
Buna göre, bu kameraların davranışı ve bazı parametre adları farklı olacaktır. Aşağıdaki
bölümlerde bunun nasıl kullanılacağı gösterilmektedir.
Empty Parameters

Bazı parametre adları, bazı kamera modellerinde bulunmayabilir. Örneğin, GammaEnable,


USB kamera cihazlarında kullanılamaz. İstenen bir parametre yoksa, pylon boş bir parametre
nesnesi döndürür. Bu nedenle, ek bir varlık kontrolü gerekli değildir. Boş bir parametre asla
okunamaz veya yazılabilir değildir.
Console.WriteLine("GammaEnable writable : {0}",
camera.Parameters[PLCamera.GammaEnable].IsWritable);
Console.WriteLine("GammaEnable readable : {0}",
camera.Parameters[PLCamera.GammaEnable].IsReadable);
Console.WriteLine("GammaEnable empty : {0}",
camera.Parameters[PLCamera.GammaEnable].IsEmpty);

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

"OrDefault", örneğin GetValueOrDefault () eklenmiş yöntemler, eğer okunabilirse veya


varsayılan bir değer döndürdüyse, bir parametre değerini okumak için kullanılabilir.
// Toggle CenterX to change the availability of OffsetX.
// If CenterX is readable, get the value. Otherwise, return false.
bool centerXValue =
camera.Parameters[PLCamera.CenterX].GetValueOrDefault(false);

Checking the SFNC Version

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.

4.7 Parameter Changed Events


Parametreler, ParameterChanged ve ParameterValueChanged olaylarını sağlar. Bu olaylar,
örneğin bir parametre değiştirildiğinde veya kamera nesnesinin durumu değiştiğinde ortaya
çıkar. Aşağıdaki kod Pylon Live View kod örneğinde bulunabilir.
// Parametre durumu değişti. Kontrolü güncelle.
private void ParameterChanged(Object sender, EventArgs e)
{
if (InvokeRequired)
{
// Farklı bir iş parçacığından çağrılırsa, uygun iş parçacığına yapılan
çağrıyı kesmek için Invoke yöntemini kullanmalıyız.
BeginInvoke(new EventHandler<EventArgs>(ParameterChanged),sender, e);
return;
}
try
{
UpdateValues();
}
catch
{
//Hata oluştuğunda kontrolü devre dışı bırak.
Reset();
}
}

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.

4.8 Kamerayı Parametrelendirmek ile İlgili Daha Fazla Bilgi Nerede


Parameterize Camera örneği, parametrelere nasıl erişileceği hakkında ek bilgi sağlar.
Aşağıdaki kaynaklar parametreler hakkında ek bilgi sağlar:

 The Basler Product Documentation


 The parameter lists, e.g., PLCamera
 The pylon Viewer
 The pylon code samples
 Basler Ürün Belgesine dahil olmayan kamera kullanım kılavuzları. Pylon ile monte
edilirler.

5. Görüntüleri Yakalama(Grabbing Images)


Bu bölümde Camera sınıfını kullanarak görüntülerin nasıl yakalanacağı açıklanmaktadır.
Görüntüleri yakalamadan önce, kamera parametreleri aşağıdaki yaklaşımlardan bir veya daha
fazlası kullanılarak ayarlanmalıdır:

 Yapılandırma yöntemlerini çağırmak için CameraOpened olayını kullanarak kamerayı


yapılandırın. Bu, kameranın açıldığında daima doğru şekilde parametrelenmesi
avantajına sahiptir.
 Kamerayı, Open () çağrıldıktan sonra program akışındaki kodu kullanarak yapılandırın.
 Kamerayı, örneğin pilon Görüntüleyiciyi kullanarak önceden yapılandırın. Ön
konfigürasyon, kamerada "kullanıcı seti" adı verilen bir depoda saklanır. Bir kullanıcı
seti "başlangıç seti" olarak seçilirse, kamera açıldığında set aktif hale gelir.
5.1 Görüntü Alma, Aktarma ve Yakalama
Pylon API görüntü edinme, görüntü veri aktarımı ve görüntü yakalama arasında ayrım yapar.

 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.

5.2 Yakalama Sonucu


Yakalanan bir görüntünün verileri bir IGrabResult nesnesi tarafından tutulur. Elde edilen
sonuç, ilişkili piksel veri arabelleğinin yeniden kullanımını ve ömrünü kontrol eder.
IDisposable arayüzü, karşılık gelen tamponlarını kontrol etmek için yakalama sonuçlarıyla
uygulanır. pilon görüntüleri almak için sabit miktarda tampon içeren bir tampon havuzu
(varsayılan: 10) kullanır. Bu gereklidir, çünkü tamponun hafıza sayfalarını kilitleyen bazı
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
arabelleğin yeniden kullanılabileceğini bildirirsiniz. Bu, çöp toplayıcı tarafından tam olarak ele
alınamaz, çünkü çöp toplama işlemlerinin ne zaman gerçekleştirileceği tahmin edilemez.
Yakalama sonucu verilerini bir programdaki farklı yazılım modüllerine dağıtmak için yakalama
sonucunu Clone () yöntemini kullanarak klonlayabilirsiniz. Bir tamponu klonlamak dahili olarak
bir referans sayacı olarak uygulanır. Clone () 'a yapılan her çağrı referans sayacını bir artırır.
Dispose () yöntemine yapılan her çağrı referans sayacını bir azaltır. Referans sayacı sıfıra
düşerse, yakalama sonucunun piksel veri arabelleği yakalama için yeniden kullanılır.Klonlama
bir yakalama sonucunu resim görüntülüme ve görüntü işleme gibi çoklu modüllere dağıtmak
için kullanılabilir. Her modül artık Dispose () işlevini çağırmaya ihtiyaç duymadığında bir
yakalama sonucunu bireysel olarak serbest bırakabilir. Bu şekilde, bir yakalama sonucunun
arabelleğinin yeniden kullanılmasını tetiklemek için "bookkeeping" gerekmez.
Yakalama sonucu ve ilişkili piksel veri arabelleği, yakalamama için kullanılan kamera
nesnesinden daha uzun bir ömre sahip olabilir.

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.

5.4 Grab Engine


Kameranın yakalama motoru, boş bir tampon kuyruğu, bir çıkış kuyruğu ve tutma ipinden
oluşur. Yakalama motoru, görüntüleri almak için düşük seviyeli bir akış yakalayıcı kullanır. Boş
tampon kuyruğu ve çıktı kuyruğu, MaxNumBuffer parametresi tarafından tanımlanan tampon
sayısını tutabilir. Herhangi bir zamanda düşük seviyeli akış yakalayıcıya geçirilen maksimum
tampon sayısı, MaxNumQueuedBuffer parametresi tarafından tanımlanır.
Tüm sıralar FIFO modunda çalışır (ilk giren ilk çıkar).

5.5 Grab Strategies


StreamGrabber farklı yakalama stratejilerini destekler. Varsayılan strateji "Bire Bir" dir.
Mevcut yakalama stratejileri hakkında daha fazla bilgi için GrabStrategy belgelerine ve Grab
Strategies kod örneğine bakın.
 Yakalama motoru, boş arabellek kuyruğundan arabellekleri çıkarır ve boş arabellekleri
düşük düzey akış yakalayıcıda (1) sıraya sokar.
 Kamera cihazı tetiklenir ve kamera cihazı (2) tarafından yeni bir görüntü elde edilir.
Görüntü PC'ye aktarılır ve daha sonra boş bir tampon belleğe alınır.
 Yakalama motor dişine dolu bir tamponun mevcut olduğu bildirilir.Tampon,yakalama
motor dişi(3) tarafından alınır ve çıkış kuyruğuna konur.
 RetrieveResult (Int32, TimeoutHandling) içindeki boşta uygulama diş olduğu
bildirilir.Diş,bir yakalama sonucu için beklemeyi durdurur ve dolu arabelleği(4) bir
yakalama sonucu veri nesnesinin bir parçası olarak alır.
 LatestImages yakalama stratejisi kullanılırsa,kullanıcı çıktı sırasının boyutunu
ayarlayabilir.Yeni bir arabellek yakalandıysa ve çıktı kuyruğu doluysa çıktı kuyruğunda
bekleyen ilk tampon otomatik olarak boş tampon kuyruğuna(4.1) döndürülür.Yeni
tampon daha sonra çıktı sırasına yerleştirilir.Bu,uygulamanın her zaman en yeni
yakalanan görüntülerle çalışmasını sağlar.Otomatik olarak boş arabellek kuyruğuna
döndürülen görüntülere “skipped” görüntüler denir.Çıktı kuyruğu boyutunu
MaxNumBuffer olarak ayarlarken bu strateği “One By One” yakalama stratejisine
eşdeğerdir.
 Uygulama görüntü verilerini işledikten sonra, arabellek boş arabellek kuyruğuna (5)
döndürülür. Bu, yakalama sonucunu eleyerek yapılır. Geri döndürülen tamponlar
yakalama için tekrar kullanılır.

5.6 Grabbing Images in a Loop


Aşağıdaki örnekte basit bir yakalama döngüsü gösterilmektedir:
// Yakalamaya başla.
camera.StreamGrabber.Start();

// Çok sayıda görüntü yakala.


for (int i = 0; i < 10; ++i)
{
// Bir görüntü bekleyin ve sonra onu alın. 5000 ms'lik bir zaman aşımı
kullanılır.
IGrabResult grabResult = camera.StreamGrabber.RetrieveResult(5000,
TimeoutHandling.ThrowException);
using (grabResult)
{
// Görüntü yakalama başarılı mı?
if (grabResult.GrabSucceeded)
{
// Görüntü verilerine erişim.
Console.WriteLine("SizeX: {0}", grabResult.Width);
Console.WriteLine("SizeY: {0}", grabResult.Height);
byte[] buffer = grabResult.PixelData as byte[];
Console.WriteLine("Gray value of first pixel: {0}", buffer[0]);
Console.WriteLine("");
}
else
{
Console.WriteLine("Error: {0} {1}", grabResult.ErrorCode,
grabResult.ErrorDescription);
}
}
}

// Yakalamayı durdur.
camera.StreamGrabber.Stop();

Görüntü yakalama Start() çağrılarak başlatılır.Bundan sonra,görüntüler sürekli olarak


yakalanır.Yakalama sonuçları stream grabber’in çıktı kuyruğuna kamera(grab strategy
OneByOne) tarafından alındıkları sırayla yerleştirilir.RetrieveResult(Int32,TimeoutHandling)
yöntemi yakalama sonucunu beklemek ve çıktı kuyruğundan almak için kullanılır.Yakalama
sonuç verilerinden bazıları ekranda görüntülenir.Çok sayıda görüntü yakalandıktan sonra
Stop() ile görüntü yakalama durdurulur.
OneByOne yakalama stratejisi kullanıyorsanız ve yakalama sonuçları alınmazsa görüntü
yakalama duraklatılır ve en son alınan görüntüler atılır.
Yukarıdaki kod parçasını Grab kod örneğinde bulabilirsiniz.

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.

5.7 Handling the Image Grabbed Event


Aşağıdaki örnek, basit bir ImageGrabbed olay işleyicisini gösterir:
// Olay işleyicisi örneği.
static void OnImageGrabbed(Object sender, ImageGrabbedEventArgs e)
{
// Olay geri çağrısı geri geldiğinde yakalama sonucu otomatik olarak atılır.
// Yakalama sonucu IGrabResult kullanılarak klonlanabilir.Bir kopyasını
saklamak istiyorsanız klonlayın(bu örnekte gösterilmemiştir).
IGrabResult grabResult = e.GrabResult;
// Görüntü yakalama başarılır mı?
if (grabResult.GrabSucceeded)
{
// Görüntü verisine erişim
Console.WriteLine("SizeX: {0}", grabResult.Width);
Console.WriteLine("SizeY: {0}", grabResult.Height);
byte[] buffer = grabResult.PixelData as byte[];
Console.WriteLine("Gray value of first pixel: {0}", buffer[0]);
Console.WriteLine("");
}
else
{
Console.WriteLine("Error: {0} {1}", grabResult.ErrorCode,
grabResult.ErrorDescription);
}
}
DİKKAT
Sağlanan yakalama sonucu,olay çağrısı geri geldiğinde otomatik olarak atılır.Daha fazla işlem
için kullanmak istiyorsanız klonlamanız gerekir.Aksi takdirde karşılık gelen tampon,yakalama
için yeniden kullanılır.

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;

//Yakalama döngüsü dişini kullanarak yakalamaya başlayın.Bu grabLoopType


parametresini GrabLoop.ProvidedByStreamGrabber olarak ayarlayarak
yapılır.Yakalama sonuçları OnImageGrabbed görüntü olay işleyicisine iletilir.
// Varsayılan yakalama stratejisi(GrabStrategy_OneByOne) kullanılır.
camera.StreamGrabber.Start(GrabStrategy.OneByOne,
GrabLoop.ProvidedByStreamGrabber);

// Kamerayı tetiklemek veya döngüden çıkmak için kullanıcı girişini bekleyin.


// Yazılım tetikleme kamera cihazını tetiklemek için kullanılır.
Char key;
do
{
Console.WriteLine("Press 't' to trigger the camera or 'e' to exit.");

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.

6 Image Handling and Image Display


Pylon API,görüntü işleme desteği için ek sınıflar sağlar.Bu,bir görüntü formatı dönüştürücü
sınıfını,bir görüntü penceresi sınıfını ve görüntüleri diske kaydetmeyi destekleyen bir sınıfı
içerir.

6.1 Pixel Data Converter


PixelDataConverter,mevcut bir görüntüyü yeni bir formata dönüştürerek yeni görüntüler
oluşturmanıza olanak sağlar.Format dönüştürücü yapılandırıldıktan sonra görüntüleri Basler
kamera aygıtları örneğin Bitmap tarafından desteklenen hemen hemen tüm formatlara
dönüştürebilir.
Bitmap bitmap = new Bitmap(grabResult.Width, grabResult.Height,
PixelFormat.Format32bppRgb);
// Bitmap'in bitlerini kilitleyin.
BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width,
bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat);
// İşaretçiyi bitmap'in arabelleğine yerleştirin.
converter.OutputPixelFormat = PixelType.BGRA8packed;
IntPtr ptrBmp = bmpData.Scan0;
converter.Convert(ptrBmp, bmpData.Stride * bitmap.Height, grabResult);
bitmap.UnlockBits(bmpData);

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();

// Çok sayıda görüntü yakala.


for (int i = 0; i < 10; ++i)
{
// Bir görüntü bekleyin ve sonra onu alın. 5000 ms'lik bir zaman aşımı
kullanılır.
IGrabResult grabResult = camera.StreamGrabber.RetrieveResult(5000,
TimeoutHandling.ThrowException);
using (grabResult)
{
// Görüntü yakalama başarılı mı?
if (grabResult.GrabSucceeded)
{
// Yakalanmış görüntüyü göster.
ImageWindow.DisplayImage(0, grabResult);
}
else
{
Console.WriteLine("Error: {0} {1}", grabResult.ErrorCode,
grabResult.ErrorDescription);
}
}
}

// 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.

7 Using Advanced Camera Features


7.1 Handling Camera Events
Basler GigE Vision ve USB3 Vision kameralar olay mesajları gönderebilir.Örneğin bir sensör
pozlaması tamamlandığında kamera PC’ye bir Exposure End olayı
gönderebilir.ParameterChanged etkinliğine abone olarak etkinlikler alınabilir.Daha fazla bilgi
için Grab Camera Events kod örneğine ve Pozlama Sonu Etkinliğini Kullanarak Yakalama kod
örneğine bakın.

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.

7.2 Accessing Chunk Features


DataChunk özelliğini destekleyen Basler kameralar kare sayıcılar,zaman etiketleri veya CRC
checksum’ları gibi ek görüntü verileri üretebilir ve elde edilen her görüntüye ekleyebilir.Data
Chunks(Veri parçaları) etkinleştirilirse Camera sınıfı tarafından otomatik olarak
ayrıştırılır.Chun verisine IGrabResult özelliğiyle ChunkData üzerinden erişilebilir.Daha fazla
bilgi için Grab Chunk Image kod örneğine bakın.
7.3 Getting Informed About Camera Device Removal
Kamera cihazının kaldırılması hakkında bilgi almak için IsConnected kamera özelliği
sorgulanabilir veya bir ConnectionLost olay işleyicisi kaydedilebilir.Daha fazla bilgi için Cihaz
Kaldırma İşleme kod örneğine bakın.
DİKKAT
ConnectionLost olay işleyicisi çağrısı ayrı bir iç 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.

7.4 GigE Action Commands


Eylem Komutları kamera özelliği, tek bir yayın protokol mesajı kullanarak kabaca aynı anda
birden fazla kamerada aynı anda görüntü elde etmeyi tetikleyen eylemler gerçekleştirmenize
olanak sağlar.Eylem komutlarını tetiklemek için ActionCommandTrigger sınıfını
kullanabilirsiniz.Daha fazla bilgi için Multiple GigE Cameras için Grab Using Action Command
kod örneğine ve Basler Ürün Belgelerine bakın.
7.5 Saving and Restoring Camera Settings
IParameterCollection’ın Load(String,String) ve Save(String,String) yöntemleri,kameranın
ayarlarını bir dosyaya kaydetmek ve dosyayı yükleyerek ayarları geri yüklemek için
kullanılabilir.Daha fazla bilgi için bkz. Parameterize Camera Load and Save kod örneği.

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.

10. Avoiding Issues When Using Native Debugging in Visual Studio


.NET projeniz için yerel hata ayıklama etkinse ve projeniz pylon montajlarına referans veriyorsa
Visual Studio 2012 veya Visual Studio 2013 hata ayıklayıcısının altında çalışırken uygulama
çökebilir.
Microsoft Visual Studio 2012 ile yeni bir hata ayıklayıcısı altyapısı başlattı.Bu hata ayıklayıcı
altyapısı yönetilen C++ uygulamalarında hata ayıklamayı desteklemiyor.Performans nedeniyle
Basler.Pylon montajı C++ ile yazılmıştır.Bu nedenle yerel hata ayıklama etkinse ve projeniz
pylon montajlarına atıf yapıyorsa yeni hata ayıklayıcı motorunu kullanmalısınız.
Bu sorunu önlemek için yeni hata ayıklayıcı motorunu devre dışı bırakmanız
gerekir.Bu,Yönetilen Uygumluluk Modu’nu etkinleştirilerek yapılır.
Visual Studio 2012'de Yönetilen Uyumluluk Modunu etkinleştirmek için

1. Start Visual Studio 2012.

2. On the Tools menu, click Options.

This opens the Options dialog box.

3. Expand the Debugging section and choose General.

This shows the general debugging settings.


4. Select the Managed C++ Compatibility Mode option.

You should now be able to run your application under the debugger with native debugging enabled.

To enable the Managed Compatibility Mode in Visual Studio 2013

1. Start Visual Studio 2013.

2. On the Tools menu, click Options.

This opens the Options dialog box.

3. Expand the Debugging section and choose General.

This shows the general debugging settings.

4. Select the Use Managed Compatibility Mode option.

You should now be able to run your application under the debugger with native debugging enabled.

You might also like