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.