콘텐츠로 바로 가기
STAGING SERVER
DEVELOPMENT SERVER

Python 프로그래머 가이드#

이 주제는 Basler blaze 및 Smart blaze 카메라에 대한 구체적인 정보를 제공하며, pypylon에 대한 포괄적인 개요를 제시하는 것을 목적으로 하지 않습니다.

Basler pylon을 위한 공식 Python 언어 바인딩은 pypylon 프로젝트입니다. pypylon은 GitHub에서 호스팅되는 오픈소스 프로젝트입니다. Basler 3D 카메라를 사용하려면 버전 4.0 이상을 사용해야 합니다.

공식 파이썬 래퍼 대신, Python Harvester 라이브러리를 통해 카메라를 제어할 수 있습니다. Harvesters는 컴퓨터 비전 애플리케이션에서 이미지 획득 과정을 간소화하기 위해 설계된 파이썬 라이브러리입니다. 이 라이브러리를 사용하면 GenTL Producers를 통해 이미지를 획득할 수 있습니다.

정보

이 항목의 모든 정보는 모든 blaze 및 Smart blaze 카메라 모델에 적용됩니다. 간결함을 위해 모든 모델을 지칭할 때 "blaze"를 사용합니다.

pypylon#

pypylon 설치하기#

파이썬 프로그래밍 예제#

pylon Supplementary Package for blaze 에는 Python과 pypylon을 사용하여 Blaze 카메라에 액세스하는 방법을 보여주는 몇 가지 Python 프로그래밍 예제가 포함되어 있습니다.

To open the folder containing the programming samples for blaze cameras, press the Win key, go to the Basler folder, and choose blaze Samples. A File Explorer window opens. The Python programming samples are located in the Python folder.

The Python samples are located in the /opt/pylon/share/pylon/Samples/blaze/Python/pypylon folder.

정보

샘플을 빌드하기 전에, 샘플이 들어 있는 폴더를 쓰기 권한이 있는 원하는 위치로 복사하십시오.

각 샘플마다 해당 샘플의 기능과 실행에 필요한 사항에 대한 정보를 제공하는 README.md 파일이 있습니다.

pypylon을 사용하여 Blaze 카메라에 접속하기#

SimpleGrab/simple_grab.py 파일을 참고하거나 다음 코드 조각을 사용하세요:

from pypylon import pylon

dc = pylon.DeviceInfo()
dc.SetDeviceClass("BaslerGTC/Basler/GenTL_Producer_for_Basler_blaze_101_cameras")
camera = pylon.InstantCamera(pylon.TlFactory.GetInstance().CreateFirstDevice(dc))
camera.Open()

camera.StartGrabbing(pylon.GrabStrategy_LatestImageOnly)

while camera.IsGrabbing():
    grabResult = camera.RetrieveResult(1000, pylon.TimeoutHandling_ThrowException)

    if grabResult.GrabSucceeded():
        pylonDataContainer = grabResult.GetDataContainer()

        for componentIndex in range(pylonDataContainer.DataComponentCount):

            pylonDataComponent = pylonDataContainer.GetDataComponent(componentIndex)
            if pylonDataComponent.ComponentType == pylon.ComponentType_Intensity:
                intensity = pylonDataComponent.Array
                _2d_intensity = intensity.reshape(pylonDataComponent.Height, pylonDataComponent.Width)

            pylonDataComponent.Release()

    grabResult.Release()

camera.StopGrabbing()

수확기#

Harvester 설치#

명령줄에서 다음 명령을 실행하십시오:

pip3 install harvesters

Python Harvester 프로그래밍 예제#

pylon Supplementary Package for blaze 에는 Python과 Harvester를 사용하여 Blaze 카메라에 액세스하는 방법을 보여주는 몇 가지 Python 프로그래밍 예제가 포함되어 있습니다.

To open the folder containing the programming samples for blaze cameras, press the Win key, go to the Basler folder, and choose blaze Samples. A File Explorer window opens. The Python programming samples are located in the Python folder.

The Python Harvester samples are located in the /opt/pylon/share/pylon/Samples/blaze/Python/Harvester folder.

정보

샘플을 빌드하기 전에, 샘플이 들어 있는 폴더를 쓰기 권한이 있는 원하는 위치로 복사하십시오.

각 샘플마다 해당 샘플의 기능과 실행에 필요한 사항에 대한 정보를 제공하는 README.md 파일이 있습니다.

Linux

pylon Software Suite 와 pylon Supplementary Package for blaze 를 /opt/pylon 이외의 위치에 설치한 경우, Harvester가 Blaze 카메라용 GenTL 프로듀서를 불러올 경로를 수정해야 합니다.

샘플 코드에서 다음이 나타나는 부분을 찾아보세요. /opt/pylon/lib/gentlproducer/gtl 그리고 경로를 조정합니다.

Harvester를 사용하여 Blaze 카메라에 접속하기#

Harvester를 사용하여 사용 가능한 모든 블레이즈 카메라를 찾으려면 다음 단계를 따르세요:

  1. Harvester 모듈을 가져옵니다.
    from harvesters.core import Harvester
    
  2. Harvester 객체를 생성합니다.
    h = Harvester()
    
  3. Blaze 카메라용 GenTL 프로듀서를 불러옵니다.

    h.add_file(r"C:\Program Files\Basler\pylon\Runtime\x64\ProducerBaslerBlazePylon.cti")
    
    h.add_file("/opt/pylon/lib/gentlproducer/gtl/ProducerBaslerBlazePylon.cti")
    
  4. 사용 가능한 장치 목록을 업데이트하세요.

    h.update()
    

  5. 사용 가능한 기기에 대한 정보를 확인하세요.
    h.device_info_list
    

카메라에 연결하려면 다음을 사용하십시오. h.create() 함수와 함께 직접 사용할 수 있습니다.

다음 명령은 사용 가능한 첫 번째 화재 감시 카메라에 연결합니다:

ia = h.create(0)

특정 카메라를 열려면, 다음을 통해 제공되는 속성을 사용하여 해당 카메라를 지정할 수 있습니다. device_info_list Harvester 클래스 객체의 속성입니다.

예:

ia = h.create(serial_number='9032635')

지정자는 열려는 장치를 고유하게 식별해야 한다는 점에 유의하십시오. 기준에 부합하는 카메라가 두 대 이상인 경우, 어떤 장치도 열 수 없습니다.

카메라 연결을 끊으려면 다음 명령을 실행하십시오:

ia.destroy()

카메라 매개변수 액세스#

카메라 매개변수는 이미지 획득기의 remote_device 속성. 원격 장치의 node_map 이 속성을 통해 모든 카메라 매개변수에 접근할 수 있습니다.

예:

# Get a parameter.
operatingMode = ia.remote_device.node_map.OperatingMode.value
# Set a parameter.
ia.remote_device.node_map.OperatingMode.value = 'ShortRange'

사용 가능한 모든 카메라 매개변수 목록을 확인하려면 다음 명령을 사용하십시오:

dir(ia.remote_device.node_map)

Blaze 카메라 매개변수를 설정하고 가져오는 방법에 대한 더 많은 예제는 SimpleGrab 샘플을 참조하십시오.

데이터 수집#

정보

Harvester는 GenICam GenDC 스트리밍 형식을 지원하지 않으므로, 데이터를 수집하기 전에 항상 GenDC 스트리밍 형식을 비활성화해야 합니다. GenDC 스트리밍 형식을 비활성화하려면 다음 명령을 사용하십시오:

ia.remote_device.node_map.GenDCStreamingMode.value = "Off"

화재 감지 카메라에서 추출한 버퍼에는 여러 구성 요소가 포함될 수 있습니다. 여기에는 ‘범위(Range)’, ‘강도(Intensity)’, ‘신뢰도(Confidence)’ 구성 요소가 있습니다.

다음 코드 스니펫은 사용 가능한 모든 컴포넌트를 활성화하고, Range 컴포넌트의 픽셀 형식을 구성하여 깊이 데이터가 포인트 클라우드 형태로 제공되도록 합니다. 포인트 클라우드에서는 각 센서 픽셀에 x, y, z 좌표 3원조가 할당됩니다.

ia.remote_device.node_map.ComponentSelector.value = "Range"
ia.remote_device.node_map.ComponentEnable.value = True
ia.remote_device.node_map.PixelFormat.value = "Coord3D_ABC32f"

ia.remote_device.node_map.ComponentSelector.value = "Intensity"
ia.remote_device.node_map.ComponentEnable.value = True
ia.remote_device.node_map.PixelFormat.value = "Mono16"

ia.remote_device.node_map.ComponentSelector.value = "Confidence"
ia.remote_device.node_map.ComponentEnable.value = True
ia.remote_device.node_map.PixelFormat.value = "Confidence16"

포인트 클라우드 대신 깊이 맵을 사용하려면 Range 컴포넌트를 다음과 같이 구성하십시오:

ia.remote_device.node_map.ComponentSelector.value = "Range"
ia.remote_device.node_map.ComponentEnable.value = True
ia.remote_device.node_map.PixelFormat.value = "Coord3D_C16"

데이터 수집을 시작하려면 이미지 수집기의 start() 함수:

ia.start()

일반적인 그랩 루프는 다음과 같습니다:

ia.start()
while True:
    with ia.fetch() as buffer:
        # Do something with the buffer.
ia.stop()

정보

버퍼는 오직 ~ 내부에서만 유효합니다. with 문장 내에서 생성되며, 해당 범위를 벗어나면 소멸됩니다. 이 범위를 벗어나서 버퍼를 사용하려면 with 범위의 경우, 다음을 사용해야 합니다. np.copy() 심층 복사를 수행하기 위해.

다음 코드 예제는 버퍼의 구성 요소에 접근하는 방법을 보여줍니다:

with ia.fetch() as buffer:
      depth = buffer.payload.components[0]
      intensity = buffer.payload.components[1]
      confidence = buffer.payload.components[2]

Harvester는 구성 요소들을 1차원 NumPy 배열로 반환합니다.

추가 처리를 위해 1차원 배열을 2차원 또는 3차원 배열로 변환하는 것이 편리할 수 있습니다:

depth_arr = depth.data.reshape(pointcloud.height, pointcloud.width,
                              int(pointcloud.num_components_per_pixel))

intenstiy_arr = intensity.data.reshape(intensity.height, intensity.width)

confidence_arr = confidence.data.reshape(confidence.height, confidence.width)

num_components_per_pixel 이는 Range 컴포넌트의 픽셀 형식에 따라 달라집니다. 픽셀 형식이 Coord3D_ABC32f, Range 컴포넌트는 포인트 클라우드로 표현되며, 즉 각 픽셀마다 3개의 부동소수점 값이 있습니다. 그 결과, 각 픽셀의 x, y, z 좌표를 저장하는 3차원 배열이 생성됩니다.

픽셀 형식이 다음과 같다면 Coord3D_C16, Range 컴포넌트는 16비트 그레이스케일 이미지로 표현되며, 즉 각 픽셀마다 하나의 16비트 정수 값이 할당됩니다.

뎁스 맵의 회색조 값을 mm로 변환하는 방법에 대한 자세한 내용은 ‘측정 결과 처리’ 항목을 참조하십시오.

데이터 가져오기가 끝나면 다음을 호출하십시오. stop() 함수:

ia.stop()

위에서 보여준 그랩 루프를 구현하는 대신, Harvester는 그랩 루프를 구현하고 콜백을 통해 애플리케이션에 알리는 백그라운드 스레드를 제공할 수 있습니다. 이 접근 방식은 SimpleGrab_Callback 샘플에서 확인할 수 있습니다.

애플리케이션 디버깅 및 GigE Vision 하트비트 제어#

blaze 카메라와 같은 GigE Vision 카메라는 애플리케이션이 정기적으로 특수한 네트워크 패킷을 카메라로 전송하여 주기적으로 카메라에 접속해야 합니다. 카메라가 이러한 하트비트 신호를 수신하지 못하면 연결이 끊어진 것으로 간주하고, 더 이상 애플리케이션의 명령을 수락하지 않습니다.

애플리케이션을 실행하면, Blaze 카메라용 GenTL 프로듀서가 일반적으로 이러한 하트비트를 생성합니다. 애플리케이션에 중단점을 설정하고 해당 중단점에 도달하면, 디버거는 하트비트를 전송하는 스레드를 포함한 모든 스레드의 실행을 일시 중지합니다. 따라서 애플리케이션을 디버깅하며 코드를 한 단계씩 실행할 때는 카메라로 하트비트가 전송되지 않습니다. 그 결과, 카메라는 하트비트 타임아웃을 감지하고 연결을 종료합니다. 하트비트 타임아웃의 기본값은 3000 ms입니다.

이 문제를 해결하려면 개발 단계에서 하트비트 타임아웃을 늘려야 합니다. 이를 위해 다음과 같은 이름의 환경 변수를 설정하면 됩니다. GEV_HEARTBEAT_TIMEOUT 그리고 원하는 타임아웃을 밀리초 단위로 지정합니다.

또는 다음과 같이 애플리케이션에서 하트비트 타임아웃을 설정할 수도 있습니다:

ia.device.node_map.HeartbeatTimeout.value=600000

정보

하트비트 타임아웃을 높은 값으로 설정하고, 장치를 올바르게 종료하지 않은 상태에서 애플리케이션을 중지하면 카메라를 다시 열 수 없으며, ‘장치가 현재 사용 중입니다’라는 오류 메시지가 표시됩니다. 이는 디버거를 사용하여 애플리케이션을 중지하거나 애플리케이션이 예기치 않게 종료될 때 발생할 수 있습니다. 카메라를 다시 열려면 타임아웃 시간이 경과할 때까지 기다리거나 카메라에서 네트워크 케이블을 분리해야 합니다.