class ImageIO -- Đối tượng ImageIO

Lớp ImageIO ghi và phát lại các luồng khung hình Image theo định dạng lưu trữ gốc của OpenMV. Một luồng có thể chứa các khung hình không đồng nhất (định dạng điểm ảnh / kích thước khác nhau) và ghi lại khoảng thời gian giữa các khung hình để phát lại tái tạo tốc độ khung hình gốc.

Có hai loại bộ lưu trữ:

  • Luồng file -- các khung hình được đọc từ / ghi thêm vào một file trên hệ thống tập tin. File bắt đầu với tiêu đề ma thuật 16 byte OMV IMG STR Vx.y theo sau là các khối dữ liệu theo từng khung hình. Phiên bản ghi hiện tại tạo ra V2.0; các file cũ V1.0V1.1 vẫn có thể đọc được.

  • Luồng bộ nhớ -- các khung hình được đọc từ / ghi vào một bộ đệm RAM có kích thước cố định được cấp phát tại thời điểm khởi tạo. Hữu ích để xử lý các khung hình qua các bộ lọc cần ghi lại mà không cần truy cập hệ thống tập tin.

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

Tạo một luồng ImageIO.

Nếu path là một chuỗi ký tự, một luồng file được mở tại đường dẫn đó. mode phải là một trong các giá trị sau:

  • 'r' -- mở file hiện có để đọc. Tiêu đề ma thuật được xác thực và phiên bản (V1.0 / V1.1 / V2.0) được ghi lại để sử dụng bởi version().

  • 'w' -- xóa / tạo file và ghi một tiêu đề ma thuật V2.0 mới. Các khung hình được ghi thêm vào mỗi lần gọi write().

Nếu path là một 3-tuple (w, h, pixformat), một luồng bộ nhớ được cấp phát. mode khi đó là số nguyên số lượng slot khung hình cần cấp phát trước. Bộ đệm được định kích thước cho count khung hình theo (w, h, pixformat)không được phép mở rộng sau khi tạo. pixformat là một trong các giá trị: image.BINARY, image.GRAYSCALE, image.RGB565, image.BAYER, image.YUV422, image.JPEG, hoặc image.PNG. Đối với các định dạng nén (image.JPEG, image.PNG), kích thước mỗi slot được ước tính là 2 bpp; các khung hình lớn hơn mức ước tính sẽ gây ra ValueError khi gọi write().

Kiểm tra

type() int

Trả về loại bộ lưu trữ của luồng: FILE_STREAM cho luồng file, MEMORY_STREAM cho luồng bộ nhớ.

is_closed() bool

Trả về True nếu close() đã được gọi trên đối tượng này. Sau khi đóng, luồng sẽ gây ra OSError("Stream closed") khi thực hiện bất kỳ thao tác đọc/ghi/tìm kiếm nào tiếp theo.

count() int

Trả về số lượng khung hình hiện được lưu trữ trong luồng. Đối với luồng file, con số này tăng khi write() ghi thêm khung hình; đối với luồng bộ nhớ, giá trị này cố định từ thời điểm khởi tạo.

offset() int

Trả về chỉ mục khung hình hiện tại. Được tăng lên bởi read()write(), được đặt lại bởi seek().

version() int | None

Trả về phiên bản định dạng lưu trữ cho luồng file (10 cho V1.0, 11 cho V1.1, 20 cho V2.0). Trả về None cho luồng bộ nhớ.

buffer_size() int | None

Trả về kích thước bộ đệm điểm ảnh của mỗi slot theo byte cho luồng bộ nhớ (kích thước slot trừ đi tiêu đề nội bộ của Image). Trả về None cho luồng file. Sử dụng kết hợp với count() để kiểm tra liệu một kích thước khung hình cụ thể có phù hợp không.

size() int

Trả về tổng số byte mà luồng chiếm dụng -- kích thước file trên đĩa cho luồng file, hoặc toàn bộ kích thước bộ đệm RAM (count * per_slot_size bao gồm tiêu đề của mỗi slot) cho luồng bộ nhớ.

I/O

write(img: Image) ImageIO

Ghi thêm (luồng file) hoặc lưu tại vị trí offset (luồng bộ nhớ) img và tăng offset() lên một.

Đối với luồng file, file sẽ tăng kích thước khi ghi thêm khung hình. Ghi tại vị trí không phải cuối file sẽ cắt bỏ phần còn lại nên số lượng có thể giảm.

Đối với luồng bộ nhớ, khung hình được ghi vào slot hiện tại; ghi vượt quá slot cuối cùng sẽ gây ra EOFError("End of stream") và ghi một khung hình lớn hơn buffer_size() sẽ gây ra ValueError("Invalid frame size").

Trả về self để có thể gọi nối tiếp.

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

Đọc khung hình tại offset() hiện tại, tăng offset, và trả về Image mới. Tương ứng với nửa phát lại của write().

copy_to_fb -- khi True (mặc định) khung hình đã giải mã được đặt vào bộ đệm khung hình camera (cùng vị trí mà csi.CSI.snapshot() lưu kết quả), giúp Image trả về có thể hiển thị qua giao diện xem trước của IDE. Khi False khung hình được cấp phát trên heap MicroPython.

loop (chỉ dành cho luồng file) -- khi True (mặc định) việc đọc vượt quá khung hình cuối sẽ quay lại khung hình đầu tiên và tiếp tục. Khi False lệnh gọi trả về None khi đến cuối file.

pause -- khi True (mặc định) lệnh gọi sẽ chặn cho đến khi khoảng thời gian giữa các khung hình đã ghi gốc đã trôi qua, để phát lại ở tốc độ khung hình gốc. Đặt thành False để phát lại nhanh nhất có thể.

seek(offset: int) ImageIO

Di chuyển offset() đến khung hình offset. offset phải không âm; offset của luồng bộ nhớ cũng phải nhỏ hơn count().

Tìm kiếm trong luồng file sẽ duyệt file theo từng khung hình từ đầu vì các khối khung hình có kích thước biến đổi -- dự kiến thời gian O(offset) cho các bước nhảy lớn.

Trả về self để có thể gọi nối tiếp.

sync() ImageIO

Xả các thao tác ghi đang chờ xử lý ra đĩa cho luồng file (gọi sync của hệ thống tập tin bên dưới). Không có tác dụng với luồng bộ nhớ.

Trả về self để có thể gọi nối tiếp.

close() None

Đóng luồng. Giải phóng bộ đệm bộ nhớ (luồng bộ nhớ) hoặc đóng file (luồng file). Sau close() đối tượng ImageIO không thể sử dụng lại; các thao tác tiếp theo sẽ gây ra OSError("Stream closed"). Gọi close() hai lần không có tác dụng.

Một ImageIO cũng được đóng tự động khi nó bị thu gom rác (nó đăng ký một hàm hoàn tất tại thời điểm khởi tạo).

Hằng số

FILE_STREAM: int

Giá trị trả về bởi type() cho các luồng được lưu trữ bằng file.

MEMORY_STREAM: int

Giá trị trả về bởi type() cho các luồng trong bộ nhớ.