빠른 시작#
작동하는 코드를 보여주는 것뿐만 아니라, 더 복잡한 시나리오에서 샘플 코드를 재사용하고 적용하는 방법을 이해할 수 있도록 하는 것이 목적입니다.
단계별 예제#
가장 단순한 형태에서 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)
이 샘플을 개별 단계별로 분석해 보겠습니다:
-
카메라 생성 및 관리
이 라인은 두 가지 중요한 작업을 수행합니다:
- 이 라인은 사용 가능한 첫 번째 카메라를 선택하고, 전송 계층 팩토리를 사용하여 pylon 디바이스 오브젝트를 생성한 후, 쉽게 사용할 수 있도록
InstantCamera오브젝트로 래핑합니다. - 사용
with오류가 발생하더라도 리소스가 자동으로 해제되고 카메라가 올바르게 닫히도록 보장합니다.
- 이 라인은 사용 가능한 첫 번째 카메라를 선택하고, 전송 계층 팩토리를 사용하여 pylon 디바이스 오브젝트를 생성한 후, 쉽게 사용할 수 있도록
-
취득 시작
이 작업은 카메라가 아직 열려 있지 않은 경우 카메라를 열고, 취득 엔진을 시작하며, 카메라에 다음 작업을 지시합니다:
- 정확히 하나의 프레임을 취득합니다.
- 이후 취득을 중지합니다.
이 방식은 무한 루프를 방지할 수 있으므로 테스트에 이상적입니다.
Open 호출을 통해 카메라를 사전에 열 수도 있습니다.
열기가 완료되면 연결이 생성되고 다음 작업을 수행할 수 있도록 카메라가 준비됩니다.
- 파라미터 구성
- 취득 시작
-
그랩 결과 검색
이 호출은 다음 이벤트 중 하나가 발생할 때까지 차단됩니다.
- 프레임을 사용할 수 있습니다.
또는 - 타임아웃(5000 ms)에 도달했습니다.
내부적으로 버퍼 큐(buffer queue)에서 이미지를 가져옵니다.
- 프레임을 사용할 수 있습니다.
-
그랩 유효성 검사
그랩 결과가 반환되더라도 (예: 전송 오류로 인해) 획득에 실패했을 수 있습니다. 데이터를 사용하기 전에 항상 성공 여부를 확인하세요.
-
픽셀 데이터 복사본 생성(선택 사항)
그랩 결과는 버퍼 풀의 버퍼를 사용합니다. 액세스할 때
grab_result.Array, 그랩 결과 버퍼 데이터의 복사본을 얻게 됩니다. 또는 다음을 사용할 수 있습니다.GetMemoryView()또는GetArrayZeroCopy()복사하지 않고 데이터에 액세스할 수 있습니다.그랩 결과의 버퍼는 다음을 벗어난 후에 유효하지 않게 됩니다.
with블록. 이유는 다음과 같습니다.grab_result이(가) 해제되기 때문입니다. 외부에서 픽셀 데이터를 사용하려면with블록인 경우, 해당 복사본을 만들어야 합니다. 다음을 사용할 수 있습니다.Array함수를 사용하여 픽셀 데이터의 복사본을 생성합니다. -
이미지 사용
이는 다음을 확인합니다.
- 이미지가 존재합니다.
- 데이터의 형태가 유효합니다.
대화형 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리소스가 안전하게 처리되도록 보장합니다.
이 패턴을 이해하고 나면 이를 바탕으로 다음 작업을 위한 코드를 작성할 수 있습니다.