Allen's 데이터 맛집
C#과 Basler Pylon을 사용하여 카메라 파라미터 설정 및 접근 본문
C#과 Basler Pylon .NET API를 사용하여 카메라 파라미터를 설정하고 접근하는 방법에 대해 설명하겠습니다. 이 샘플 코드는 GenICam 표준을 준수하는 카메라에서 다양한 파라미터를 설정하고 조회하는 방법을 보여줍니다. GenICam 표준은 카메라의 구성 인터페이스를 정의하는 XML 파일을 기반으로 하며, 이를 통해 카메라의 여러 기능을 제어할 수 있습니다.
코드 설명
1. 코드 개요
이 샘플 프로그램은 Basler Pylon 카메라의 파라미터를 설정하고 조회하는 과정을 보여줍니다. 카메라의 다양한 파라미터를 설정하고 조회하는 방법을 설명하며, GenICam 표준을 준수하는 방법도 소개합니다.
using System;
using Basler.Pylon;
namespace ParameterizeCamera
{
class ParameterizeCamera
{
static Version Sfnc2_0_0 = new Version(2, 0, 0);
internal static void Main()
{
int exitCode = 0;
try
{
using (Camera camera = new Camera())
{
/*************************************************************************
* Accessing camera parameters *
*************************************************************************/
camera.Open();
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("======================");
camera.Parameters[PLCamera.OffsetX].TrySetToMinimum();
camera.Parameters[PLCamera.OffsetY].TrySetToMinimum();
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());
string oldPixelFormat = camera.Parameters[PLCamera.PixelFormat].GetValue();
Console.WriteLine("Old PixelFormat : {0}", oldPixelFormat);
if (camera.Parameters[PLCamera.PixelFormat].TrySetValue(PLCamera.PixelFormat.Mono8))
{
Console.WriteLine("New PixelFormat : {0}", camera.Parameters[PLCamera.PixelFormat].GetValue());
}
camera.Parameters[PLCamera.GainAuto].TrySetValue(PLCamera.GainAuto.Off);
if (camera.GetSfncVersion() < Sfnc2_0_0)
{
camera.Parameters[PLCamera.GainRaw].SetValuePercentOfRange(50);
camera.Parameters[PLCamera.GammaEnable].TrySetValue(true);
}
else
{
camera.Parameters[PLUsbCamera.Gain].SetValuePercentOfRange(50);
}
Console.WriteLine("OffsetX readable : {0}", camera.Parameters[PLCamera.OffsetX].IsReadable);
Console.WriteLine("TriggerSoftware writable: {0}", camera.Parameters[PLCamera.TriggerSoftware].IsWritable);
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);
camera.Parameters[PLCamera.GammaEnable].TrySetValue(true);
bool centerXValue = camera.Parameters[PLCamera.CenterX].GetValueOrDefault(false);
Console.WriteLine("CenterX : {0}", centerXValue);
Console.WriteLine("OffsetX writable : {0}", camera.Parameters[PLCamera.OffsetX].IsWritable);
camera.Parameters[PLCamera.CenterX].TrySetValue(!centerXValue);
Console.WriteLine("CenterX : {0}", camera.Parameters[PLCamera.CenterX].GetValueOrDefault(false));
Console.WriteLine("OffsetX writable : {0}", camera.Parameters[PLCamera.OffsetX].IsWritable);
camera.Parameters[PLCamera.CenterX].TrySetValue(centerXValue);
camera.Parameters[PLCamera.Width].SetValue(202, IntegerValueCorrection.Nearest);
camera.Parameters[PLCamera.Width].TrySetValue(202, IntegerValueCorrection.Nearest);
string[] pixelFormats = new string[]
{
PLCamera.PixelFormat.BayerBG8,
PLCamera.PixelFormat.BayerRG8,
PLCamera.PixelFormat.BayerGR8,
PLCamera.PixelFormat.BayerGB8,
PLCamera.PixelFormat.Mono8
};
camera.Parameters[PLCamera.PixelFormat].SetValue(pixelFormats);
camera.Parameters[PLCamera.PixelFormat].TrySetValue(pixelFormats);
Console.WriteLine("New PixelFormat : {0}", camera.Parameters[PLCamera.PixelFormat].GetValue());
camera.Parameters[(IntegerName)"BrandNewFeature"].TrySetToMaximum();
if (camera.Parameters[(EnumName)"PixelFormat"].TrySetValue("Mono8"))
{
Console.WriteLine("New PixelFormat : {0}", camera.Parameters[(EnumName)"PixelFormat"].GetValue());
}
camera.Parameters[PLCamera.PixelFormat].SetValue(oldPixelFormat);
camera.Close();
}
}
catch (Exception e)
{
Console.Error.WriteLine("Exception: {0}", e.Message);
exitCode = 1;
}
Console.Error.WriteLine("\nPress enter to exit.");
Console.ReadLine();
Environment.Exit(exitCode);
}
}
}
2. 주요 구성 요소 및 기능
a. 카메라 정보 출력
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());
- 카메라 정보 출력: 카메라의 벤더, 모델, 펌웨어 버전을 출력합니다.
b. 카메라 설정
camera.Parameters[PLCamera.OffsetX].TrySetToMinimum();
camera.Parameters[PLCamera.OffsetY].TrySetToMinimum();
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());
- 카메라 파라미터 설정: 오프셋과 크기(Width, Height)를 설정하고 출력합니다. IntegerValueCorrection.Nearest를 사용하여 가장 가까운 유효한 값으로 설정합니다.
c. 픽셀 포맷 설정
string oldPixelFormat = camera.Parameters[PLCamera.PixelFormat].GetValue();
Console.WriteLine("Old PixelFormat : {0}", oldPixelFormat);
if (camera.Parameters[PLCamera.PixelFormat].TrySetValue(PLCamera.PixelFormat.Mono8))
{
Console.WriteLine("New PixelFormat : {0}", camera.Parameters[PLCamera.PixelFormat].GetValue());
}
- 픽셀 포맷 설정: 현재 픽셀 포맷을 저장하고, Mono8 포맷으로 변경합니다.
d. 게인 설정
camera.Parameters[PLCamera.GainAuto].TrySetValue(PLCamera.GainAuto.Off);
if (camera.GetSfncVersion() < Sfnc2_0_0)
{
camera.Parameters[PLCamera.GainRaw].SetValuePercentOfRange(50);
camera.Parameters[PLCamera.GammaEnable].TrySetValue(true);
}
else
{
camera.Parameters[PLUsbCamera.Gain].SetValuePercentOfRange(50);
}
- 게인 설정: 자동 게인 기능을 끄고, SFNC 버전에 따라 게인 값을 설정합니다.
e. 파라미터 상태 확인
Console.WriteLine("OffsetX readable : {0}", camera.Parameters[PLCamera.OffsetX].IsReadable);
Console.WriteLine("TriggerSoftware writable: {0}", camera.Parameters[PLCamera.TriggerSoftware].IsWritable);
- 파라미터 상태 확인: 특정 파라미터가 읽기 가능한지, 쓰기 가능한지 여부를 확인합니다.
f. 센터 설정 및 토글
bool centerXValue = camera.Parameters[PLCamera.CenterX].GetValueOrDefault(false);
Console.WriteLine("CenterX : {0}", centerXValue);
Console.WriteLine("OffsetX writable : {0}", camera.Parameters[PLCamera.OffsetX].IsWritable);
camera.Parameters[PLCamera.CenterX].TrySetValue(!centerXValue);
Console.WriteLine("CenterX : {0}", camera.Parameters[PLCamera.CenterX].GetValueOrDefault(false));
Console.WriteLine("OffsetX writable : {0}", camera.Parameters[PLCamera.OffsetX].IsWritable);
camera.Parameters[PLCamera.CenterX].TrySetValue(centerXValue);
- 센터 설정 및 토글: CenterX 값을 토글하고, 오프셋 파라미터의 쓰기 가능 여부를 확인합니다.
g. 파라미터 존재 확인 및 설정
camera.Parameters[(IntegerName)"BrandNewFeature"].TrySetToMaximum();
if (camera.Parameters[(EnumName)"PixelFormat"].TrySetValue("Mono8"))
{
Console.WriteLine("New PixelFormat : {0}", camera.Parameters[(EnumName)"PixelFormat"].GetValue());
}
- 새로운 파라미터 설정: 새로운 파라미터를 설정하고, 픽셀 포맷을 Mono8로 설정합니다.
h. 기존 픽셀 포맷 복원
camera.Parameters[PLCamera.PixelFormat].SetValue(oldPixelFormat);
- 기존 픽셀 포맷 복원: 이전에 저장한 픽셀 포맷으로 복원합니다.
이 샘플 코드는 Basler Pylon .NET API를 사용하여 카메라의 다양한 파라미터를 설정하고 조회하는 방법을 보여줍니다. 이를 통해 GenICam 표준을 준수하는 방법과 다양한 파라미터 설정을 효율적으로 수행할 수 있습니다.
728x90