4.17. การตั้งค่าเซนเซอร์¶
นอกเหนือจาก pixformat() และ framesize() แล้ว คลาส CSI ยังเปิดเผยการควบคุมต่อเซนเซอร์หลายอย่างที่แทบทุกแอปพลิเคชันจะต้องใช้ในที่สุด ได้แก่ การวางแนวการติดตั้ง การรับแสง ค่าเกน การปรับสมดุลสีขาว และเครื่องมือดีบักบางอย่าง แต่ละอย่างสอดคล้องกับแนวคิดของเซนเซอร์ที่กล่าวถึงก่อนหน้านี้โดยตรง โดย API เพียงแค่ให้ตัวจัดการ Python สำหรับการเขียนรีจิสเตอร์ที่ไดรเวอร์ทำอยู่เบื้องหลัง
เมธอดทั้งหมดด้านล่างทำงานบนเซนเซอร์พื้นฐาน โดยทั้งหมดส่งการเขียนรีจิสเตอร์ผ่าน บัส I2C ควบคุม ของเซนเซอร์ ดังนั้นต้นทุนจึงอยู่ในระดับไมโครวินาที และการตั้งค่าใหม่จะมีผลในการ รับแสง ครั้งถัดไป ซึ่งโดยปกติคือ snapshot() ครั้งถัดไป
4.17.1. การวางแนว¶
กล้องไม่ทราบว่าตัวเองถูกติดตั้งในทิศทางใด แฟล็กพลิกภาพสองตัวที่ใช้กับเซนเซอร์จะหมุนภาพให้ถูกต้องก่อนที่พิกเซลใดจะออกจากชิป:
csi0.hmirror(True)
csi0.vflip(True)
hmirror() พลิกซ้าย-ขวา และ vflip() พลิกบน-ล่าง ทั้งสองครอบคลุมกรณีที่พบในทางปฏิบัติ: บอร์ดที่ติดตั้งคว่ำลง (แฟล็กทั้งสองเป็น True) บอร์ดที่อยู่หลังกระจกเงาด้านหน้า (hmirror เท่านั้น) หรือบอร์ดที่มองฉากสะท้อนจากด้านล่าง (vflip เท่านั้น)
เนื่องจากการพลิกภาพเกิดขึ้นในตรรกะการอ่านออกของเซนเซอร์ จึงไม่มีต้นทุน CPU และไม่มีค่าใช้จ่ายหน่วยความจำ เฟรมจะตกลงในบัฟเฟอร์เฟรมในแนวที่ถูกต้องแล้ว
4.17.2. การรับแสง¶
การรับแสงคือเวลาการรวมสัญญาณ ซึ่งหมายถึงระยะเวลาที่โฟโตไดโอดในแต่ละพิกเซลเก็บประจุก่อนที่แถวจะถูกอ่าน วัดเป็นไมโครวินาที ไดรเวอร์เริ่มต้นด้วยการเปิดใช้งานลูปการรับแสงอัตโนมัติของเซนเซอร์ ดังนั้นกล้องจึงพยายามรักษาค่าพิกเซลเฉลี่ยให้ใกล้เป้าหมาย การปิดใช้งานลูปจะตรึงการรับแสงไว้ที่ค่าที่แอปพลิเคชันเลือก:
csi0.auto_exposure(False, exposure_us=8000)
การรับแสงแบบคงที่เหมาะสมเมื่อความสว่างของฉากมีเสถียรภาพและแอปพลิเคชันต้องการการเบลอการเคลื่อนไหวที่คาดการณ์ได้หรือความเข้มเฟรมต่อเฟรมที่สม่ำเสมอสำหรับการกำหนดค่าขีดแบ่ง การอ่านค่าการรับแสงปัจจุบัน ไม่ว่าลูปจะตั้งค่าหรือแอปพลิเคชันกำหนด เป็นการเรียกแยกต่างหาก:
us = csi0.exposure_us()
การเรียก auto_exposure() ด้วย True และไม่มีค่าการรับแสงจะส่งคืนการควบคุมให้กับลูป
4.17.3. ค่าเกน¶
ค่าเกนคือแอมพลิฟายเออร์ที่ใช้กับแรงดันพิกเซลก่อนถึง ADC วัดเป็นเดซิเบล เช่นเดียวกับการรับแสง ไดรเวอร์เริ่มต้นด้วยการเปิดใช้งานลูปค่าเกนอัตโนมัติ รูปแบบสองแบบที่พบบ่อย การกำหนดเพดานสูงสุดช่วยให้ลูปปรับตามแสงแต่หยุดไม่ให้ขยายสัญญาณรบกวนไม่สิ้นสุดในฉากที่มีแสงน้อย:
csi0.auto_gain(True, gain_db_ceiling=16)
การตรึงค่าเกนคงที่เป็นตัวเลือกที่เหมาะสมเมื่อแอปพลิเคชันตรึงการรับแสงด้วย ความเสถียรของค่าเกนมีความสำคัญสำหรับแอปพลิเคชันที่เปรียบเทียบค่าพิกเซลระหว่างเฟรม เช่น การติดตามสี:
csi0.auto_gain(False, gain_db=0)
ค่าเกนปัจจุบันอ่านกลับผ่าน gain_db() เมื่อใดก็ตามที่แอปพลิเคชันปิดใช้งานค่าเกนอัตโนมัติ ควรปิดใช้งานการปรับสมดุลสีขาวอัตโนมัติและการรับแสงอัตโนมัติด้วย มิฉะนั้นลูปควบคุมที่ยังทำงานอยู่จะดึงภาพในลักษณะที่ขัดขวางค่าเกนคงที่
4.17.4. การปรับสมดุลสีขาว¶
การปรับสมดุลสีขาวคือค่าเกนต่อช่องที่ ISP ใช้กับช่องสีแดง เขียว และน้ำเงินที่ออกมาจากขั้นตอน debayer เพื่อให้วัตถุสีขาวดูเป็นสีขาวภายใต้แสงสีใดก็ได้ ลูปการปรับสมดุลสีขาวอัตโนมัติคำนวณค่าเกนทั้งสามจาก สถิติ ต่อบริเวณที่ ISP เก็บรวบรวมในทุกเฟรม และนำไปใช้ในเฟรมถัดไป
แอปพลิเคชันส่วนใหญ่ปล่อยให้ลูปทำงานต่อไป การติดตามสีเป็นข้อยกเว้นทั่วไป ค่าเกนยังเป็นสิ่งที่ลูปจะปรับเพื่อไล่ตามวัตถุที่มีสี ดังนั้นหากแอปพลิเคชันพยายามหาบลอบสีแดง ลูปจะค่อยๆ ลดช่องสีแดงและบลอบจะหยุดตรงกัน การล็อกลูปจะแก้ปัญหานี้:
csi0.auto_whitebal(False)
ส่ง tuple (r, g, b) ที่ชัดเจนในหน่วยเดซิเบลสำหรับการสอบเทียบสีที่สามารถทำซ้ำได้ ค่าเกนเดียวกันในทุกบอร์ดและทุกเซสชัน:
csi0.auto_whitebal(False, rgb_gain_db=(0.0, 0.0, 0.0))
ค่าเกนปัจจุบันอ่านกลับเป็น tuple ผ่าน rgb_gain_db()
4.17.5. การจำกัดอัตราเฟรม¶
โดยค่าเริ่มต้น เซนเซอร์ทำงานที่อัตราเฟรมพื้นฐาน ซึ่งอยู่ที่ 30 ถึง 60 เฟรมต่อวินาทีสำหรับชิ้นส่วนส่วนใหญ่ และสูงกว่ามากสำหรับเซนเซอร์ความเร็วสูงเมื่อ framesize เล็กพอ การจำกัดอัตราช่วยให้แอปพลิเคชันควบคุมกล้องให้ตรงกับสิ่งที่การประมวลผลปลายทางรับมือได้:
csi0.framerate(15)
บนเซนเซอร์ที่รองรับการควบคุมอัตราฮาร์ดแวร์ การเรียกนี้ยังยืดงบประมาณการรับแสงต่อเฟรม ซึ่งช่วยได้ในสภาพแสงน้อย บนเซนเซอร์อื่น ไดรเวอร์จะข้ามเฟรมส่วนเกินที่ระดับบัฟเฟอร์เฟรมเพียงอย่างเดียว
4.17.6. รูปแบบทดสอบ¶
รูปแบบทดสอบแถบสีมีอยู่ในเซนเซอร์ส่วนใหญ่และมีประโยชน์สำหรับการแยกแยะปัญหา การถ่ายภาพ จากปัญหา เอาต์พุต การเปิดใช้งานจะข้ามอาร์เรย์โฟโตไดโอดและส่งรูปแบบคงที่ผ่านเส้นทางข้อมูลพิกเซลเดียวกัน:
csi0.colorbar(True)
หากรูปแบบทดสอบดูถูกต้องแต่ภาพสดไม่ถูกต้อง ปัญหาอยู่ที่ระบบออปติกหรือส่วนหน้าแอนะล็อกของเซนเซอร์ หากรูปแบบทดสอบก็เสียหาย ปัญหาอยู่ที่บัสข้อมูลพิกเซลหรือการกำหนดค่า pixformat() / framesize() ส่ง False เพื่อกลับสู่ภาพสด
ดู csi.CSI สำหรับ API ฉบับเต็ม รวมถึงคำสั่ง ioctl() เฉพาะเซนเซอร์ที่เปิดเผยการควบคุมเฉพาะตระกูลเซนเซอร์นั้นๆ