Allen's 데이터 맛집

C#과 Basler Pylon을 사용하여 카메라 파라미터 설정 및 접근 본문

Programming/Pylon .Net API

C#과 Basler Pylon을 사용하여 카메라 파라미터 설정 및 접근

Allen93 2024. 8. 14. 16:30
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 표준을 준수하는 방법과 다양한 파라미터 설정을 효율적으로 수행할 수 있습니다. 


해시태그

#CSharp #BaslerPylon #카메라파라미터 #이미지처리 #비전코딩 #프로그래밍 #오픈소스 #GitHub #코딩팁 #개발자

728x90