1 อธิบาย
เซนเซอร์ CMOS ส่วนใหญ่ไม่ได้อ่านภาพทั้งเฟรมพร้อมกัน แต่อ่านทีละแถวจากบนลงล่าง แถวล่างจึงถูกบันทึกช้ากว่าแถวบนเท่ากับ readout time ถ้ากล้องแพนเร็ว แต่ละแถวเห็นโลกคนละจังหวะ เสาที่ตั้งตรงจึงเอียง
ถ้ากล้องสั่นเร็ว เช่นติดรถหรือโดรน ภาพจะย้วยเป็นคลื่นที่เรียกกันว่า jello CG ที่เรนเดอร์ทั้งเฟรมในเวลาเดียวจะไม่เอียงตาม ลองเปลี่ยนความเร็วแพน: ความเอียงโตตามความเร็ว แต่ readout ที่ถูกยังเป็นค่าเดิม เพราะเป็นคุณสมบัติของกล้อง
skew (px) = image speed (px/s) × readout time (s)2 ลงมือลอง
โจทย์: ตั้ง readout time ของ CG ให้เสา CG เอียงทับเสาใน plate
วัดจาก plate ได้: readout = ระยะเอียงเต็มความสูงเฟรม ÷ ความเร็วแพน
3 เจาะลึก
อ่านทีละแถว
global shutter อ่านทุกพิกเซลพร้อมกัน rolling shutter อ่านแถวบนก่อน แล้วไล่ลงไปจนแถวล่าง ช่วงเวลาตั้งแต่แถวแรกถึงแถวสุดท้ายคือ readout time แถวที่ y ถูกบันทึกช้ากว่าแถวบนสุด (y ÷ ความสูง) × readout
ถ้าทุกอย่างนิ่งจะไม่เห็นอะไรผิด ปัญหาเกิดเมื่อภาพเคลื่อนระหว่างที่อ่าน ความผิดเพี้ยนจึงขึ้นกับความเร็วของภาพบนเซนเซอร์คูณ readout
| การเคลื่อน | อาการ |
|---|---|
| แพนแนวนอนเร็ว | เส้นตั้งเอียง (skew) |
| สั่นความถี่สูง | ภาพย้วยเป็นคลื่น (jello) |
| ของหมุนเร็ว (ใบพัด) | รูปทรงบิดเบี้ยว |
| แฟลชสั้นกว่า readout | สว่างแค่บางส่วนของเฟรม |
วัด readout จาก plate
หาเส้นตั้งในฉาก (เสา ขอบตึก) ในช่วงที่กล้องแพนเร็ว วัดว่าเส้นเอียงไปกี่พิกเซลจากบนถึงล่าง แปลงเป็นระยะเต็มความสูงเฟรม แล้วหารด้วยความเร็วของภาพเป็นพิกเซลต่อวินาที (วัดจาก track ระหว่างเฟรม) ได้ readout ตัวอย่าง: เอียง 27 px เต็มเฟรม ที่ 1500 px/s = 18 ms
ตัวเลขที่ได้ควรใกล้สเปกของกล้องในโหมดที่ถ่าย readout เปลี่ยนตามโหมดความละเอียดและ frame rate ของกล้องตัวเดียวกันได้ จดโหมดกล้องไว้ด้วย
- 1หาเส้นตั้งตอนแพน
- 2วัดเอียงเต็มเฟรม (px)
- 3ความเร็วจาก track (px/s)
- 4readout = เอียง ÷ ความเร็ว
แก้ plate หรือใส่ให้ CG
มีสองทาง ทางแรกแก้ plate ก่อน track ให้แต่ละแถวกลับไปเวลาเดียวกันโดยใช้ motion vector แล้วค่อย track และ comp ทางที่สองปล่อย plate ไว้ แล้วทำให้ CG เอียงตาม โดยเลื่อนแต่ละแถวตามการเคลื่อนคูณเวลาของแถวนั้น หรือ render ด้วยกล้องที่มีตัวเลือก rolling shutter (renderer บางตัวมี)
track ภาพที่มี rolling shutter ตรง ๆ มักได้กล้องที่สั่นหรือ solve ไม่ลง โปรแกรม matchmove บางตัวมีค่าชดเชย rolling shutter ให้ใส่ แต่ควรเปิดทีละอย่าง (focal, distortion, rolling shutter) แล้วดูผล ไม่ใช่เปิดพร้อมกันหมด
ใบพัดหรือของหมุนเร็วใน plate เอียงอยู่แล้ว CG ที่หมุนต้องเพี้ยนแบบเดียวกัน
4 ในงานจริง
ทำใน Nuke
- RollingShutter (NukeX) ใช้ motion vector ประมาณการเคลื่อน แล้วชดเชยแต่ละแถว ปรับค่าการแก้จนเส้นตั้งในเฟรมที่แพนเร็วที่สุดกลับมาตรง
- ทำเองสำหรับ CG: Ramp แนวตั้ง (0 บน → 1 ล่าง) คูณ motion vector (หน่วยเป็น px ต่อเฟรม) × readout ในหน่วยเฟรม (readout วินาที × fps เช่น 0.018 × 24 ≈ 0.43) แล้ว IDistort ภาพ CG ถ้าเอียงผิดทางให้กลับเครื่องหมาย
- แพนตรง ๆ ไม่ซับซ้อน: Transform skew X ตัวเดียวก็ใกล้พอ skew X เป็นตัวคูณการเฉือน ไม่ใช่พิกเซล จึงตั้ง skew X = (ความเร็ว × readout) ÷ ความสูงเฟรม (เช่น 27 px ÷ 1080 ≈ 0.025) และตั้ง center ไว้ที่ขอบบนของเฟรมให้แถวบนอยู่กับที่
- เช็ก: วาง CG กับเส้นตั้งใน plate แล้ว wipe ดูในเฟรมที่แพนเร็วที่สุด
พลาดบ่อย → แก้ยังไง
- ✗ ใส่ skew ตายตัวทั้งช็อต✓ skew ตามความเร็วของแต่ละเฟรม readout คงที่ ความเร็วเปลี่ยน
- ✗ track plate ที่มี jello ตรง ๆ แล้วงงว่าทำไม solve ไม่ลง✓ แก้ rolling shutter ก่อน track หรือใช้การชดเชยในโปรแกรม matchmove
- ✗ เดา readout จากกล้องรุ่นอื่น✓ ใช้สเปกของกล้องและโหมดที่ถ่ายจริง หรือวัดจาก plate
เช็กก่อนส่งช็อต
- เส้นตั้งของ CG เอียงเท่า plate ในเฟรมที่แพนเร็วที่สุด
- ในช่วงกล้องนิ่ง CG ตั้งตรง
- readout ที่ใช้มีที่มา (สเปกหรือการวัด)
- แฟลชหรือไฟกระพริบใน CG ตรงกับแถบสว่างใน plate ถ้ามี
5 เช็กตัวเอง
กล้องตัวเดิม แต่แพนเร็วขึ้นสองเท่า อะไรเปลี่ยน
🔒 ตอบคำถามด้านบนก่อน แล้วการ์ดนี้จะเปิด
1. เสาเอียง 12 px เต็มความสูงเฟรม ภาพเลื่อน 800 px/s readout เท่าไร
2. กล้อง global shutter แพนเร็วมาก เสาจะเป็นอย่างไร
ตัวเลขมาจากไหน: หลักการอ่านทีละแถวและสูตร เอียง = ความเร็ว × readout เป็นฟิสิกส์ของเซนเซอร์แบบ rolling (KB 157 และคู่มือกล้องและเลนส์ของ Sky) readout 18 ms ในโจทย์เป็นค่าที่เราตั้ง กล้องจริงต่างกันมาก ดูสเปกหรือวัดจาก plate ฉากสร้างด้วยโค้ด เป็นแบบง่าย: กล้องเลื่อนแนวนอนอย่างเดียว ไม่มี motion blur และแต่ละแถวอ่านใช้เวลาเท่ากัน