คลาส TVDisplay -- ไดรเวอร์ TV Shield

คลาส TVDisplay ขับเคลื่อน OpenMV TV Shield ซึ่งแปลงบัฟเฟอร์เฟรม RGB565 เป็นสัญญาณวิดีโอคอมโพสิต NTSC (352x240, 60 fields/s แบบ interlaced) ที่เหมาะสำหรับโทรทัศน์หรือจอภาพวิดีโอแบบอนาล็อก

รองรับ shield สองรูปแบบ:

  • TV Shield แบบมีสาย ซึ่งเปิดเผยสัญญาณคอมโพสิตบนแจ็ค RCA เดี่ยว

  • Wireless TV Shield ซึ่งป้อนสัญญาณเดียวกันเข้าสู่เครื่องส่งสัญญาณวิดีโอแบบอนาล็อก 2.4 GHz ช่องรับสัญญาณ (1--8) ถูกเลือกที่รันไทม์ผ่าน ioctl() ด้วย display.IOCTL_CHANNEL จนกว่าจะมีการเรียกนั้นจะไม่มีการเลือกช่อง

ความละเอียดและการกำหนดเฟรมเป็นค่าคงที่ -- TVDisplay ไม่รับอาร์กิวเมนต์ framesize เฟรมถูกนำเสนอโดยการส่ง image.Image ไปยัง write() ซึ่งจัดการการปรับขนาด ROI palette และการแปลงทิศทางภายใน

ตัวอย่างการใช้งาน:

import csi
import display

csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.SIF)              # 352x240, matches the TV output

tv = display.TVDisplay()

while True:
    tv.write(csi0.snapshot())

ตัวสร้าง

class display.TVDisplay(triple_buffer: bool = True)

triple_buffer ถ้าเป็น True จะทำให้การอัปเดตหน้าจอไม่บล็อก แต่ต้องใช้ RAM เพิ่มขึ้น 3 เท่าของขนาดหน้าจอ ค่าเริ่มต้นขึ้นอยู่กับบอร์ด

deinit() None

ปล่อยพิน I/O และ RAM ที่ใช้โดยคลาส เรียกโดยอัตโนมัติเมื่อถูกทำลาย

width() int

คืนค่าความกว้างของหน้าจอ (352)

height() int

คืนค่าความสูงของหน้าจอ (240)

refresh() int

คืนค่าอัตรารีเฟรช (60)

triple_buffer() bool

คืนค่าว่าเปิดใช้งาน triple buffering หรือไม่

write(image: image.Image, x: int = 0, y: int = 0, x_scale: float = 1.0, y_scale: float = 1.0, roi: Tuple[int, int, int, int] | None = None, rgb_channel: int = -1, alpha: int = 256, color_palette: int | 'image.Image' | None = None, alpha_palette: 'image.Image' | None = None, hint: int = 0) None

แสดง image โดยมุมบนซ้ายเริ่มที่ตำแหน่ง x, y

x_scale ควบคุมการขยายภาพที่แสดงในทิศทาง x (float) ถ้าค่านี้เป็นลบ ภาพจะถูกกระจกในแนวนอน

y_scale ควบคุมการขยายภาพที่แสดงในทิศทาง y (float) ถ้าค่านี้เป็นลบ ภาพจะถูกพลิกในแนวตั้ง

roi คือทูเพิลสี่เหลี่ยมบริเวณที่สนใจ (ROI) (x, y, w, h) ของภาพที่จะแสดง

rgb_channel คือช่อง RGB (0=R, G=1, B=2) ที่จะดึงจากภาพ RGB565 และแสดงบนจอแสดงผล

alpha ควบคุมความทึบแสงของภาพ ค่า 256 แสดงภาพทึบแสง ในขณะที่ค่าต่ำกว่า 256 จะสร้างภาพโปร่งใสสีดำ 0 ทำให้ภาพดำสนิท

color_palette ถ้าไม่ใช่ -1 สามารถเป็น enum ของ color palette หรือภาพ RGB565 รวม 256 พิกเซลที่ใช้เป็นตารางค้นหาสีบนค่าระดับสีเทาของภาพอินพุต

alpha_palette ถ้าไม่ใช่ -1 สามารถเป็นภาพ GRAYSCALE รวม 256 พิกเซลที่ใช้เป็น alpha palette ซึ่งปรับค่า alpha ของภาพอินพุตต่อพิกเซล

hint OR แบบลอจิกของแฟล็ก:

  • image.AREA: ใช้การปรับขนาดแบบ area เมื่อลดขนาด

  • image.BILINEAR: ใช้การปรับขนาดแบบ bilinear

  • image.BICUBIC: ใช้การปรับขนาดแบบ bicubic

  • image.CENTER: จัดกึ่งกลางภาพบนจอแสดงผล (หลังการปรับขนาด)

  • image.HMIRROR: กระจกภาพในแนวนอน

  • image.VFLIP: พลิกภาพในแนวตั้ง

  • image.TRANSPOSE: สลับตำแหน่งภาพ (swap x/y)

  • image.EXTRACT_RGB_CHANNEL_FIRST: ดึงช่อง rgb_channel ก่อนการปรับขนาด

  • image.APPLY_COLOR_PALETTE_FIRST: ใช้ color_palette ก่อนการปรับขนาด

  • image.SCALE_ASPECT_KEEP: ปรับขนาดให้พอดีภายในจอแสดงผล

  • image.SCALE_ASPECT_EXPAND: ปรับขนาดเพื่อเติมจอแสดงผล (ตัดบางส่วน)

  • image.SCALE_ASPECT_IGNORE: ปรับขนาดเพื่อเติมจอแสดงผล (ยืด)

  • image.ROTATE_90: หมุน 90 องศา (VFLIP | TRANSPOSE)

  • image.ROTATE_180: หมุน 180 องศา (HMIRROR | VFLIP)

  • image.ROTATE_270: หมุน 270 องศา (HMIRROR | TRANSPOSE)

clear(display_off: bool = False) None

ล้างหน้าจอเป็นสีดำ

display_off ได้รับการยอมรับเพื่อความเข้ากันได้กับ API ของคลาสจอแสดงผลอื่นและจะถูกละเว้น

ioctl(cmd: int, *args) object

จุดเข้า ioctl ทั่วไป

ส่ง display.IOCTL_CHANNEL เป็น cmd เพื่อตั้งค่าหรือรับช่องการออกอากาศของ wireless TV shield ถ้ามีอาร์กิวเมนต์ที่สอง (1-8) จะตั้งค่าช่อง ถ้าไม่มีอาร์กิวเมนต์ที่สองจะคืนค่าช่องปัจจุบัน ไม่มีการเลือกช่องจนกว่าจะมีการเรียก set ครั้งแรก