v5.0.1#

v5.0.1 เป็นรุ่นบำรุงรักษาที่ต่อยอดจาก v5.0.0 — โมดูล sensor แบบเก่ากลายเป็นเลเยอร์ความเข้ากันได้แบบ Python บน csi ภาพที่โหลดเข้าบัฟเฟอร์เฟรมจะแสดงพรีวิวเหมือนเฟรมจากกล้อง ตัวเข้ารหัส JPEG ไม่มีขีดจำกัดเอาต์พุต 1 MB อีกต่อไปและจัดการกรณีล้นได้อย่างถูกต้อง พร้อมด้วยชุดการแก้ไขสำหรับกล้อง โปรโตคอล เครือข่าย และไลบรารี ML รุ่นนี้ ไม่มีการเปลี่ยนแปลง API ที่ไม่เข้ากันกับรุ่นก่อน สำหรับสคริปต์ที่เขียนกับ csi ส่วนการเปลี่ยนแปลงพฤติกรรมจำนวนหนึ่งได้ระบุไว้ภายใต้ การเปลี่ยนแปลง API ที่ไม่เข้ากันกับรุ่นก่อน

ไฮไลต์#

  • โมดูล sensor เป็นโมดูล Python แบบ frozen แล้ว ซึ่งสร้างขึ้นบน csi จะพิมพ์คำเตือนการยกเลิกใช้งานเมื่อนำเข้า และฟังก์ชันจำนวนหนึ่งที่โมดูล csi ไม่สามารถรองรับได้จะแสดงข้อผิดพลาด OSError ดูเพิ่มเติมที่ การเปลี่ยนแปลงของโมดูล sensor

  • ภาพที่โหลดจะแสดงพรีวิวเหมือนเฟรมจากกล้อง ภาพที่ถูกวางลงในบัฟเฟอร์เฟรมด้วย copy_to_fb=True (image.Image, image.ImageIO.read(), fir.snapshot(), tof.snapshot()) จะถูก flush ไปยัง IDE — พร้อมกับสิ่งที่วาดลงไป — เมื่อภาพถัดไปเขียนทับบัฟเฟอร์เฟรม แทนที่จะส่งทันที ดูเพิ่มเติมที่ การเปลี่ยนแปลงของพรีวิว

  • การยกเครื่องตัวเข้ารหัส JPEG ขีดจำกัดบัฟเฟอร์เอาต์พุต 1 MB ถูกยกเลิก (ขนาดบัฟเฟอร์จะกำหนดจากหน่วยความจำว่าง) กรณีล้นทั้งในเส้นทางซอฟต์แวร์และฮาร์ดแวร์จะถูกจัดการแทนการเขียนไฟล์ที่ถูกตัดทอน และการบันทึกภาพที่บีบอัดแล้วด้วยนามสกุลของรูปแบบบีบอัดอีกแบบจะแสดงข้อผิดพลาดแทนการเขียนข้อมูลขยะ

  • ใหม่ protocol.poll() และ วิดเจ็ต CBOR ใหม่หกตัว (text, lineedit, pushbutton, spinbox, radio, waveform) สำหรับ protocol.CBORChannel

  • โพสต์โปรเซสเซอร์ YOLO Pro, การรองรับ FLIR Lepton 3.1R / UW, การอ่าน IMU แบบ burst, CAN บน OpenMV N6 และเป้าหมาย simulator ที่รองรับเครือข่าย

ฟีเจอร์ใหม่#

  • YoloPro — โพสต์โปรเซสเซอร์ใหม่สำหรับโมเดลตรวจจับวัตถุ YOLO Pro ของ Edge Impulse พร้อมตัวอย่าง yolo_pro_detector.py (f3f150ebd, ea7bbb398)

  • protocol.poll() — รันการวนซ้ำหนึ่งรอบของงานโปรโตคอลตามต้องการ สำหรับทรานสปอร์ตแบบกำหนดเองที่ไม่ได้ถูกขับเคลื่อนด้วยอินเทอร์รัปต์ USB หรือตัวตั้งเวลา poll_ms นอกจากนี้ยังสามารถเรียก protocol.init() อีกครั้งเพื่อเริ่มต้นสแตกใหม่ได้ (c00c215f9, f849ffb1b)

  • วิดเจ็ตช่องสัญญาณ CBOR เพิ่มเติม — protocol.CBORChannel.add() เพิ่ม text (สตริงคงที่), lineedit (สตริงที่เขียนได้), pushbutton (การกระทำชั่วขณะ), spinbox (ช่องป้อนตัวเลขแบบขั้น), radio (กลุ่มตัวเลือก) และ waveform (อนุกรมเวลา 1 มิติพร้อมอาร์กิวเมนต์ sample_rate, series และ typecode กำหนดไบต์ตัวอย่างแบบสลับกันให้เพื่อสตรีม) (8016d29ba)

  • csi.CUSTOM — ตอนนี้ csi.CSI.framesize() จะคืนค่าคงที่ที่ใช้งานได้หลังจากตั้งค่าความละเอียด (w, h) แบบกำหนดเอง แทนที่จะเป็นจำนวนเต็มที่ไม่มีชื่อ (af8841654)

  • การอ่าน IMU แบบ burst — imu.__read_reg() รับบัฟเฟอร์ที่เขียนได้เป็นอาร์กิวเมนต์เสริม และเติมข้อมูลจากรีจิสเตอร์ที่ต่อเนื่องกันในการทำธุรกรรมเดียว (244ca480a)

  • FLIR Lepton 3.1R และ Lepton UW ได้รับการรู้จักโดยไดรเวอร์ Lepton รวมถึงโหมด gain แบบ radiometric ของแต่ละรุ่น (0fc356632)

  • เครือข่ายบน simulator — เป้าหมาย QEMU MPS2_AN500 มี lwIP และ NIC แบบ user-mode แล้ว พร้อม requests, mqtt และ sensor ที่ frozen รวมมาด้วย และมี unit test สำหรับเครือข่าย (23546dfb1, 61d187305, 15096c3a2)

  • ตัวอย่าง API ที่เข้ากันได้กับ OpenAI — openai_compatible.py ถ่าย snapshot เป็น JPEG แล้วโพสต์ไปยังปลายทาง chat-completions เพื่อบรรยายฉาก (79033c6aa)

  • ตัวอย่าง SX126x LoRa — ไดรเวอร์ lora-sx126x ของ micropython-lib (พร้อม lora-sync / lora-async) ถูก frozen รวมเข้าในเฟิร์มแวร์ OpenMV RT1062 พร้อมตัวอย่างผู้ส่ง/ผู้รับ/ping-pong/สตรีมภาพ สำหรับการต่อสายโมดูล SX1261 หรือ SX1262 เข้ากับบัส SPI นี่เป็นการรองรับที่ชุมชนมีส่วนร่วมพัฒนา OpenMV ไม่ได้จำหน่ายฮาร์ดแวร์ LoRa (19576e1b1)

การเปลี่ยนแปลงและการปรับปรุงอื่นๆ#

  • เขียนไลบรารี requests ใหม่ — การตอบกลับแบบ chunked transfer จะถูกถอดรหัส มีอาร์กิวเมนต์ timeout (ค่าเริ่มต้น 5 วินาที) ให้ใช้ เนื้อหาแบบ JSON และสตริงถูกซีเรียลไลซ์/เข้ารหัสอย่างถูกต้อง ส่วนหัวถูกแยกวิเคราะห์โดยไม่สนใจตัวพิมพ์ใหญ่-เล็กและบรรทัดสถานะถูกแยกตามตำแหน่ง dict headers ของผู้เรียกจะถูกคัดลอก (ดังนั้น auth จะไม่รั่วไหลไปยังคำขอครั้งถัดไปอีกต่อไป) และเนื้อหาจะถูกอ่านเป็นบล็อกลงใน bytearray (889f0b096)

  • mqtt นำเข้า ssl แบบ lazy ดังนั้นโมดูลและการเชื่อมต่อแบบธรรมดา (ไม่ใช่ TLS) จึงใช้งานได้บนบิลด์ที่ไม่รองรับ SSL (c2e0899e8)

  • ขนาดบัฟเฟอร์เอาต์พุต JPEG กำหนดจากหน่วยความจำว่าง แทนขีดจำกัดคงที่ 1 MB ตัวเข้ารหัสจะตัดบัฟเฟอร์ให้เท่ากับขนาดที่เข้ารหัสได้ก่อนเขียนภาพออกไป ดังนั้นการจับภาพจากเซนเซอร์ขนาดใหญ่ที่คุณภาพสูงจะไม่ล้มเหลวอีกต่อไป (aa1ca6776)

  • การจัดระเบียบโพสต์โปรเซสซิงของ ML — การสร้าง bounding box ถูกทำให้เป็นมาตรฐานเดียวกันในโพสต์โปรเซสเซอร์ของ Darknet, Edge Impulse และ Ultralytics และเอาต์พุตของ YOLOv8 จะถูกทรานสโพสหลังการกรองด้วย threshold เพื่อให้เก็บข้อมูลหนึ่งแถวต่อการตรวจจับเช่นเดียวกับโมเดลอื่นๆ (b5c7853f2, c45f99cad)

  • การปิด PAG7936 อย่างปลอดภัย — แฟล็กหยุดเซนเซอร์ตัวใหม่จะสั่งให้ PAG7936 เข้าสู่โหมดหลับก่อนสลับ RESET/PWDN ซึ่งแก้ปัญหาการค้างเมื่อใช้เซนเซอร์กับสายต่อขยาย นอกจากนี้ไดรเวอร์ยังเลือกชุดรีจิสเตอร์แบบ MIPI CSI-2 หรือแบบขนานจากที่อยู่ I2C ของเซนเซอร์ขณะรันไทม์แทนที่จะเลือกตอนบิลด์ (10026530c, f6acf14ec, 5f0251c74)

  • การจัดจังหวะการเล่นของ ImageIO จะให้บริการเหตุการณ์ที่ค้างอยู่ระหว่างรอช่วงเวลาระหว่างเฟรม แทนการหลับใน WFI (a54790193)

  • การอัปเดตซับโมดูล MicroPython — รองรับเครือข่ายเต็มรูปแบบบนพอร์ต QEMU, machine.mem_backup บน STM32 ผ่าน backup SRAM/รีจิสเตอร์ BKP, คงการปิดใช้ hardware flow control ของ SDIO บน STM32F4 และการใช้แอตทริบิวต์ MPU ซ้ำสำหรับพื้นที่ที่ไม่ใช้แคช (31ada5626, ab61d27a6, 06bddf13a)

  • differential-translation.py จับภาพผ่านวัตถุ csi.CSI ของตนเองแทนโมดูล sensor ที่ถูกยกเลิกแล้ว และการเว้นบรรทัดของ import ในตัวอย่างถูกทำให้เป็นมาตรฐานเดียวกัน (68c866e7f, 9ceff4513)

การแก้ไขข้อบกพร่อง#

กล้องและเซนเซอร์:

  • การตั้งค่าความละเอียด (w, h) แบบกำหนดเองสองครั้งติดกันทำให้เซนเซอร์ยังคงอยู่ที่ขนาดแรก ในขณะที่ csi.CSI.width() / height() รายงานขนาดที่สอง ตอนนี้เส้นทางลัด "ไม่มีการเปลี่ยนแปลง" จะไม่รวมขนาดแบบกำหนดเองแล้ว (cfbb70156)

  • csi.CSI.lens_correction() แยกวิเคราะห์ radi และ coef เป็นค่าบูลีน ทำให้ค่าที่ส่งไปยังไดรเวอร์ไม่ใช่ค่าที่ระบุไว้ (ab44b3a77)

  • PAG7936: การตั้งค่า exposure และ gain ติดต่อกันจะเขียนทับกันเอง (ทั้งสองใช้โหมดแมนนวลร่วมกันหนึ่งโหมด และรีจิสเตอร์ที่อ่านกลับจะล่าช้าไปหนึ่งเฟรม) ตอนนี้ไดรเวอร์จะกำหนดค่าเริ่มต้นให้รีจิสเตอร์แมนนวลเฉพาะตอนเข้าสู่โหมดแมนนวล และเขียนเฉพาะตัวควบคุมที่กำลังตั้งค่าเท่านั้น (e7a18c0a0)

  • การจับภาพแบบ BAYER ของ PAG7936 และ PS5520 บน OpenMV N6 ล้มเหลวด้วยข้อความ "Failed to initialize the CSI interface" ที่ทุกขนาดยกเว้นความละเอียดเต็ม เนื่องจาก ISP ของ N6 ไม่สามารถปรับขนาด Bayer ดิบได้ ตอนนี้เซนเซอร์จะทำงานที่โหมดเนทีฟที่ตรงกับขนาดที่ร้องขอสำหรับ BAYER (PS5520: VGA, HD, SXGA-M, FHD, QHD, WQXGA2 ส่วน QVGA ไม่มีโหมดเนทีฟและไม่รองรับ) (fe6790055, b7622b245)

การเข้ารหัสและการบันทึกภาพ:

  • ตัวเข้ารหัส JPEG แบบซอฟต์แวร์: การล้นของบัฟเฟอร์เอาต์พุตเป็นข้อผิดพลาดร้ายแรงเสมอเนื่องจากเส้นทาง realloc ถูกปิดใช้งาน ตอนนี้จะขยายบัฟเฟอร์ (ครั้งละครึ่งหนึ่งของขนาดเดิม) เมื่อเป็นเจ้าของบัฟเฟอร์นั้น ถอยกลับอย่างถูกต้องเมื่อหน่วยความจำหมด และตัดผลลัพธ์ให้พอดี jpeg_write / mjpeg_write จะไม่เขียนบัฟเฟอร์ออกไปอีกต่อไปหลังจากการเข้ารหัสล้มเหลว (28e1110be)

  • ตัวเข้ารหัส JPEG แบบฮาร์ดแวร์ (STM32): กรณีล้นจะคืนภาพที่เข้ารหัสได้เพียงบางส่วนพร้อมขนาดที่จัดสรร ทำให้ได้ไฟล์ที่ถูกตัดทอนโดยไม่มีเครื่องหมาย EOI (เช่น การจับภาพ 5 MP ที่คุณภาพ 100 โดยครึ่งล่างว่างเปล่า) ตอนนี้จะรายงานการล้น ปล่อยบัฟเฟอร์เมื่อล้มเหลว และตัดบัฟเฟอร์ให้พอดีเมื่อสำเร็จ (22ce9619c)

  • ตัวเข้ารหัส VC8000 สร้าง chroma แบบ 4:2:0 อย่างเงียบๆ สำหรับทุกคำขอ ตอนนี้การสุ่มตัวอย่างย่อยที่ไม่ใช่ 4:2:0 จะถอยกลับไปใช้ codec ฮาร์ดแวร์ที่รองรับแทน (71f2be7f2)

  • image.Image.save() ของภาพ PNG เป็น .jpg เขียนข้อมูลฮีปที่ไม่ได้กำหนดค่าออกไปได้ถึง 1 MB และของภาพ JPEG เป็น .png เขียนไฟล์ว่าง ตอนนี้ทั้งสองกรณีจะแสดงข้อผิดพลาด ส่วนภาพที่อยู่ในรูปแบบเป้าหมายอยู่แล้วจะยังคงถูกคัดลอกตามเดิม (6c1fdf822)

  • ตอนนี้ png_write จะตรวจสอบค่าที่คืนจากตัวบีบอัดและบีบอัดก่อนสร้างไฟล์ ดังนั้นความล้มเหลวจะไม่ทิ้งไฟล์ว่างไว้อีกต่อไป (557f52d66)

โมดูล image:

  • image.Image.get_pixel() พร้อม rgbtuple=True บนภาพ BAYER และ YUV เขียนพิกเซลที่แปลงแล้วเลยตัวแปรโลคัลบนสแตกไปที่ออฟเซ็ตซึ่งผู้เรียกควบคุมได้ (13f2a17b6)

  • gif.Gif.add_frame() ลบสาขาการแปลง Bayer/YUV ที่ไม่มีทางถูกเรียกถึงออก รับเฉพาะภาพ GRAYSCALE และ RGB565 เท่านั้น ตามที่ API ของ Python บังคับไว้อยู่แล้ว (f20d99d96)

โปรโตคอล:

  • การลงทะเบียนช่องสัญญาณแบบไดนามิกในขณะที่ทุกช่องถูกใช้งานอยู่แล้วทำให้เกิดการเขียนนอกขอบเขต ตอนนี้จะตรวจสอบ ID ของช่องสัญญาณก่อน และมีการ assert แบบสถิตว่า ID ช่องสัญญาณที่สงวนไว้พอดีกับตารางช่องสัญญาณ (68f635d1f)

  • วัตถุช่องสัญญาณแบบไดนามิกยังคงอยู่ใน root pointer หลัง soft reset ทำให้ GC ยังคงสแกนบล็อกฮีปเก่าจากการรันครั้งก่อน ตอนนี้ตารางจะถูกล้างเมื่อ init (ef0ebb03b, e23641145)

พอร์ต:

  • i.MX RT: เพิ่มการ de-initialize ของ CAN และ Encoder ที่ขาดหายไปเมื่อ soft reset (7cb9d3dc2)

ฮาร์ดแวร์และการรองรับบอร์ด#

  • OpenMV N6 — เปิดใช้งาน CAN แล้ว (machine.CAN) (294f0febd, 91e1c9573)

  • OpenMV AE3 — ไดรเวอร์ SPI sdcard ถูก frozen รวมมาด้วยสำหรับซ็อกเก็ต microSD บน AE3 Battery Shield (a258f4814)

  • OpenMV RT1062 — lora-sx126x / lora-sync / lora-async ถูก frozen รวมมาด้วย (ดูฟีเจอร์ใหม่)

  • FLIR Lepton 3.1R / UW — ได้รับการรู้จักโดยไดรเวอร์ Lepton บนทุกบอร์ดที่รองรับ Lepton

  • PAG7936 — การหยุดเพื่อปิดอย่างปลอดภัย การเลือกอินเทอร์เฟซขณะรันไทม์ การแก้ไข exposure/gain และการจับภาพแบบ BAYER บน N6

  • PS5520 — การจับภาพแบบ BAYER บน N6 ที่ขนาดเนทีฟ

  • Simulator (MPS2_AN500) — ระบบเครือข่าย

  • ทุกบอร์ด — โมดูลความเข้ากันได้ sensor ถูก frozen รวมเข้าใน manifest ของทุกบอร์ด

การเปลี่ยนแปลง API ที่ไม่เข้ากันกับรุ่นก่อน#

v5.0.1 ไม่มีการเปลี่ยนแปลงที่ไม่เข้ากันกับรุ่นก่อนใน API ของ csi หรือ image สคริปต์ที่ทำงานบน v5.0.0 จะทำงานได้โดยไม่ต้องแก้ไข โดยมีการเปลี่ยนแปลงพฤติกรรมดังต่อไปนี้

โมดูล sensor (behavior)#

โมดูล sensor แบบเนทีฟ (modules/py_csi.c) ถูกลบออกและแทนที่ด้วยโมดูล Python แบบ frozen ที่ใช้งาน API เดียวกันบน csi ดูที่ sensor

Commit: 5e3d40631

  • import sensor จะพิมพ์ WARNING: The sensor module is deprecated and will be removed in a future release. Please use the csi module instead. ไปยังเทอร์มินัล

  • วัตถุ csi.CSI ที่ซ่อนอยู่จะถูกสร้างเมื่อนำเข้า ดังนั้นหากไม่มีกล้องจะเกิดข้อผิดพลาดตั้งแต่ import sensor แทนที่จะเป็นตอน sensor.reset()

  • ฟังก์ชันเหล่านี้จะแสดงข้อผิดพลาด OSError แล้ว เนื่องจาก csi ไม่มีสิ่งที่เทียบเท่า: get_fb(), alloc_extra_fb(), dealloc_extra_fb(), set_auto_rotation(), get_auto_rotation(), disable_delays(), disable_full_flush() (ฟังก์ชัน *_extra_fb ทั้งสองแสดงข้อผิดพลาดอยู่แล้วตั้งแต่ v5.0.0) ให้ใช้ csi.CSI(delays=False) / csi.CSI(fflush=False) แทนสองฟังก์ชันสุดท้าย

  • framesize ที่ csi ไม่ได้ส่งออก (QQCIF, QQSIF, QQQQVGA, HQQQQVGA, HQQQVGA, HQQVGA, B64X32, B64X64, B128X64, B128X128, B160X160, B320X320, LCD, QQVGA2) ตอนนี้เป็น tuple (w, h) ที่ถูกส่งผ่านในฐานะความละเอียดแบบกำหนดเอง get_framesize() จะคืน tuple ที่ตั้งค่าไว้ตราบใดที่กล้องยังอยู่ที่ขนาดนั้น ดังนั้นการตรวจสอบความเท่ากันกับค่าคงที่จึงยังคงใช้งานได้

  • ioctl() จะส่งต่ออาร์กิวเมนต์หลังคำขอได้สูงสุดสี่ตัว

  • sleep() / shutdown() จะแสดงข้อผิดพลาด OSError เมื่อล้มเหลวเช่นเดิม (RuntimeError ของ csi จะถูกแปลงให้)

ย้ายไปใช้ csi — ดูที่ ตารางการย้ายโค้ดของ v5.0.0

การโหลดภาพเข้าบัฟเฟอร์เฟรม (behavior)#

ฟังก์ชันที่โหลดภาพเข้าบัฟเฟอร์เฟรม — image.Image ที่ใช้ copy_to_fb=True, image.Image.copy() / image.Image.scale() และการแปลง to_* ที่ใช้ copy_to_fb=True, image.ImageIO.read(), fir.snapshot() และ tof.snapshot() ที่ใช้ copy_to_fb=True — เดิมจะส่งภาพใหม่ไปยังพรีวิวของ IDE ทันที ทำให้สิ่งที่วาดลงบนภาพที่คืนค่ามาไม่เคยถูกมองเห็น ตอนนี้ฟังก์ชันเหล่านี้จะทำเครื่องหมายบัฟเฟอร์เฟรมว่ารอดำเนินการ และ flush พร้อมกับทุกสิ่งที่วาดลงไป ทันทีก่อนที่ภาพถัดไปจะเขียนทับ — ซึ่งเป็นพฤติกรรมเดียวกับ csi.CSI.snapshot()

Commits: 87b6db5ee, 7b1a35c2f, f773c740d

ลูปที่อ่านสตรีมของภาพไม่ต้องแก้ไขใดๆ และตอนนี้จะแสดงสิ่งที่วาดไว้ด้วย สคริปต์ที่โหลดภาพ เพียงภาพเดียว แล้วหยุดจะต้อง flush ภาพนั้นอย่างชัดเจน:

img = image.Image("example.bmp", copy_to_fb=True)
img.flush()          # new: send it to the IDE preview now
time.sleep_ms(1000)

ไลบรารี ML (behavior)#

มีผลเฉพาะกับโค้ดที่สืบทอดคลาสหรือคัดลอกโพสต์โปรเซสเซอร์ที่มาพร้อมเฟิร์มแวร์เท่านั้น ตอนนี้ YoloV8 จะทรานสโพสเอาต์พุตของโมเดลหลังการกรองด้วย threshold เพื่อให้การตรวจจับที่ผ่านการกรองถูกเก็บเป็นหนึ่ง แถว ต่อกล่อง (bb[:, 4:]) เช่นเดียวกับโพสต์โปรเซสเซอร์ของ Darknet และ Edge Impulse แทนที่จะเป็นหนึ่งคอลัมน์ต่อกล่อง (bb[4:, :]) ผลลัพธ์สาธารณะ ((x, y, w, h), score) ไม่เปลี่ยนแปลง

Commits: c45f99cad, b5c7853f2

โมดูล protocol (minor)#

protocol.poll() กลับมาแล้ว v5.0.0 ได้ลบฟังก์ชันนี้ออกเมื่องานโปรโตคอลย้ายไปทำงานบนตัวตั้งเวลา ตอนนี้กลับมาเป็นวิธีที่ชัดเจนในการขับเคลื่อนงานสำหรับทรานสปอร์ตแบบกำหนดเอง ไม่มีสิ่งอื่นเปลี่ยนแปลง — สคริปต์ที่ไม่เคยเรียกฟังก์ชันนี้จะไม่ได้รับผลกระทบ

Commit: c00c215f9

การสร้าง / tooling (tooling)#

ทั้งหมดนี้ไม่มีผลต่อสคริปต์ MicroPython py_image.c ถูกแยกออก โดยวัตถุ descriptor (cascade, keypoints, LBP, keypoint match) ย้ายไปยัง py_image_descriptor.c และวัตถุสถิติ (similarity, statistics, percentile, threshold, histogram) ย้ายไปยัง py_image_stats.c API ตัวเข้ารหัสของ imlib ถูกปรับให้สอดคล้องกับส่วนที่เหลือของ imlib: jpeg_compress / png_compress คืนค่า 0 เมื่อสำเร็จและ -1 เมื่อผิดพลาด และ jpeg_compress ไม่มีอาร์กิวเมนต์ realloc อีกต่อไป (การปรับขนาดขึ้นอยู่กับความเป็นเจ้าของบัฟเฟอร์) OMV_PROTOCOL_MAX_CHANNELS เปลี่ยนเป็น OMV_PROTOCOL_CHANNEL_MAX ใน omv_protocol_channel.h และตอนนี้พอร์ตต่างๆ จะเรียก py_protocol_init0() เมื่อ init การกำหนดค่าบอร์ด OMV_PAG7936_MIPI_CSI2 ถูกลบออกแล้ว (อินเทอร์เฟซจะถูกเลือกขณะรันไทม์) ปิดท้ายด้วยการอัปเดต dependency ของ CI และการแก้ไขกรณี changelog ของรุ่นว่างเปล่า ดูรายละเอียดที่เกี่ยวข้องกับ fork ได้จากประวัติของ ที่เก็บเฟิร์มแวร์

รายการตรวจสอบการย้ายโค้ด#

  • ยังใช้ import sensor อยู่หรือไม่? ยังใช้งานได้ แต่มีคำเตือน ให้ย้ายไปใช้ csi (การย้ายโค้ดไป v5.0.0) แทนที่ disable_delays / disable_full_flush ด้วยอาร์กิวเมนต์ของตัวสร้าง csi.CSI() และลบการเรียก get_fb / auto-rotation ออก

  • โหลดภาพเพียงภาพเดียวด้วย copy_to_fb=True และคาดว่าจะเห็นภาพหรือไม่? เพิ่ม img.flush() หลังจากโหลด

  • คัดลอกโพสต์โปรเซสเซอร์ YOLOv8 ไปใช้หรือไม่? ให้เข้าถึงเอาต์พุตที่ผ่านการกรองด้วย threshold ตามแถว (bb[:, 4:]) แทนตามคอลัมน์

  • เปรียบเทียบ csi0.framesize() หลังจากตั้งค่า tuple หรือไม่? ตอนนี้จะคืนค่า csi.CUSTOM

  • ส่วนอื่นๆ ทั้งหมด: แฟลชเฟิร์มแวร์ใหม่แล้วรันได้เลย