image --- visi mesin

Modul image adalah inti dari tumpukan visi mesin OpenMV. Modul ini mengekspos kelas Image -- buffer piksel dalam memori yang menjadi tempat beroperasinya setiap rutinitas gambar, penyaringan, transformasi, dan ekstraksi fitur -- bersama dengan objek hasil pendukung yang dikembalikan oleh rutinitas tersebut (Blob, Line, Circle, Rect, QRCode, AprilTag, DataMatrix, BarCode, ...) dan kelas pembantu yang digunakan untuk mengkonfigurasinya (Threshold, Histogram, Statistics, HaarCascade, Similarity, Percentile, Displacement, ImageIO).

Mendapatkan Citra

Ada empat cara untuk mendapatkan Image ke dalam RAM:

  • Tangkapan langsung dari sensor kamera. Panggil csi.CSI.snapshot() untuk menangkap bingkai berikutnya langsung ke dalam buffer bingkai; Image yang dikembalikan merujuk ke buffer tersebut.

  • Dari sebuah berkas. Berikan path ke konstruktor Image (image.Image("/sd/photo.jpg")); format pada disk yang didukung adalah BMP, PPM/PGM, JPEG, PNG, dan format perekaman OpenMV ImageIO.

  • Dari ndarray. Berikan ndarray bertipe float32 berukuran (h, w) atau (h, w, 3) ke konstruktor Image. Piksel diskalakan dari 0.0 -- 255.0 menjadi citra GRAYSCALE atau RGB565. Gunakan ini untuk membawa keluaran tensor dari ml (atau pipeline ulab apapun) kembali menjadi citra yang dapat digambar.

  • Buffer kosong. Buat Image dengan ukuran dan format piksel tertentu (image.Image(320, 240, image.RGB565)) untuk digambar dari awal, atau digunakan sebagai permukaan sementara untuk aritmatika citra.

Format piksel

Setiap Image memiliki salah satu format piksel berikut; pilihan ini mengorbankan memori, biaya pemrosesan, dan algoritma apa yang dapat berjalan di atasnya. Gunakan BINARY, GRAYSCALE, RGB565, BAYER, YUV422, JPEG, atau PNG sebagai argumen pixformat saat membuat citra atau mengkonfigurasi sensor kamera:

  • BINARY (1 bpp) -- satu bit per piksel. Format paling kecil; digunakan secara internal oleh rutinitas ambang batas dan morfologi tetapi jarang ditangkap langsung dari sensor.

  • GRAYSCALE (8 bpp) -- satu byte per piksel (kanal Y dari YUV422). Format tercepat untuk sebagian besar algoritma computer vision (AprilTag, deteksi tepi, optical flow).

  • RGB565 (16 bpp) -- dua byte per piksel, merah 5-bit / hijau 6-bit / biru 5-bit. Format warna default.

  • BAYER (8 bpp) -- data warna pola Bayer mentah langsung dari sensor. Berguna untuk de-mosaicing kustom atau untuk menyimpan lebih banyak piksel dalam memori yang lebih sedikit sebelum melakukan debayering sesuai kebutuhan.

  • YUV422 (16 bpp) -- warna dengan chroma-subsampling 4:2:2, dua byte per piksel. Berguna ketika Anda menginginkan algoritma khusus kroma tanpa membayar biaya penuh RGB.

  • JPEG / PNG -- buffer terkompresi. Paling baik untuk penyimpanan dan transmisi jaringan. Operasi tingkat piksel memerlukan Image.to_grayscale() atau Image.to_rgb565() terlebih dahulu.

Bekerja dengan hasil

Metode deteksi / ekstraksi fitur pada Image mengembalikan objek yang dapat Anda iterasi dan gabungkan -- panggilan Image.find_blobs() mengembalikan daftar Blob, panggilan Image.find_apriltags() mengembalikan daftar AprilTag, dll. Setiap kelas hasil mengekspos properti geometris dari deteksi (centroid, kotak pembatas, area, nilai kode, dll.) sehingga Anda dapat bertindak langsung atau meneruskannya kembali ke metode penggambaran (Image.draw_rectangle(), Image.draw_string(), ...).

Pembantu ruang warna

Modul ini juga mengekspos fungsi murni kecil untuk mengkonversi nilai piksel individual antara ruang warna binary / skala abu-abu / RGB / LAB / YUV. Ini berguna ketika Anda perlu mengkonversi nilai ambang batas atau entri palet di Python sebelum meneruskannya ke operasi citra -- untuk konversi citra penuh gunakan metode to_* dari kelas Image, yang jauh lebih cepat daripada memanggil pembantu ini dalam sebuah loop.

Kelas

Fungsi

Pembantu konversi ruang warna

Setiap fungsi X_to_Y di bawah ini melakukan konversi nilai piksel tunggal. Semuanya mengambil/mengembalikan nilai dalam rentang kanonik OpenMV:

  • binary -- int 0 -- 1.

  • grayscale -- int 0 -- 255.

  • RGB -- tupel (r, g, b) dari bilangan bulat 8-bit (masing-masing 0 -- 255).

  • LAB -- tupel (l, a, b) dengan L dalam 0 -- 100 dan A/B dalam -128 -- 127.

  • YUV -- tupel (y, u, v) dengan Y dalam 0 -- 255 dan U/V dalam -128 -- 127.

Untuk konversi citra penuh gunakan metode to_* dari kelas Image, yang jauh lebih cepat daripada memanggil pembantu ini dalam sebuah loop.

image.binary_to_grayscale(value: int) int

Konversi nilai binary ke nilai skala abu-abu.

image.binary_to_rgb(value: int) Tuple[int, int, int]

Konversi nilai binary ke tupel RGB.

image.binary_to_lab(value: int) Tuple[int, int, int]

Konversi nilai binary ke tupel LAB.

image.binary_to_yuv(value: int) Tuple[int, int, int]

Konversi nilai binary ke tupel YUV.

image.grayscale_to_binary(value: int) int

Konversi nilai skala abu-abu ke nilai binary.

image.grayscale_to_rgb(value: int) Tuple[int, int, int]

Konversi nilai skala abu-abu ke tupel RGB.

image.grayscale_to_lab(value: int) Tuple[int, int, int]

Konversi nilai skala abu-abu ke tupel LAB.

image.grayscale_to_yuv(value: int) Tuple[int, int, int]

Konversi nilai skala abu-abu ke tupel YUV.

image.rgb_to_binary(value: Tuple[int, int, int]) int

Konversi tupel RGB ke nilai binary.

image.rgb_to_grayscale(value: Tuple[int, int, int]) int

Konversi tupel RGB ke nilai skala abu-abu.

image.rgb_to_lab(value: Tuple[int, int, int]) Tuple[int, int, int]

Konversi tupel RGB ke tupel LAB.

image.rgb_to_yuv(value: Tuple[int, int, int]) Tuple[int, int, int]

Konversi tupel RGB ke tupel YUV.

image.lab_to_binary(value: Tuple[int, int, int]) int

Konversi tupel LAB ke nilai binary.

image.lab_to_grayscale(value: Tuple[int, int, int]) int

Konversi tupel LAB ke nilai skala abu-abu.

image.lab_to_rgb(value: Tuple[int, int, int]) Tuple[int, int, int]

Konversi tupel LAB ke tupel RGB.

image.lab_to_yuv(value: Tuple[int, int, int]) Tuple[int, int, int]

Konversi tupel LAB ke tupel YUV.

image.yuv_to_binary(value: Tuple[int, int, int]) int

Konversi tupel YUV ke nilai binary.

image.yuv_to_grayscale(value: Tuple[int, int, int]) int

Konversi tupel YUV ke nilai skala abu-abu.

image.yuv_to_rgb(value: Tuple[int, int, int]) Tuple[int, int, int]

Konversi tupel YUV ke tupel RGB.

image.yuv_to_lab(value: Tuple[int, int, int]) Tuple[int, int, int]

Konversi tupel YUV ke tupel LAB.

Deskriptor fitur

image.HaarCascade(path: str, stages: int = -1) Cascade

Muat Haar Cascade dan kembalikan handle Cascade untuk digunakan dengan Image.find_features().

path dapat berupa:

  • string literal "frontalface" atau "eye" untuk memuat salah satu dari dua cascade yang dimasukkan ke dalam ROM firmware, atau

  • path filesystem ke berkas biner .cascade kustom yang dihasilkan oleh alat pengkonversi cascade OpenMV.

stages memilih berapa banyak tahap cascade yang akan dievaluasi saat deteksi. -1 menggunakan setiap tahap yang tersimpan dalam berkas. Mengurangi nilai ini mempercepat deteksi dengan mengorbankan lebih banyak positif palsu.

image.load_descriptor(path: str) kp_desc | lbp_desc

Muat deskriptor dari berkas di path dan kembalikan. Tag tipe internal berkas memilih kelas deskriptor mana yang direkonstruksi:

image.save_descriptor(descriptor: kp_desc | lbp_desc, path: str) None

Serialisasi descriptor (titik kunci ORB atau deskriptor LBP) ke berkas di path dalam format berkas deskriptor OpenMV. Berkas yang sama dapat dimuat ulang nanti melalui image.load_descriptor().

image.match_descriptor(descriptor0, descriptor1, threshold: int = 85, filter_outliers: bool = False) int | kptmatch

Cocokkan dua deskriptor dengan tipe yang sama.

  • Untuk dua deskriptor LBP -- mengembalikan jarak Hamming integer antara keduanya (lebih rendah berarti kecocokan lebih dekat).

  • Untuk dua deskriptor titik kunci ORB -- mengembalikan kptmatch yang mendeskripsikan kluster titik kunci yang cocok, atau None jika tidak ada kecocokan yang melewati threshold.

threshold (0 -- 100) mengatur seberapa ketat pencocokan ORB saat menerima pasangan titik kunci. Nilai lebih rendah memperketat pencocokan dengan menolak kecocokan tetangga terdekat yang lemah.

filter_outliers mengaktifkan penolakan outlier bergaya RANSAC di seluruh set titik kunci yang cocok. Gunakan ketika Anda mengharapkan satu transformasi kaku antara dua tampilan; nonaktifkan ketika titik kunci yang cocok mencakup beberapa objek.

Pembantu geometri blob

Pembantu ini mengambil Blob (seperti yang dikembalikan oleh Image.find_blobs()) dan menghitung properti geometris tambahan sesuai kebutuhan. Mereka berada di lingkup modul -- bukan di Blob -- sehingga path find_blobs() dasar tidak membayar untuk mereka kecuali Anda memintanya.

image.get_solidity(blob: blob) float

Kembalikan soliditas (blob.pixels / convex_hull_area) dari blob. Float, 0 -- 1; 1.0 berarti blob sepenuhnya mengisi convex hull-nya.

image.get_convexity(blob: blob) float

Kembalikan konveksitas (convex_hull_perimeter / blob.perimeter) dari blob. Float, 0 -- 1; 1.0 adalah blob yang sempurna cembung.

image.get_major_axis_line(blob: blob) line

Kembalikan Line sepanjang sumbu utama dari blob (yang lebih panjang dari dua sumbu utama persegi panjang berputar dengan area minimum).

image.get_minor_axis_line(blob: blob) line

Kembalikan Line sepanjang sumbu minor dari blob (yang lebih pendek dari dua sumbu utama persegi panjang berputar dengan area minimum).

image.get_enclosing_circle(blob: blob) circle

Kembalikan Circle yang mengelilingi blob.

image.get_enclosed_ellipse(blob: blob) Tuple[int, int, int, int, int]

Kembalikan 5-tupel (cx, cy, a, b, rotation) yang mendeskripsikan elips yang dituliskan dalam persegi panjang berputar dengan area minimum di sekitar blob:

  • cx / cy -- pusat elips dalam piksel (integer).

  • a / b -- panjang semi-sumbu dalam piksel (integer).

  • rotation -- rotasi elips dalam derajat (integer).

Ini adalah tupel biasa, bukan attrtuple, sehingga field hanya dapat diakses melalui indeks.

Konstanta

Format piksel

Berikan salah satu dari berikut ini sebagai argumen pixformat ke konstruktor Image atau ke csi.CSI.pixformat().

image.BINARY: int

Bitmap 1-bit-per-piksel. Format terkecil -- digunakan secara internal oleh ambang batas dan morfologi, jarang ditangkap langsung dari sensor.

image.GRAYSCALE: int

Skala abu-abu 8-bit-per-piksel (satu byte per piksel). Format tercepat untuk sebagian besar algoritma computer vision (AprilTag, deteksi tepi, optical flow).

image.RGB565: int

Warna 16-bit-per-piksel yang dikemas sebagai 5 bit merah / 6 bit hijau / 5 bit biru. Format warna default.

image.BAYER: int

Data Bayer mentah 8-bit-per-piksel langsung dari sensor. Sebagian besar metode pemrosesan citra tidak tersedia pada citra Bayer; gunakan ini ketika Anda ingin melakukan debayering sesuai kebutuhan atau menyimpan lebih banyak piksel dalam memori yang lebih sedikit.

image.YUV422: int

Warna dengan chroma-subsampling 4:2:2, dua byte per piksel, dikemas sebagai Y1, U, Y2, V per pasangan piksel. Hanya beberapa metode pemrosesan citra yang bekerja langsung pada YUV422.

image.JPEG: int

Buffer JPEG terkompresi. Operasi tingkat piksel memerlukan Image.to_grayscale() atau Image.to_rgb565() terlebih dahulu.

image.PNG: int

Buffer PNG terkompresi. Operasi tingkat piksel memerlukan Image.to_grayscale() atau Image.to_rgb565() terlebih dahulu.

Palet warna

Berikan salah satu dari berikut ini ke Image.to_rainbow(), Image.to_ironbow(), Image.draw_image() (color_palette=) atau ke csi.CSI.color_palette() untuk mewarnai citra skala abu-abu.

image.PALETTE_RAINBOW: int

Roda warna pelangi yang halus. Palet OpenMV default untuk citra termal.

image.PALETTE_IRONBOW: int

Palet "ironbow" non-linear yang meniru tampilan viewfinder termal FLIR Lepton.

image.PALETTE_DEPTH: int

Palet citra kedalaman. Hanya tersedia pada build dengan dukungan sensor kedalaman (pipeline ToF -- misalnya OpenMV Cam AE3 atau kamera apapun dengan ToF Pmod yang terpasang).

image.PALETTE_EVT_DARK: int

Palet untuk memvisualisasikan bingkai kamera event GENX320 pada latar belakang gelap. Berikan ke csi.CSI.color_palette agar driver GENX320 memancarkan bingkai RGB565 yang diwarnai dalam mode histogram, atau ke Image.draw_image() color_palette= saat mewarnai citra event skala abu-abu.

Hanya tersedia pada build dengan dukungan GENX320 (OpenMV Cam AE3 dan GENX320 Pmod).

image.PALETTE_EVT_LIGHT: int

Palet untuk memvisualisasikan bingkai kamera event GENX320 pada latar belakang terang. Dispatch dan ketersediaan yang sama dengan PALETTE_EVT_DARK.

Mode penskalaan

Berikan salah satu dari berikut ini sebagai argumen hint ke Image.draw_image(), Image.scale(), atau metode penskalaan serupa.

image.AREA: int

Skaler rata-rata area. Digunakan saat downscaling; Nearest-Neighbor digunakan untuk upscaling.

image.BILINEAR: int

Skaler bilinear. Melakukan subsampel saat downscaling.

image.BICUBIC: int

Skaler bicubic. Kualitas lebih tinggi dari BILINEAR tetapi lebih lambat. Melakukan subsampel saat downscaling.

Petunjuk menggambar / draw_image

Bit-OR semua dari berikut ini bersama-sama dan berikan sebagai argumen hint dari Image.draw_image().

image.VFLIP: int

Balik sumber secara vertikal saat menggambar.

image.HMIRROR: int

Cerminkan sumber secara horizontal saat menggambar.

image.TRANSPOSE: int

Transposisikan (tukar x/y) sumber saat menggambar.

image.CENTER: int

Pusatkan sumber pada destinasi. Offset x/y eksplisit kemudian menjadi offset dari pusat alih-alih dari kiri atas.

image.EXTRACT_RGB_CHANNEL_FIRST: int

Saat mengekstrak kanal RGB melalui Image.draw_image(), ekstrak kanal sebelum penskalaan. Tanpa petunjuk ini, kanal diekstrak setelah penskalaan.

image.APPLY_COLOR_PALETTE_FIRST: int

Saat menerapkan palet warna melalui Image.draw_image(), terapkan palet sebelum penskalaan. Tanpa petunjuk ini, palet diterapkan setelah penskalaan.

image.SCALE_ASPECT_KEEP: int

Skalakan sumber agar sesuai di dalam destinasi sambil mempertahankan rasio aspek (letterboxes ketika rasio berbeda).

image.SCALE_ASPECT_EXPAND: int

Skalakan sumber untuk mengisi destinasi sambil mempertahankan rasio aspek (memangkas ketika rasio berbeda).

image.SCALE_ASPECT_IGNORE: int

Skalakan sumber untuk mengisi destinasi, mengabaikan rasio aspek.

image.BLACK_BACKGROUND: int

Beritahu path alpha-blending bahwa destinasi diketahui hitam sehingga dapat melewati pembacaan balik piksel destinasi. Mempercepat efek alpha pada buffer yang baru saja dibersihkan.

image.ROTATE_90: int

Pintasan untuk VFLIP | TRANSPOSE (putar 90 derajat searah jarum jam).

image.ROTATE_180: int

Pintasan untuk HMIRROR | VFLIP (putar 180 derajat).

image.ROTATE_270: int

Pintasan untuk HMIRROR | TRANSPOSE (putar 270 derajat searah jarum jam).

Subsampling JPEG

Berikan salah satu dari berikut ini sebagai argumen subsampling ke Image.to_jpeg(), Image.compress(), atau Image.save() saat menulis JPEG.

image.JPEG_SUBSAMPLING_AUTO: int

Pilih chroma subsampling secara otomatis berdasarkan pengaturan kualitas JPEG.

image.JPEG_SUBSAMPLING_444: int

Paksa chroma subsampling 4:4:4 (tanpa kompresi kroma).

image.JPEG_SUBSAMPLING_422: int

Paksa chroma subsampling 4:2:2. Direkomendasikan saat streaming MJPEG ke pemutar video pihak ketiga yang berperilaku buruk dengan 4:2:0.

image.JPEG_SUBSAMPLING_420: int

Paksa chroma subsampling 4:2:0.

Pencocokan template

Berikan salah satu dari berikut ini sebagai argumen search ke Image.find_template().

image.SEARCH_EX: int

Pencarian menyeluruh -- mengevaluasi setiap posisi dalam ROI. Paling lambat tetapi dijamin menemukan kecocokan terbaik.

image.SEARCH_DS: int

Pencarian diamond -- pencarian kasar-ke-halus yang jauh lebih cepat dari SEARCH_EX tetapi mungkin melewatkan optimum global pada template yang sangat mirip diri.

Deteksi tepi

Berikan salah satu dari berikut ini sebagai argumen algorithm ke Image.find_edges().

image.EDGE_CANNY: int

Detektor tepi Canny -- magnitudo gradien + penekanan non-maks + histeresis. Kualitas lebih tinggi, lebih lambat.

image.EDGE_SIMPLE: int

Detektor tepi filter high-pass dengan ambang batas. Lebih cepat tetapi menghasilkan tepi yang lebih tebal dan lebih berisik daripada EDGE_CANNY.

Detektor sudut ORB

Berikan salah satu dari berikut ini sebagai argumen corner_detector ke Image.find_keypoints().

image.CORNER_FAST: int

Detektor sudut FAST. Lebih cepat dari CORNER_AGAST tetapi kurang akurat.

image.CORNER_AGAST: int

Detektor sudut AGAST. Lebih lambat dari CORNER_FAST tetapi menghasilkan titik kunci yang lebih stabil.

Keluarga AprilTag

Bit-OR kombinasi apapun dari berikut ini dan berikan sebagai argumen families ke Image.find_apriltags(). Setiap keluarga dibatasi oleh opsi build-nya sendiri di firmware; keluarga yang tidak didukung tidak ada pada runtime daripada selalu bernilai nol.

image.TAG16H5: int

Keluarga AprilTag 16h5 (30 ID unik, koreksi kesalahan 0-bit).

image.TAG25H9: int

Keluarga AprilTag 25h9 (35 ID unik, koreksi kesalahan hingga 3-bit).

image.TAG36H10: int

Keluarga AprilTag 36h10 (2320 ID unik, koreksi kesalahan hingga 3-bit).

image.TAG36H11: int

Keluarga AprilTag 36h11 (587 ID unik, koreksi kesalahan hingga 4-bit). Keluarga yang paling umum.

image.TAGCIRCLE21H7: int

Keluarga AprilTag Circle21h7.

image.TAGCIRCLE49H12: int

Keluarga AprilTag Circle49h12.

image.TAGCUSTOM48H12: int

Keluarga AprilTag Custom48h12.

image.TAGSTANDARD41H12: int

Keluarga AprilTag Standard41h12.

image.TAGSTANDARD52H13: int

Keluarga AprilTag Standard52h13.

Simbologi barcode

Nilai yang dilaporkan dalam BarCode.type untuk entri yang dikembalikan oleh Image.find_barcodes().

image.EAN2: int

Barcode suplemen EAN-2.

image.EAN5: int

Barcode suplemen EAN-5.

image.EAN8: int

Barcode EAN-8.

image.UPCE: int

Barcode UPC-E.

image.ISBN10: int

Barcode ISBN-10.

image.UPCA: int

Barcode UPC-A.

image.EAN13: int

Barcode EAN-13.

image.ISBN13: int

Barcode ISBN-13.

image.I25: int

Barcode Interleaved 2-of-5.

image.DATABAR: int

Barcode GS1 DataBar.

image.DATABAR_EXP: int

Barcode GS1 DataBar Expanded.

image.CODABAR: int

Barcode Codabar.

image.CODE39: int

Barcode Code 39.

image.PDF417: int

Barcode 2D bertumpuk PDF417. Konstanta ini ada untuk kelengkapan, tetapi decoder barcode saat ini tidak mengimplementasikan PDF417 -- Image.find_barcodes() tidak akan mengembalikan deteksi tipe ini.

image.CODE93: int

Barcode Code 93.

image.CODE128: int

Barcode Code 128.