빠른 시작#
이 글의 목적은 단순히 작동하는 코드를 보여주는 데 그치지 않고, 더 복잡한 상황에서 이 예제 코드를 어떻게 재사용하고 수정하여 적용할 수 있는지 여러분이 파악할 수 있도록 돕는 것입니다.
가장 간단한 형태로, 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)이 경과했습니다.
내부적으로는 버퍼 큐에서 이미지를 불러오고 있습니다.
- 프레임이 준비되어 있습니다.
-
그랩 유효성 검사
그랩 결과가 반환되더라도 (전송 오류 등으로 인해) 수집이 실패했을 수 있습니다. 데이터를 사용하기 전에 항상 성공 여부를 확인하십시오.
-
픽셀 데이터 복사본 생성 (선택 사항)
그랩 결과는 버퍼 풀의 버퍼를 사용합니다. 접근할 때
grab_result.Array에서 그랩 결과 버퍼 데이터의 복사본을 가져옵니다. 또는 다음을 사용할 수 있습니다.GetMemoryView()또는GetArrayZeroCopy()복사하지 않고 데이터에 접근할 수 있습니다.그랩 결과의 버퍼는 다음을 벗어난 후에 유효하지 않게 됩니다.
with블록이 해제되기 때문입니다.grab_result외부에서 픽셀 데이터를 사용하려면with블록을 사용하는 경우 복사본을 만들어야 합니다. 다음을 사용할 수 있습니다.Array함수를 사용하여 픽셀 데이터의 복사본을 생성합니다. -
이미지 사용
이는 다음을 확인합니다.
- 이미지가 존재합니다.
- 데이터의 형태가 유효합니다.
멘탈 모델#
이 시각화는 내부적으로 발생하는 상황을 보여줍니다.
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안전한 리소스 처리를 보장하기 위해서입니다.
이 패턴을 이해하고 나면 이를 바탕으로 다음 작업용 코드를 작성할 수 있습니다.