빠른 시작#
이 글의 목적은 단순히 작동하는 코드를 보여주는 데 그치지 않고, 더 복잡한 상황에서 이 예제 코드를 어떻게 재사용하고 수정하여 적용할 수 있는지 여러분이 파악할 수 있도록 돕는 것입니다.
가장 간단한 형태로, 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 결과는 버퍼 풀의 버퍼를 사용합니다. 다음을 호출할 때
grab_result.Array, 그러면 그랩 결과 버퍼 데이터의 사본을 얻을 수 있습니다. 또는 다음을 사용할 수도 있습니다.GetMemoryView()또는GetArrayZeroCopy()복사하지 않고 데이터에 접근하려면.그랩 결과에서 얻은 버퍼는 다음을 벗어나면 무효화됩니다.
with...이기 때문에 차단합니다.grab_result이 공개되었습니다. 이 픽셀 데이터를with블록을 사용하려면 해당 블록의 복사본을 만들어야 합니다. 다음을 사용할 수 있습니다.Array픽셀 데이터의 복사본을 생성하는 함수. -
이미지 사용
이는 다음 사실을 확인해 줍니다:
- 그 이미지가 있습니다.
- 데이터의 형식이 올바릅니다.
멘탈 모델#
이 시각화 자료는 내부적으로 어떤 일이 일어나는지 보여줍니다.
Camera (hardware)
↓
pylon driver + buffers
↓
Transport layer (USB/GigE)
↓
RetrieveResult()
↓
NumPy array (your application)
핵심 개념:
- 카메라는 비동기적으로 작동합니다 (프레임을 생성하며).
- 귀하의 파이썬 코드는 프레임을 동기식으로 처리합니다.
버퍼는 그 사이에 위치하여 두 세계(카메라와 애플리케이션)를 분리합니다.
주요 핵심 사항#
- 항상 확인하세요
GrabSucceeded(). - 결과 범위를 벗어나거나 캡처 결과를 해제하기 전에 항상 이미지 데이터를 복사해야 합니다. 예를 들어, 다음을 사용하여:
Array함수와 함께 직접 사용할 수 있습니다. - 설정하려는 속성을 식별하려면
StartGrabbingMax(1)간단한 테스트를 위해. 또는 다음을 사용할 수도 있습니다.GrabOne(5000).
StartGrabbingMax(1)정확히 하나의 이미지를 가져옵니다.GrabOne(5000)이미지 하나를 가져오지만 5000 µs 후에 시간 초과가 발생합니다. - 설정하려는 속성을 식별하려면
with자원을 안전하게 처리하기 위해.
이 패턴을 이해했다면, 이를 바탕으로 다음 작업들을 수행할 수 있는 코드를 작성할 수 있습니다:
- 지속적인 수집 루프 구축
- 트리거 기반 수집 구성
- 다중 카메라 시스템 설계