티스토리 뷰
4.1. 파이카메라 수 많은 배열로 캡처
1.11부터 picamera는 파이썬의 버퍼 프로토콜 (numpy의 ndarray 포함)을 지원하는 모든 객체에 직접 캡처 할 수 있습니다. 단순히 대상을 캡처 대상으로 지정하면 이미지 데이터가 객체에 직접 쓰여집니다. 대상 객체는 다양한 요구 사항을 충족해야합니다 (일부는 사용중인 Python 버전에 따라 다릅니다).
버퍼 객체는 쓰기 가능해야합니다 (예 : 변경 불가능한 바이트 객체로 캡처 할 수 없음).
버퍼 오브젝트는 모든 이미지 데이터를 수신 할만큼 충분히 커야합니다.
(Python 2.x에만 해당) 버퍼 객체는 1 차원이어야합니다.
(Python 2.x에만 해당) 버퍼 객체는 바이트 크기의 항목을 가져야합니다.
예를 들어, 3 차원 numpy ndarray (Python 3.x에만 해당)에 직접 캡처하려면 :
import time import picamera import numpy as np with picamera.PiCamera() as camera: camera.resolution = (320, 240) camera.framerate = 24 time.sleep(2) output = np.empty((240, 320, 3), dtype=np.uint8) camera.capture(output, 'rgb')
인코딩되지 않은 형식으로 출력 할 때 카메라가 요청 된 해상도를 반올림한다는 점도 중요합니다. 수평 해상도는 32 픽셀의 가장 가까운 배수로 반올림되며 수직 해상도는 16 픽셀의 가장 가까운 배수로 반올림됩니다. 예를 들어 요청 된 해상도가 100x100 인 경우 캡처에는 실제로 128x112 픽셀 상당의 데이터가 포함되지만 100x100을 초과하는 픽셀은 초기화되지 않습니다.
따라서 100x100 이미지를 캡처하려면 먼저 128x112 배열을 제공 한 다음 나중에 초기화되지 않은 픽셀을 제거해야합니다. 다음 예제는 이것을 보여 주며 파이썬 2.x에서 필요한 re-shaping을 보여줍니다 :
import time import picamera import numpy as np with picamera.PiCamera() as camera: camera.resolution = (100, 100) camera.framerate = 24 time.sleep(2) output = np.empty((112 * 128 * 3,), dtype=np.uint8) camera.capture(output, 'rgb') output = output.reshape((112, 128, 3)) output = output[:100, :100, :]
경고: 특정 상황 (크기가 조정되지 않고 YUV가 아닌 비디오 포트 캡처)에서 해상도는 32x16 대신 16x16 블록으로 반올림됩니다. 그에 따라 해상도 반올림을 조정하십시오.