콘텐츠로 건너뛰기
STAGING SERVER
DEVELOPMENT SERVER

빠른 시작#

이 주제에서는 간단한 워크플로를 통해 pypylon의 첫 단계를 보여줍니다.

작동하는 코드를 보여주는 것뿐만 아니라, 더 복잡한 시나리오에서 샘플 코드를 재사용하고 적용하는 방법을 이해할 수 있도록 하는 것이 목적입니다.

단계별 예제#

가장 단순한 형태에서 pypylon을 사용한 이미지 취득에는 다음 단계가 포함됩니다:

  • 카메라 검색
  • 카메라 열기
  • 이미지 취득 시작
  • 이미지 가져오기
  • 이미지 처리

다음 예제는 이러한 단계를 보여줍니다. 추가적으로 다음과 같은 이점이 있습니다:

  • 설치가 정상적으로 작동하는지 확인할 수 있습니다.
  • 카메라 연결 상태를 테스트할 수 있습니다.
  • 취득 라이프사이클을 이해하는 데 도움이 됩니다.

예:

from pypylon import pylon

with pylon.InstantCamera(pylon.FirstFound) as camera:
    camera.StartGrabbingMax(1)

    with camera.RetrieveResult(5000) as grab_result:
        if grab_result.GrabSucceeded():
            image = grab_result.Array
            print(image.shape)

이 샘플을 개별 단계별로 분석해 보겠습니다:

  1. 카메라 생성 및 관리

    with pylon.InstantCamera(pylon.FirstFound) as camera:
    

    이 라인은 두 가지 중요한 작업을 수행합니다:

    • 이 라인은 사용 가능한 첫 번째 카메라를 선택하고, 전송 계층 팩토리를 사용하여 pylon 디바이스 오브젝트를 생성한 후, 쉽게 사용할 수 있도록 InstantCamera 오브젝트로 래핑합니다.
    • 사용 with 오류가 발생하더라도 리소스가 자동으로 해제되고 카메라가 올바르게 닫히도록 보장합니다.
  2. 취득 시작

    camera.StartGrabbingMax(1)
    

    이 작업은 카메라가 아직 열려 있지 않은 경우 카메라를 열고, 취득 엔진을 시작하며, 카메라에 다음 작업을 지시합니다:

    • 정확히 하나의 프레임을 취득합니다.
    • 이후 취득을 중지합니다.

    이 방식은 무한 루프를 방지할 수 있으므로 테스트에 이상적입니다.

    Open 호출을 통해 카메라를 사전에 열 수도 있습니다.

    camera.Open()
    

    열기가 완료되면 연결이 생성되고 다음 작업을 수행할 수 있도록 카메라가 준비됩니다.

    • 파라미터 구성
    • 취득 시작
  3. 그랩 결과 검색

    with camera.RetrieveResult(5000) as grab_result:
    

    이 호출은 다음 이벤트 중 하나가 발생할 때까지 차단됩니다.

    • 프레임을 사용할 수 있습니다.
      또는
    • 타임아웃(5000 ms)에 도달했습니다.

    내부적으로 버퍼 큐(buffer queue)에서 이미지를 가져옵니다.

  4. 그랩 유효성 검사

    if grab_result.GrabSucceeded():
    

    그랩 결과가 반환되더라도 (예: 전송 오류로 인해) 획득에 실패했을 수 있습니다. 데이터를 사용하기 전에 항상 성공 여부를 확인하세요.

  5. 픽셀 데이터 복사본 생성(선택 사항)

    그랩 결과는 버퍼 풀의 버퍼를 사용합니다. 액세스할 때 grab_result.Array, 그랩 결과 버퍼 데이터의 복사본을 얻게 됩니다. 또는 다음을 사용할 수 있습니다. GetMemoryView() 또는 GetArrayZeroCopy() 복사하지 않고 데이터에 액세스할 수 있습니다.

    그랩 결과의 버퍼는 다음을 벗어난 후에 유효하지 않게 됩니다. with 블록. 이유는 다음과 같습니다. grab_result 이(가) 해제되기 때문입니다. 외부에서 픽셀 데이터를 사용하려면 with 블록인 경우, 해당 복사본을 만들어야 합니다. 다음을 사용할 수 있습니다. Array 함수를 사용하여 픽셀 데이터의 복사본을 생성합니다.

    image = grab_result.Array
    
  6. 이미지 사용

    print(image.shape)
    

    이는 다음을 확인합니다.

    • 이미지가 존재합니다.
    • 데이터의 형태가 유효합니다.

대화형 GigE 세션을 위한 ConnectionGuard 활성화#

디버거에서 GigE 카메라를 열면 pylon이 자동으로 켜집니다. ConnectionGuardEnable 이전 Open(). 이는 두 가지 작업을 수행합니다.

  • 카메라가 예기치 않게 재시작되지 않도록 하트비트 타임아웃을 60분으로 늘립니다.
  • 프로그램이 갑자기 중지될 경우 연결이 안전하게 해제됩니다.

명시적으로 설정하려면 카메라를 열기 전에 수행하십시오.

from pypylon import pylon

with pylon.InstantCamera() as camera:
    camera.Attach(pylon.FirstFound)
    camera.TLNodeMap.ConnectionGuardEnable.Value = True
    camera.Open()

디버거 세션 외에서도 동일한 동작이 필요할 때 유용합니다.

Mental Model#

이 시각화는 내부적으로 발생하는 상황을 보여줍니다.

Camera (hardware)
      ↓
pylon driver + buffers
      ↓
Transport layer (USB/GigE)
      ↓
RetrieveResult()
      ↓
NumPy array (your application)

핵심 개념:

  • 카메라는 비동기식으로 실행되며(프레임 생성),
  • Python 코드는 프레임을 동기식으로 소비합니다.

버퍼가 그 사이에 위치하여 두 영역(카메라와 애플리케이션)을 분리합니다.

주요 내용 요약#

  • 항상 확인하십시오. GrabSucceeded().
  • 결과 범위를 벗어나거나 획득 결과를 해제하기 전에 항상 이미지 데이터를 복사하십시오. 예를 들어 다음을 사용합니다. Array 함수입니다.
  • 사용 StartGrabbingMax(1) 간단한 테스트에 사용할 수 있습니다. 또는 다음을 사용할 수 있습니다. GrabOne(5000).
    StartGrabbingMax(1) 정확히 하나의 이미지를 획득합니다. GrabOne(5000) 이미지를 하나 획득하지만 5000 µs 후에 시간 초과됩니다.
  • 사용 with 리소스가 안전하게 처리되도록 보장합니다.

이 패턴을 이해하고 나면 이를 바탕으로 다음 작업을 위한 코드를 작성할 수 있습니다.