콘텐츠로 바로 가기
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)이 경과했습니다.

    내부적으로는 버퍼 큐에서 이미지를 불러오고 있습니다.

  4. 그랩 유효성 검사

    if grab_result.GrabSucceeded():
    

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

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

    그랩 결과는 버퍼 풀의 버퍼를 사용합니다. 접근할 때 grab_result.Array에서 그랩 결과 버퍼 데이터의 복사본을 가져옵니다. 또는 다음을 사용할 수 있습니다. GetMemoryView() 또는 GetArrayZeroCopy() 복사하지 않고 데이터에 접근할 수 있습니다.

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

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

    print(image.shape)
    

    이는 다음을 확인합니다.

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

멘탈 모델#

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

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 안전한 리소스 처리를 보장하기 위해서입니다.

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