class ImageIO – ImageIO 객체

ImageIO 클래스는 OpenMV의 기본 온디스크 포맷으로 Image 프레임의 스트림을 기록하고 재생합니다. 하나의 스트림은 서로 다른 종류의 프레임(서로 다른 픽셀 포맷/크기)을 담을 수 있으며, 각 프레임의 프레임 간 간격을 기록하므로 재생 시 원래의 프레임 레이트가 그대로 재현됩니다.

두 가지 백킹 스토어가 있습니다:

  • 파일 스트림 – 프레임을 파일 시스템의 파일에서 읽거나 파일에 추가합니다. 파일은 16바이트 매직 헤더 OMV IMG STR Vx.y 로 시작하고 그 뒤에 프레임별 청크가 이어집니다. 현재 라이터는 V2.0 을 생성하며, 이전 V1.0V1.1 파일도 여전히 읽을 수 있습니다.

  • 메모리 스트림 – 프레임을 생성 시점에 할당된 고정 크기 RAM 버퍼에서 읽거나 그 버퍼에 씁니다. 파일 시스템을 건드리지 않고 기록이 필요한 필터에 프레임을 왕복시킬 때 유용합니다.

class image.ImageIO(path: str | Tuple[int, int, int], mode: str | int)

ImageIO 스트림을 생성합니다.

path문자열 이면 해당 경로에 파일 스트림이 열립니다. mode 는 다음 중 하나여야 합니다:

  • 'r' – 기존 파일을 읽기용으로 엽니다. 매직 헤더를 검증하고 버전(V1.0 / V1.1 / V2.0)을 기록하여 version() 에서 사용합니다.

  • 'w' – 파일을 잘라내거나 생성하고 새로운 V2.0 매직 헤더를 씁니다. 프레임은 각 write() 마다 추가됩니다.

path3-튜플 (w, h, pixformat) 이면 메모리 스트림이 할당됩니다. 이때 mode 는 미리 할당할 프레임 슬롯 개수 정수입니다. 버퍼는 (w, h, pixformat) 프레임 count 개에 맞게 크기가 정해지며 생성 후에는 확장할 수 없습니다. pixformatimage.BINARY, image.GRAYSCALE, image.RGB565, image.BAYER, image.YUV422, image.JPEG, image.PNG 중 하나입니다. 압축 포맷(image.JPEG, image.PNG)의 경우 슬롯당 크기가 2 bpp로 추정되며, 추정치보다 큰 프레임은 write() 시점에 ValueError 를 발생시킵니다.

조사

type() int

스트림의 백킹 스토어를 반환합니다. 파일 스트림이면 FILE_STREAM, 메모리 스트림이면 MEMORY_STREAM 입니다.

is_closed() bool

이 객체에 대해 close() 가 호출되었으면 True 를 반환합니다. 일단 닫히면 스트림은 이후의 모든 읽기/쓰기/탐색에서 OSError("Stream closed") 를 발생시킵니다.

count() int

스트림에 현재 저장된 프레임 수를 반환합니다. 파일 스트림의 경우 write() 가 프레임을 추가함에 따라 이 값이 늘어나며, 메모리 스트림의 경우 생성 시점에 고정됩니다.

offset() int

현재 프레임 인덱스를 반환합니다. read()write() 에 의해 증가하고 seek() 에 의해 재설정됩니다.

version() int | None

파일 스트림의 온디스크 포맷 버전을 반환합니다(V1.010, V1.111, V2.020). 메모리 스트림의 경우 None 을 반환합니다.

buffer_size() int | None

메모리 스트림의 슬롯당 픽셀 버퍼 크기를 바이트 단위로 반환합니다(슬롯 크기에서 내부 Image 관리 헤더를 뺀 값). 파일 스트림의 경우 None 을 반환합니다. 특정 프레임 크기가 들어갈지 확인하려면 이 값을 count() 와 함께 사용하세요.

size() int

스트림이 소비하는 전체 바이트 수를 반환합니다. 파일 스트림의 경우 디스크상의 파일 크기이고, 메모리 스트림의 경우 전체 RAM 버퍼 크기(슬롯당 헤더를 포함한 count * per_slot_size)입니다.

I/O

write(img: Image) ImageIO

img 를 추가(파일 스트림)하거나 오프셋 위치에 저장(메모리 스트림)하고 offset() 을 1만큼 진행시킵니다.

파일 스트림의 경우 프레임이 추가됨에 따라 파일이 커집니다. 끝이 아닌 오프셋에 쓰면 파일의 나머지 부분이 잘려서 카운트가 줄어들 수 있습니다.

메모리 스트림의 경우 프레임이 현재 슬롯에 기록됩니다. 마지막 슬롯을 넘어서 쓰면 EOFError("End of stream") 가 발생하고, buffer_size() 보다 큰 프레임을 쓰면 ValueError("Invalid frame size") 가 발생합니다.

호출을 연결할 수 있도록 self 를 반환합니다.

read(copy_to_fb: bool = True, *, loop: bool = True, pause: bool = True) Image | None

현재 offset() 위치의 프레임을 읽고 오프셋을 진행시킨 뒤 새 Image 를 반환합니다. write() 의 재생 측면을 그대로 반영합니다.

copy_to_fbTrue (기본값)이면 디코딩된 프레임이 카메라 프레임 버퍼(csi.CSI.snapshot() 이 도착하는 곳과 동일한 위치)에 배치되므로, 반환된 Image 를 IDE 미리보기를 통해 그릴 수 있습니다. False 이면 대신 프레임이 MicroPython 힙에 할당됩니다.

loop (파일 스트림 전용) – True (기본값)이면 마지막 프레임을 넘어 읽을 때 첫 프레임으로 되돌아가 계속 읽습니다. False 이면 파일 끝에 도달하면 호출이 None 을 반환합니다.

pauseTrue (기본값)이면 원래 기록된 프레임 간 간격이 경과할 때까지 호출이 블록되므로, 재생이 기록의 원래 프레임 레이트로 실행됩니다. 가능한 한 빠르게 재생하려면 False 로 설정하세요.

seek(offset: int) ImageIO

offset() 을 프레임 offset 으로 이동합니다. offset 은 음수가 아니어야 하며, 메모리 스트림 오프셋은 count() 보다 작아야 합니다.

프레임 청크가 가변 크기이므로 파일 스트림 탐색은 처음부터 프레임 단위로 파일을 훑습니다. 큰 점프의 경우 O(offset) 시간이 걸린다고 예상하세요.

호출을 연결할 수 있도록 self 를 반환합니다.

sync() ImageIO

파일 스트림의 경우 대기 중인 쓰기를 디스크로 플러시합니다(기반 파일 시스템의 sync 를 호출). 메모리 스트림의 경우 아무 동작도 하지 않습니다.

호출을 연결할 수 있도록 self 를 반환합니다.

close() None

스트림을 닫습니다. 메모리 버퍼를 해제(메모리 스트림)하거나 파일을 닫습니다(파일 스트림). close() 이후에는 ImageIO 객체를 재사용할 수 없으며, 이후 작업은 OSError("Stream closed") 를 발생시킵니다. close() 를 두 번 호출하는 것은 아무 동작도 하지 않습니다.

ImageIO 는 가비지 컬렉션될 때 자동으로 닫히기도 합니다(생성 시 종료자를 등록합니다).

상수

FILE_STREAM: int

파일 기반 스트림에 대해 type() 이 반환하는 값입니다.

MEMORY_STREAM: int

인메모리 스트림에 대해 type() 이 반환하는 값입니다.