หน้าแรก · Lab · Tracking และ matchmove

TR5 Lens distortion: undistort แล้ว redistort เฉพาะ CG

แก้เลนส์ให้เส้นตรง แล้วส่ง CG ผ่านเลนส์เดียวกันกับ plate

Tracking และ matchmove · ~9 นาที · ฟรี

1 อธิบาย

เลนส์ทุกตัวบิดภาพ เส้นตรงจะโค้งมากขึ้นเมื่อเข้าใกล้ขอบเฟรม CG ที่เรนเดอร์จากกล้องที่ไม่มีเลนส์จึงเข้ากับ plate ตรงกลาง แต่ลื่นที่ขอบ

ตั้ง ภาพ เป็น grid chart (เลนส์เดียวกัน) แล้วเลื่อน k จนค่าความโค้งของเส้นตรงใกล้ 0 จากนั้นกลับไปที่ plate ตั้ง ทาง CG เป็น Redistort CG ด้วย k ของคุณ แล้วเล่น shot ดูค่าของกรวยที่ขอบเทียบกับกรวยตรงกลาง ตอนไม่มีเลนส์ กรวยที่ขอบคลาดได้ถึงราว 12 px ส่วนตรงกลางราว 0.6 px

plate → undistort (track only) · CG → redistort → over untouched plate

2 ลงมือลอง

โจทย์: solve เลนส์ให้เส้นตรงโค้งไม่เกิน 0.5 px แล้ว redistort CG จนกรวยที่ขอบคลาดไม่เกิน 1 px ตลอด shot

ดูเส้นของ grid ใกล้ขอบเฟรมเทียบกับเส้นประตรงอ้างอิง ไม่ใช่ตรงกลาง เปิด ดูแบบ undistort เพื่อเห็นผลของ k แล้วตัดสินจากกรวยที่ขอบระหว่างเล่น shot

SkyVFX Lab · TR5interactive · 1001

3 เจาะลึก

ทำไมลื่นแค่ที่ขอบ

เลนส์บิดภาพน้อยตรงกลางและมากขึ้นไปทางขอบ กล้อง CG ไม่มีเลนส์ จึงวางของได้ตรงกับ plate ที่กลางเฟรม แต่ยิ่งออกไปทางขอบ ตำแหน่งยิ่งต่างกัน และเมื่อกล้องขยับ ของที่เคลื่อนผ่านเฟรมจะเห็นเป็นการลื่น

ดังนั้นถ้าตรงกลางติดดีแต่ขอบลื่น อย่าเพิ่ง track ใหม่ ให้ตรวจเลนส์ก่อน

ตรวจที่ขอบเฟรมทุกครั้ง ตรงกลางดีอย่างเดียวยังไม่พอ

ลำดับที่ถูกต้อง

undistort plate เพื่อใช้ track และงาน 3D เท่านั้น เอากล้องหรือ corner pin ที่ได้ไปใช้กับ CG แล้ว redistort เฉพาะ CG ก่อน Merge ลงบน plate ที่ไม่ได้แตะ

ถ้ามี grid ที่ถ่ายผ่านเลนส์เดียวกัน ให้ solve จาก grid การ solve ยังประมาณจุดศูนย์กลางเลนส์ด้วย ซึ่งในเลนส์จริงมักไม่ตรงกลางเฟรม

  1. 1Solve เลนส์จาก grid
  2. 2Undistort plate (track เท่านั้น)
  3. 3Track / solve
  4. 4เรนเดอร์ CG + overscan
  5. 5Redistort เฉพาะ CG
  6. 6Merge บน plate เดิม

ทำไมห้าม redistort ทั้ง plate

undistort ทั้ง plate แล้ว comp แล้ว redistort ทั้งหมด ทำให้ plate ถูก filter เพิ่มสองรอบโดยไม่จำเป็น plate ที่ส่งออกต้องไม่ถูก resample เลย

LensDistortion แต่ละตัวคือการ resample หนึ่งรอบ จึงไม่ควรให้ plate ผ่าน undistort/redistort และ filter เฉพาะ CG

ลำดับการ filter
plate → undistort → CornerPinplate ถูก resample อย่างน้อยหนึ่งรอบ ใช้ track ได้ แต่ห้ามเป็นภาพที่ส่ง
CG → CornerPin → redistortresample เฉพาะ CG
plate เดิม → Mergeplate ไม่ถูก filter เลย

Overscan สำหรับ redistort

การ redistort ดึงพิกเซลจากนอกเฟรมเข้ามา ถ้า CG เรนเดอร์พอดีเฟรม จะเกิดขอบดำบาง ๆ ที่ขอบภาพหลัง redistort จึงต้องเรนเดอร์ CG หรือตั้ง ScanlineRender ให้มี overscan

ถ้าใส่ Crop เพื่อลด bbox ต้องไม่ตัดพิกเซล overscan เหล่านั้นทิ้ง

ดูขอบเฟรมหลัง redistort ด้วย gain สูง ขอบดำบาง ๆ จะโผล่ให้เห็น

เลนส์เป็นส่วนหนึ่งของ solve

focal length, distortion และ rotation ของกล้องเป็นคำตอบชุดเดียวกัน อย่าแก้ค่าใดค่าหนึ่งเอง ถ้าต้องการเลนส์อื่นให้ solve ใหม่

เก็บ LensDistortion ตัวหลักไว้ใน backdrop แล้ว copy ไปใช้ จะได้ไม่มีใครแก้ค่าโดยไม่ตั้งใจแล้วลามไปทั้ง script

4 ในงานจริง

ทำใน Nuke

  1. LensDistortion บน grid: แท็บ Analysis → Detect แก้จุดที่ขอบที่ผิด หรือวางเส้นเองด้วย Line Drawing Tools แล้ว Solve
  2. copy LensDistortion ตั้งเป็น undistort ใส่บน plate สำหรับ track และ solve กล้องเท่านั้น
  3. ScanlineRender ด้วยกล้องที่ solve ได้ และตั้ง overscan ไว้
  4. copy LensDistortion ตั้งเป็น redistort ใส่เฉพาะ CG หรือ output เป็น STMap แล้วใช้ node STMap กับ CG
  5. Merge (over) CG ลงบน plate ที่ไม่ได้ undistort
  6. ตรวจ: Merge (difference) comp กับ plate ต้องได้ 0 นอก element

พลาดบ่อย → แก้ยังไง

  • ✗ undistort plate แล้วส่ง plate ที่ undistort ออกไป✓ ใช้ภาพ undistort แค่ track และ solve ส่วน plate ที่ส่งต้องเป็นตัวเดิม
  • ✗ redistort ทั้ง comp แทนที่จะทำแค่ CG✓ redistort เฉพาะ CG แล้ว Merge ลงบน plate ที่ไม่ถูกแตะ
  • ✗ CG ไม่มี overscan หลัง redistort มีขอบดำ✓ เรนเดอร์ CG หรือตั้ง ScanlineRender ให้มี overscan และอย่าให้ Crop ตัดทิ้ง
  • ✗ เช็กแค่ตรงกลางเฟรมแล้วบอกว่าติดแล้ว✓ เล่นช็อตแล้วดูที่ขอบเฟรมทุกครั้ง
  • ✗ เปลี่ยน focal หรือค่า distortion เองหลัง solve✓ ถือว่าเป็นคำตอบชุดเดียวกัน ถ้าจะเปลี่ยนให้ solve ใหม่

เช็กก่อนส่งช็อต

  • grid หลัง undistort ดูตรงทั้งเฟรม รวมถึงมุม
  • เล่นช็อตแล้ว CG ที่ขอบเฟรมไม่ลื่น ไม่ใช่แค่ตรงกลาง
  • redistort ใส่เฉพาะ CG และ plate ไม่ถูก undistort
  • ขอบเฟรมหลัง redistort ไม่มีขอบดำ
  • difference ระหว่าง comp กับ plate เป็น 0 นอก element
  • ค่าเลนส์ทุกตัว copy มาจาก LensDistortion ตัวหลัก

5 เช็กตัวเอง

เช็กตัวเอง 1 ข้อ

กรวยตรงกลางเฟรมติดพื้นดี แต่กรวยที่ขอบซ้ายขวาลื่น สาเหตุน่าจะเป็นอะไร

สิ่งที่ได้เรียน

🔒 ตอบคำถามด้านบนก่อน แล้วการ์ดนี้จะเปิด

คำถามเพิ่ม

1. ทำไม CG ที่จะ redistort ต้องเรนเดอร์แบบ overscan

2. ลำดับไหนถูกต้องสำหรับวาง CG ลงบน plate ที่มี lens distortion

ตัวเลขมาจากไหน: shot มือถือ 48 เฟรม (640×360) เรนเดอร์ใน Blender (Cycles) จากฉากทะเลทรายของเรา เพิ่มจอเขียวบนเสาและโดรนบินผ่าน เฟรม 1 คือกล้องเดียวกับ plate นิ่ง ตำแหน่งจริงของทุกจุดมาจาก 3D ของฉากเอง (truth.json, dist.f32) ภาพคำนวณในเบราว์เซอร์ ความบิดเป็นเลนส์แบบสอนหลักการที่เราใส่เอง (radial เทอมเดียว k = 0.06 ปรับขนาดให้มุมยังอยู่ในภาพที่เรนเดอร์) เลนส์จริงต้องใช้ model ของ solver เอง CG แบบ “ไม่มี lens” ใช้กล้องที่ focal ซึมการขยายกลางเฟรมของเลนส์ไว้ เหมือน solve ที่ไม่มี lens model (ค่าประมาณเพื่อสอน) ตำแหน่งจริงของกรวยมาจากกล้องในฉากที่เราเรนเดอร์เอง