image --- การมองเห็นของเครื่อง#

โมดูล image คือหัวใจของกลุ่มฟังก์ชันการมองเห็นของเครื่อง OpenMV โมดูลนี้เปิดเผยคลาส Image ซึ่งเป็นบัฟเฟอร์พิกเซลในหน่วยความจำที่ทุกฟังก์ชันวาด กรอง แปลง และดึงลักษณะเด่นทำงานด้วย รวมถึงออบเจกต์ผลลัพธ์ที่ฟังก์ชันเหล่านั้นส่งคืน (Blob, Line, Circle, Rect, QRCode, AprilTag, DataMatrix, BarCode, ...) และคลาสตัวช่วยสำหรับกำหนดค่า (Threshold, Histogram, Statistics, HaarCascade, Similarity, Percentile, Displacement, ImageIO)

การรับภาพ#

มีสี่วิธีในการโหลด Image เข้าสู่ RAM:

  • ถ่ายสดจาก camera sensor เรียก csi.CSI.snapshot() เพื่อถ่ายเฟรมถัดไปลงในบัฟเฟอร์เฟรมโดยตรง โดย Image ที่ส่งคืนจะอ้างอิงไปยังบัฟเฟอร์นั้น

  • จากไฟล์ ส่งพาธไปยังคอนสตรักเตอร์ Image (image.Image("/sd/photo.jpg")) รูปแบบไฟล์บนดิสก์ที่รองรับ ได้แก่ BMP, PPM/PGM, JPEG, PNG และรูปแบบบันทึก ImageIO ของ OpenMV

  • จาก ndarray ส่ง ndarray แบบ float32 ขนาด (h, w) หรือ (h, w, 3) ไปยังคอนสตรักเตอร์ Image พิกเซลจะถูกปรับสเกลจาก 0.0 -- 255.0 เป็นภาพ GRAYSCALE หรือ RGB565 ตามลำดับ ใช้วิธีนี้เพื่อนำผลลัพธ์ tensor จาก ml (หรือ pipeline ใดๆ ของ ulab) กลับมาเป็นภาพที่วาดได้

  • บัฟเฟอร์เปล่า สร้าง Image ด้วยขนาดและรูปแบบพิกเซลที่กำหนด (image.Image(320, 240, image.RGB565)) เพื่อวาดตั้งแต่ต้น หรือใช้เป็น scratch surface สำหรับการคำนวณภาพ

รูปแบบพิกเซล#

Image ทุกรูปมีรูปแบบพิกเซลอย่างใดอย่างหนึ่งต่อไปนี้ การเลือกรูปแบบจะแลกเปลี่ยนระหว่างหน่วยความจำ ต้นทุนการประมวลผล และอัลกอริทึมที่ใช้ได้ ใช้ BINARY, GRAYSCALE, RGB565, BAYER, YUV422, JPEG หรือ PNG เป็นอาร์กิวเมนต์ pixformat เมื่อสร้างภาพหรือกำหนดค่า camera sensor:

  • BINARY (1 bpp) -- หนึ่งบิตต่อพิกเซล รูปแบบที่เล็กที่สุด ใช้ภายในโดยฟังก์ชันการกำหนดค่าขีดแบ่งและ morphology แต่แทบไม่ได้ถ่ายจาก sensor โดยตรง

  • GRAYSCALE (8 bpp) -- หนึ่งไบต์ต่อพิกเซล (ช่อง Y ของ YUV422) รูปแบบที่เร็วที่สุดสำหรับอัลกอริทึม computer-vision ส่วนใหญ่ (AprilTag, การตรวจจับขอบ, optical flow)

  • RGB565 (16 bpp) -- สองไบต์ต่อพิกเซล สีแดง 5 บิต / สีเขียว 6 บิต / สีน้ำเงิน 5 บิต รูปแบบสีเริ่มต้น

  • BAYER (8 bpp) -- ข้อมูลสีแบบ Bayer-pattern ดิบที่มาโดยตรงจาก sensor เหมาะสำหรับการ de-mosaic แบบกำหนดเองหรือเก็บพิกเซลได้มากขึ้นในหน่วยความจำน้อยลงก่อน debayer ตามต้องการ

  • YUV422 (16 bpp) -- สีแบบ 4:2:2 chroma-subsampled สองไบต์ต่อพิกเซล เหมาะเมื่อต้องการอัลกอริทึมที่เจาะจง chroma โดยไม่เสียต้นทุนเต็มของ RGB

  • JPEG / PNG -- บัฟเฟอร์ที่บีบอัด เหมาะที่สุดสำหรับการจัดเก็บและส่งผ่านเครือข่าย การดำเนินการระดับพิกเซลต้องเรียก Image.to_grayscale() หรือ Image.to_rgb565() ก่อน

การทำงานกับผลลัพธ์#

เมธอดการตรวจจับ/ดึงลักษณะเด่นใน Image ส่งคืนออบเจกต์ที่สามารถวนซ้ำและรวมกันได้ เช่น การเรียก Image.find_blobs() ส่งคืนรายการ Blob, การเรียก Image.find_apriltags() ส่งคืนรายการ AprilTag และอื่นๆ คลาสผลลัพธ์แต่ละคลาสเปิดเผยคุณสมบัติทางเรขาคณิตของการตรวจจับ (จุดศูนย์กลาง, กรอบล้อมรอบ, พื้นที่, ค่าโค้ด ฯลฯ) เพื่อให้ดำเนินการได้โดยตรงหรือส่งกลับไปยังเมธอดวาด (Image.draw_rectangle(), Image.draw_string(), ...)

ตัวช่วยสี#

โมดูลยังเปิดเผยฟังก์ชัน pure เล็กๆ สำหรับแปลงค่าพิกเซลแต่ละค่าระหว่างพื้นที่สี binary / grayscale / RGB / LAB / YUV ฟังก์ชันเหล่านี้มีประโยชน์เมื่อต้องแปลงค่าขีดแบ่งหรือรายการ palette ใน Python ก่อนส่งเข้าสู่การดำเนินการภาพ สำหรับการแปลงทั้งภาพให้ใช้เมธอด to_* ของ Image ซึ่งเร็วกว่าการเรียกฟังก์ชันตัวช่วยเหล่านี้ในลูปมาก

คลาส#

ฟังก์ชัน#

ฟังก์ชันตัวช่วยแปลงพื้นที่สี#

ฟังก์ชัน X_to_Y แต่ละตัวด้านล่างทำการแปลงค่าพิกเซลเดียว ทั้งหมดรับ/ส่งคืนค่าในช่วงมาตรฐาน OpenMV:

  • binary -- int 0 -- 1

  • grayscale -- int 0 -- 255

  • RGB -- (r, g, b) tuple ของจำนวนเต็ม 8 บิต (แต่ละค่า 0 -- 255)

  • LAB -- (l, a, b) tuple โดย L อยู่ใน 0 -- 100 และ A/B อยู่ใน -128 -- 127

  • YUV -- (y, u, v) tuple โดย Y อยู่ใน 0 -- 255 และ U/V อยู่ใน -128 -- 127

สำหรับการแปลงทั้งภาพให้ใช้เมธอด to_* ของ Image ซึ่งเร็วกว่าการเรียกฟังก์ชันตัวช่วยเหล่านี้ในลูปมาก

image.binary_to_grayscale(value: int) int#

แปลงค่า binary เป็นค่า grayscale

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

แปลงค่า binary เป็น RGB tuple

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

แปลงค่า binary เป็น LAB tuple

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

แปลงค่า binary เป็น YUV tuple

image.grayscale_to_binary(value: int) int#

แปลงค่า grayscale เป็นค่า binary

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

แปลงค่า grayscale เป็น RGB tuple

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

แปลงค่า grayscale เป็น LAB tuple

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

แปลงค่า grayscale เป็น YUV tuple

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

แปลง RGB tuple เป็นค่า binary

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

แปลง RGB tuple เป็นค่า grayscale

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

แปลง RGB tuple เป็น LAB tuple

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

แปลง RGB tuple เป็น YUV tuple

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

แปลง LAB tuple เป็นค่า binary

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

แปลง LAB tuple เป็นค่า grayscale

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

แปลง LAB tuple เป็น RGB tuple

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

แปลง LAB tuple เป็น YUV tuple

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

แปลง YUV tuple เป็นค่า binary

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

แปลง YUV tuple เป็นค่า grayscale

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

แปลง YUV tuple เป็น RGB tuple

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

แปลง YUV tuple เป็น LAB tuple

ตัวบ่งชี้ลักษณะเด่น#

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

โหลด Haar Cascade และส่งคืนหมายเลขอ้างอิง Cascade สำหรับใช้กับ Image.find_features()

path อาจเป็น:

  • สตริงตัวอักษร "frontalface" หรือ "eye" เพื่อโหลด cascade หนึ่งในสองที่ฝังอยู่ใน firmware ROM หรือ

  • พาธในระบบไฟล์ไปยังไฟล์ไบนารี .cascade ที่สร้างด้วยเครื่องมือ cascade-converter ของ OpenMV

stages เลือกจำนวน cascade stage ที่จะประเมินเมื่อตรวจจับ -1 ใช้ทุก stage ที่เก็บอยู่ในไฟล์ การลดค่านี้จะเร่งความเร็วการตรวจจับแต่เพิ่ม false positive มากขึ้น

image.load_descriptor(path: str) kp_desc | lbp_desc#

โหลด descriptor จากไฟล์ที่ path และส่งคืน แท็กประเภทภายในของไฟล์จะเลือกว่าจะสร้าง descriptor class ใดขึ้นมาใหม่:

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

บันทึก descriptor (ORB keypoint หรือ LBP descriptor) ลงในไฟล์ที่ path ในรูปแบบไฟล์ descriptor ของ OpenMV ไฟล์เดิมสามารถโหลดใหม่ได้ภายหลังผ่าน image.load_descriptor()

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

จับคู่ descriptor สองตัวที่มีประเภทเดียวกัน

  • สำหรับ LBP descriptor สองตัว -- ส่งคืนค่าระยะ Hamming แบบจำนวนเต็มระหว่างสองตัว (ค่าน้อยกว่าหมายถึงคู่ที่ใกล้เคียงกว่า)

  • สำหรับ ORB keypoint descriptor สองตัว -- ส่งคืน kptmatch ที่อธิบาย keypoint cluster ที่จับคู่กัน หรือ None หากไม่มีคู่ที่ผ่าน threshold

threshold (0 -- 100) กำหนดความเข้มงวดในการจับคู่ ORB เมื่อยอมรับคู่ keypoint ค่าน้อยจะเพิ่มความเข้มงวดโดยปฏิเสธการจับคู่เพื่อนบ้านที่ใกล้ที่สุดที่อ่อนแอ

filter_outliers เปิดใช้งานการปฏิเสธ outlier แบบ RANSAC ในชุด keypoint ที่จับคู่กัน ใช้เมื่อคาดหวัง rigid transform เดียวระหว่างมุมมองทั้งสอง ปิดเมื่อ keypoint ที่จับคู่กันครอบคลุมหลายออบเจกต์

ตัวช่วยเรขาคณิตสำหรับ blob#

ตัวช่วยเหล่านี้รับ Blob (ที่ส่งคืนโดย Image.find_blobs()) และคำนวณคุณสมบัติทางเรขาคณิตเพิ่มเติมตามต้องการ ฟังก์ชันเหล่านี้อยู่ที่ระดับโมดูล ไม่ใช่บน Blob ดังนั้น path พื้นฐาน find_blobs() จะไม่เสียต้นทุนจากฟังก์ชันเหล่านี้ เว้นแต่จะเรียกใช้

image.get_solidity(blob: blob) float#

ส่งคืนความเป็นของแข็ง (blob.pixels / convex_hull_area) ของ blob เป็น Float ช่วง 0 -- 1 โดย 1.0 หมายความว่า blob เต็มรูปร่าง convex hull โดยสมบูรณ์

image.get_convexity(blob: blob) float#

ส่งคืนความนูน (convex_hull_perimeter / blob.perimeter) ของ blob เป็น Float ช่วง 0 -- 1 โดย 1.0 คือ blob ที่นูนอย่างสมบูรณ์

image.get_major_axis_line(blob: blob) line#

ส่งคืน Line ตามแกนหลักของ blob (แกนที่ยาวกว่าในสองแกนหลักของสี่เหลี่ยมหมุนที่มีพื้นที่น้อยที่สุด)

image.get_minor_axis_line(blob: blob) line#

ส่งคืน Line ตามแกนรองของ blob (แกนที่สั้นกว่าในสองแกนหลักของสี่เหลี่ยมหมุนที่มีพื้นที่น้อยที่สุด)

image.get_enclosing_circle(blob: blob) circle#

ส่งคืน Circle ที่ล้อมรอบ blob

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

ส่งคืน 5-tuple (cx, cy, a, b, rotation) ที่อธิบายวงรีที่บรรจุอยู่ในสี่เหลี่ยมหมุนที่มีพื้นที่น้อยที่สุดรอบ blob:

  • cx / cy -- จุดศูนย์กลางของวงรีในพิกเซล (จำนวนเต็ม)

  • a / b -- ความยาวกึ่งแกนในพิกเซล (จำนวนเต็ม)

  • rotation -- การหมุนของวงรี เป็นองศา (จำนวนเต็ง)

นี่คือ tuple ธรรมดา ไม่ใช่ attrtuple ดังนั้นสามารถเข้าถึงฟิลด์ได้โดยดัชนีเท่านั้น

ค่าคงที่#

รูปแบบพิกเซล#

ส่งค่าใดๆ ต่อไปนี้เป็นอาร์กิวเมนต์ pixformat ไปยังคอนสตรักเตอร์ Image หรือไปยัง csi.CSI.pixformat()

image.BINARY: int#

bitmap 1 บิตต่อพิกเซล รูปแบบที่เล็กที่สุด ใช้ภายในโดยการกำหนดค่าขีดแบ่งและ morphology แทบไม่ถ่ายโดยตรงจาก sensor

image.GRAYSCALE: int#

ระดับสีเทา 8 บิตต่อพิกเซล (หนึ่งไบต์ต่อพิกเซล) รูปแบบที่เร็วที่สุดสำหรับอัลกอริทึม computer-vision ส่วนใหญ่ (AprilTag, การตรวจจับขอบ, optical flow)

image.RGB565: int#

สี 16 บิตต่อพิกเซล บรรจุเป็นสีแดง 5 บิต / สีเขียว 6 บิต / สีน้ำเงิน 5 บิต รูปแบบสีเริ่มต้น

image.BAYER: int#

ข้อมูล Bayer ดิบ 8 บิตต่อพิกเซลที่มาโดยตรงจาก sensor เมธอดการประมวลผลภาพส่วนใหญ่ไม่สามารถใช้กับภาพ Bayer ได้ ใช้รูปแบบนี้เมื่อต้องการ debayer ตามต้องการหรือเก็บพิกเซลได้มากขึ้นในหน่วยความจำน้อยลง

image.YUV422: int#

สีแบบ 4:2:2 chroma-subsampled สองไบต์ต่อพิกเซล บรรจุเป็น Y1, U, Y2, V ต่อคู่พิกเซล มีเพียงบางเมธอดการประมวลผลภาพที่ทำงานโดยตรงบน YUV422

image.JPEG: int#

บัฟเฟอร์ JPEG ที่บีบอัด การดำเนินการระดับพิกเซลต้องเรียก Image.to_grayscale() หรือ Image.to_rgb565() ก่อน

image.PNG: int#

บัฟเฟอร์ PNG ที่บีบอัด การดำเนินการระดับพิกเซลต้องเรียก Image.to_grayscale() หรือ Image.to_rgb565() ก่อน

Color palettes#

ส่งค่าใดๆ ต่อไปนี้ไปยัง Image.to_rainbow(), Image.to_ironbow(), Image.draw_image() (color_palette=) หรือไปยัง csi.CSI.color_palette() เพื่อใส่สีให้กับภาพระดับสีเทา

image.PALETTE_RAINBOW: int#

วงล้อสีรุ้งที่นุ่มนวล palette เริ่มต้นของ OpenMV สำหรับภาพความร้อน

image.PALETTE_IRONBOW: int#

palette "ironbow" แบบไม่เชิงเส้นที่เลียนแบบลักษณะของช่องมองภาพความร้อน FLIR Lepton

image.PALETTE_DEPTH: int#

palette สำหรับภาพเชิงลึก มีให้ใช้เฉพาะบน build ที่รองรับ depth-sensor (ToF pipeline เช่น OpenMV Cam AE3 หรือ cam ที่มี ToF Pmod)

image.PALETTE_EVT_DARK: int#

Palette สำหรับแสดงเฟรมจากกล้อง event GENX320 บนพื้นหลังมืด ส่งไปยัง csi.CSI.color_palette เพื่อให้ GENX320 driver ส่งออกเฟรม RGB565 ที่ใส่สีในโหมด histogram หรือส่งไปยัง Image.draw_image() color_palette= เมื่อใส่สีให้กับภาพ event ระดับสีเทา

มีให้ใช้เฉพาะบน build ที่รองรับ GENX320 (OpenMV Cam AE3 และ GENX320 Pmod)

image.PALETTE_EVT_LIGHT: int#

Palette สำหรับแสดงเฟรมจากกล้อง event GENX320 บนพื้นหลังสว่าง การส่งและความพร้อมใช้งานเหมือนกับ PALETTE_EVT_DARK

โหมดสเกล#

ส่งค่าใดๆ ต่อไปนี้เป็นอาร์กิวเมนต์ hint ไปยัง Image.draw_image(), Image.scale() หรือเมธอดสเกลที่คล้ายกัน

image.AREA: int#

scaler แบบเฉลี่ยพื้นที่ ใช้เมื่อลดขนาด ส่วนการขยายขนาดจะใช้ Nearest-Neighbor

image.BILINEAR: int#

Bilinear scaler ใช้ subsampling เมื่อลดขนาด

image.BICUBIC: int#

Bicubic scaler คุณภาพสูงกว่า BILINEAR แต่ช้ากว่า ใช้ subsampling เมื่อลดขนาด

hints การวาด / draw_image#

นำค่าใดๆ เหล่านี้มา Bit-OR กันแล้วส่งเป็นอาร์กิวเมนต์ hint ของ Image.draw_image()

image.VFLIP: int#

พลิกต้นทางในแนวตั้งขณะวาด

image.HMIRROR: int#

สะท้อนต้นทางในแนวนอนขณะวาด

image.TRANSPOSE: int#

สลับตำแหน่ง (swap x/y) ของต้นทางขณะวาด

image.CENTER: int#

จัดต้นทางให้อยู่ตรงกลางของปลายทาง ออฟเซต x/y ที่ระบุไว้จะกลายเป็นออฟเซตจากจุดกลางแทนที่จะเป็นจากมุมบนซ้าย

image.EXTRACT_RGB_CHANNEL_FIRST: int#

เมื่อดึงช่อง RGB ผ่าน Image.draw_image() ให้ดึงช่อง ก่อน สเกล หากไม่มี hint นี้ ช่องจะถูกดึงหลังจากสเกล

image.APPLY_COLOR_PALETTE_FIRST: int#

เมื่อใช้ color palette ผ่าน Image.draw_image() ให้ใช้ palette ก่อน สเกล หากไม่มี hint นี้ palette จะถูกใช้หลังจากสเกล

image.SCALE_ASPECT_KEEP: int#

สเกลต้นทางให้พอดีภายในปลายทางโดยรักษาสัดส่วน (เพิ่มแถบดำเมื่อสัดส่วนต่างกัน)

image.SCALE_ASPECT_EXPAND: int#

สเกลต้นทางให้เต็มปลายทางโดยรักษาสัดส่วน (ตัดขอบเมื่อสัดส่วนต่างกัน)

image.SCALE_ASPECT_IGNORE: int#

สเกลต้นทางให้เต็มปลายทางโดยไม่สนใจสัดส่วน

image.BLACK_BACKGROUND: int#

บอก alpha-blending path ว่าปลายทางเป็นสีดำทราบแน่แล้ว ดังนั้นสามารถข้ามการอ่านพิกเซลปลายทางได้ เร่งความเร็ว alpha effect บนบัฟเฟอร์ที่เพิ่งล้างใหม่

image.ROTATE_90: int#

ทางลัดสำหรับ VFLIP | TRANSPOSE (หมุน 90 องศาตามเข็มนาฬิกา)

image.ROTATE_180: int#

ทางลัดสำหรับ HMIRROR | VFLIP (หมุน 180 องศา)

image.ROTATE_270: int#

ทางลัดสำหรับ HMIRROR | TRANSPOSE (หมุน 270 องศาตามเข็มนาฬิกา)

JPEG subsampling#

ส่งค่าใดๆ ต่อไปนี้เป็นอาร์กิวเมนต์ subsampling ไปยัง Image.to_jpeg(), Image.compress() หรือ Image.save() เมื่อเขียน JPEG

image.JPEG_SUBSAMPLING_AUTO: int#

เลือก chroma subsampling โดยอัตโนมัติตามการตั้งค่าคุณภาพ JPEG

image.JPEG_SUBSAMPLING_444: int#

บังคับ 4:4:4 chroma subsampling (ไม่มีการบีบอัด chroma)

image.JPEG_SUBSAMPLING_422: int#

บังคับ 4:2:2 chroma subsampling แนะนำเมื่อสตรีม MJPEG ไปยัง video player ของบุคคลที่สามที่มีปัญหากับ 4:2:0

image.JPEG_SUBSAMPLING_420: int#

บังคับ 4:2:0 chroma subsampling

Template matching#

ส่งค่าใดๆ ต่อไปนี้เป็นอาร์กิวเมนต์ search ไปยัง Image.find_template()

image.SEARCH_EX: int#

การค้นหาแบบละเอียด -- ประเมินทุกตำแหน่งใน ROI ช้าที่สุดแต่รับประกันว่าจะหาการจับคู่ที่ดีที่สุด

image.SEARCH_DS: int#

การค้นหาแบบ diamond -- ค้นหาแบบหยาบไปละเอียดที่เร็วกว่า SEARCH_EX มาก แต่อาจพลาด global optimum บน template ที่มีความคล้ายกันสูง

การตรวจจับขอบ#

ส่งค่าใดๆ ต่อไปนี้เป็นอาร์กิวเมนต์ algorithm ไปยัง Image.find_edges()

image.EDGE_CANNY: int#

Canny edge detector -- ขนาดกราเดียนต์ + non-max suppression + hysteresis คุณภาพสูงกว่า ช้ากว่า

image.EDGE_SIMPLE: int#

ตัวตรวจจับขอบแบบ high-pass-filter ที่ผ่านค่าขีดแบ่ง เร็วกว่าแต่ให้ขอบที่หนาและมีสัญญาณรบกวนมากกว่า EDGE_CANNY

ตัวตรวจจับมุม ORB#

ส่งค่าใดๆ ต่อไปนี้เป็นอาร์กิวเมนต์ corner_detector ไปยัง Image.find_keypoints()

image.CORNER_FAST: int#

FAST corner detector เร็วกว่า CORNER_AGAST แต่แม่นยำน้อยกว่า

image.CORNER_AGAST: int#

AGAST corner detector ช้ากว่า CORNER_FAST แต่ให้ keypoint ที่เสถียรกว่า

ตระกูล AprilTag#

นำค่าใดๆ ต่อไปนี้มา Bit-OR รวมกันแล้วส่งเป็นอาร์กิวเมนต์ families ไปยัง Image.find_apriltags() แต่ละตระกูลถูกควบคุมโดย build option ของตนเองใน firmware ตระกูลที่ไม่รองรับจะไม่ปรากฏเมื่อ runtime แทนที่จะเป็นศูนย์เสมอ

image.TAG16H5: int#

ตระกูล AprilTag 16h5 (30 ID ไม่ซ้ำ, แก้ไขข้อผิดพลาด 0 บิต)

image.TAG25H9: int#

ตระกูล AprilTag 25h9 (35 ID ไม่ซ้ำ, แก้ไขข้อผิดพลาดได้สูงสุด 3 บิต)

image.TAG36H10: int#

ตระกูล AprilTag 36h10 (2320 ID ไม่ซ้ำ, แก้ไขข้อผิดพลาดได้สูงสุด 3 บิต)

image.TAG36H11: int#

ตระกูล AprilTag 36h11 (587 ID ไม่ซ้ำ, แก้ไขข้อผิดพลาดได้สูงสุด 4 บิต) ตระกูลที่พบบ่อยที่สุด

image.TAGCIRCLE21H7: int#

ตระกูล AprilTag Circle21h7

image.TAGCIRCLE49H12: int#

ตระกูล AprilTag Circle49h12

image.TAGCUSTOM48H12: int#

ตระกูล AprilTag Custom48h12

image.TAGSTANDARD41H12: int#

ตระกูล AprilTag Standard41h12

image.TAGSTANDARD52H13: int#

ตระกูล AprilTag Standard52h13

สัญลักษณ์บาร์โค้ด#

ค่าที่รายงานใน BarCode.type สำหรับรายการที่ส่งคืนโดย Image.find_barcodes()

image.EAN2: int#

บาร์โค้ด EAN-2 เสริม

image.EAN5: int#

บาร์โค้ด EAN-5 เสริม

image.EAN8: int#

บาร์โค้ด EAN-8

image.UPCE: int#

บาร์โค้ด UPC-E

image.ISBN10: int#

บาร์โค้ด ISBN-10

image.UPCA: int#

บาร์โค้ด UPC-A

image.EAN13: int#

บาร์โค้ด EAN-13

image.ISBN13: int#

บาร์โค้ด ISBN-13

image.I25: int#

บาร์โค้ด Interleaved 2-of-5

image.DATABAR: int#

บาร์โค้ด GS1 DataBar

image.DATABAR_EXP: int#

บาร์โค้ด GS1 DataBar Expanded

image.CODABAR: int#

บาร์โค้ด Codabar

image.CODE39: int#

บาร์โค้ด Code 39

image.PDF417: int#

บาร์โค้ด PDF417 2D แบบซ้อน ค่าคงที่นี้มีไว้เพื่อความครบถ้วน แต่ตัวถอดรหัสบาร์โค้ดยังไม่รองรับ PDF417 ขณะนี้ Image.find_barcodes() จะไม่ส่งคืนการตรวจจับประเภทนี้

image.CODE93: int#

บาร์โค้ด Code 93

image.CODE128: int#

บาร์โค้ด Code 128