ข่าวสารผลิตภัณฑ์

เพิ่มความสว่างให้กับฟีดกล้องแบบเรียลไทม์ด้วยการเพิ่มแสงในสภาวะแสงน้อย

ใช้เวลาอ่าน 7 นาที
Donovan McMurray
วิศวกรนักพัฒนาซอฟต์แวร์สัมพันธ์

เมื่อเร็วๆ นี้ เราได้แชร์ วิธีที่ Instagram ช่วยให้ผู้ใช้ถ่ายภาพที่สวยงามในสภาวะแสงน้อยโดยใช้โหมดกลางคืน ฟีเจอร์นี้เหมาะอย่างยิ่งสำหรับภาพนิ่ง ซึ่งมีเวลาในการรวมภาพที่ถ่ายด้วยการเปิดรับแสงหลายครั้งเพื่อสร้างภาพนิ่งคุณภาพสูง แต่จะทำอย่างไรกับช่วงเวลาที่เกิดขึ้น ระหว่าง ภาพ ผู้ใช้ต้องโต้ตอบกับกล้องมากกว่าแค่ช่วงเวลาที่กดปุ่มชัตเตอร์ นอกจากนี้ ผู้ใช้ยังใช้การแสดงตัวอย่างเพื่อจัดองค์ประกอบฉากหรือสแกนคิวอาร์โค้ดด้วย

วันนี้เราจะมาเจาะลึกการเพิ่มแสงในสภาวะแสงน้อย (LLB) ซึ่งเป็นฟีเจอร์ที่มีประสิทธิภาพที่ออกแบบมาเพื่อเพิ่มความสว่างให้กับวิดีโอสตรีมแบบเรียลไทม์จากกล้อง การเพิ่มแสงในสภาวะแสงน้อยจะทำงานทันทีในการแสดงตัวอย่างแบบสดและการบันทึกวิดีโอ ซึ่งแตกต่างจากโหมดกลางคืนที่ต้องใช้ระยะเวลาการถ่ายภาพแบบหยุดนิ่ง LLB จะปรับความสว่างที่จำเป็นโดยอัตโนมัติตามแสงที่มีอยู่ จึงได้รับการปรับให้เหมาะกับทุกสภาพแวดล้อม

การอัปเดตล่าสุดทำให้ LLB ช่วยให้ผู้ใช้ Instagram จัดองค์ประกอบภาพที่สมบูรณ์แบบได้ และการติดตั้งใช้งานโหมดกลางคืนที่มีอยู่จะส่งผลให้ได้ภาพถ่ายคุณภาพสูงในสภาวะแสงน้อยแบบเดียวกับที่ผู้ใช้ชื่นชอบมานานกว่า 1 ปี

เหตุผลที่ความสว่างแบบเรียลไทม์มีความสำคัญ

แม้ว่าโหมดกลางคืนจะมีเป้าหมายเพื่อปรับปรุงคุณภาพของภาพสุดท้าย แต่การเพิ่มแสงในสภาวะแสงน้อยมีไว้เพื่อการใช้งานและการโต้ตอบในสภาพแวดล้อมที่มืด อีกปัจจัยสำคัญที่ควรพิจารณาคือ แม้ว่า LLB และโหมดกลางคืนจะทำงานร่วมกันได้ดีมาก แต่คุณก็สามารถใช้ LLB และโหมดกลางคืนแยกกันได้ และคุณจะเห็นว่าในกรณีการใช้งานบางกรณี LLB มีคุณค่าในตัวเองเมื่อไม่จำเป็นต้องใช้ภาพถ่ายโหมดกลางคืน LLB ช่วยปรับปรุงประสบการณ์ของผู้ใช้ดังนี้

  • การจัดเฟรมและการถ่ายภาพที่ดีขึ้น: ในฉากที่มีแสงสลัว การแสดงตัวอย่างจากกล้องมาตรฐานอาจมืดสนิท LLB จะเพิ่มความสว่างให้กับช่องมองภาพ ทำให้ผู้ใช้เห็นสิ่งที่จัดเฟรมก่อนที่จะกดปุ่มชัตเตอร์ สำหรับประสบการณ์นี้ คุณสามารถใช้โหมดกลางคืนเพื่อให้ได้ภาพถ่ายคุณภาพดีที่สุดในสภาวะแสงน้อย หรือจะให้ LLB แสดงภาพถ่ายที่ได้ตรงกับที่เห็นก็ได้
  • การสแกนที่เชื่อถือได้: คิวอาร์โค้ดมีอยู่ทุกหนทุกแห่ง แต่การสแกนคิวอาร์โค้ดในร้านอาหารหรือโรงจอดรถที่มืดมิดมักจะน่าหงุดหงิด ฟีดกล้องที่สว่างขึ้นอย่างมากช่วยให้อัลกอริทึมการสแกนตรวจจับและถอดรหัสคิวอาร์โค้ดได้อย่างน่าเชื่อถือแม้ในสภาพแวดล้อมที่มืดมาก
  • การโต้ตอบที่เพิ่มขึ้น: สำหรับแอปที่เกี่ยวข้องกับการโต้ตอบผ่านวิดีโอแบบสด (เช่น ผู้ช่วย AI หรือวิดีโอคอล) LLB จะเพิ่มปริมาณข้อมูลที่รับรู้ได้ เพื่อให้มั่นใจว่าโมเดลคอมพิวเตอร์วิทัศน์มีข้อมูลเพียงพอที่จะทำงาน

ความแตกต่างใน Instagram

LLB_IG_demo_white_background.gif

ทีมวิศวกรรมที่อยู่เบื้องหลังแอป Instagram สำหรับ Android ทำงานอย่างหนักอยู่เสมอเพื่อมอบประสบการณ์การใช้งานกล้องที่ทันสมัยที่สุดแก่ผู้ใช้ คุณจะเห็นความแตกต่างที่ LLB สร้างขึ้นใน Pixel 10 Pro ได้จากตัวอย่างด้านบน

lowlight.png

คุณสามารถจินตนาการถึงความแตกต่างที่เกิดขึ้นกับประสบการณ์ของผู้ใช้ได้ง่ายๆ หากผู้ใช้มองไม่เห็นสิ่งที่กำลังถ่าย ก็มีโอกาสมากขึ้นที่จะเลิกถ่าย

lowlight1.png

การเลือกการติดตั้งใช้งาน

คุณสามารถติดตั้งใช้งานการเพิ่มแสงในสภาวะแสงน้อยได้ 2 วิธีเพื่อมอบประสบการณ์การใช้งานที่ดีที่สุดในอุปกรณ์ที่หลากหลายที่สุด

  1. โหมด AE การเพิ่มแสงในสภาวะแสงน้อย: นี่คือโหมดการเปิดรับแสงอัตโนมัติระดับฮาร์ดแวร์ โหมดนี้ให้คุณภาพและประสิทธิภาพสูงสุดเนื่องจากปรับแต่งไปป์ไลน์ของหน่วยประมวลผลสัญญาณภาพ (ISP) โดยตรง โปรดตรวจสอบโหมดนี้ก่อนเสมอ
  2. การเพิ่มแสงในสภาวะแสงน้อยของ Google: หากอุปกรณ์ไม่รองรับโหมด AE คุณสามารถใช้โซลูชันที่อิงตามซอฟต์แวร์นี้ซึ่งให้บริการโดยบริการ Google Play ได้ โซลูชันนี้จะใช้การประมวลผลภายหลังกับวิดีโอสตรีมจากกล้องเพื่อเพิ่มความสว่าง โซลูชันนี้เป็นโซลูชันที่อิงตามซอฟต์แวร์ทั้งหมด จึงพร้อมใช้งานในอุปกรณ์ต่างๆ มากขึ้น การติดตั้งใช้งานนี้จึงช่วยให้คุณเข้าถึงอุปกรณ์ต่างๆ ได้มากขึ้นด้วย LLB

โหมด AE การเพิ่มแสงในสภาวะแสงน้อย (ฮาร์ดแวร์)

กลไก:
โหมดนี้รองรับในอุปกรณ์ที่ใช้ Android 15 ขึ้นไป และต้องให้ OEM ติดตั้งใช้งานการรองรับใน HAL (ปัจจุบันพร้อมใช้งานในอุปกรณ์ Pixel 10) โหมดนี้ผสานรวมกับหน่วยประมวลผลสัญญาณภาพ (ISP) ของกล้องโดยตรง หากคุณตั้งค่า CaptureRequest.CONTROL_AE_MODE เป็น CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY ระบบกล้องจะควบคุม

ลักษณะการทำงาน:
HAL/ISP จะวิเคราะห์ฉากและปรับพารามิเตอร์ของเซ็นเซอร์และการประมวลผล ซึ่งมักจะรวมถึงการเพิ่มเวลาการเปิดรับแสง เพื่อเพิ่มความสว่างให้กับรูปภาพซึ่งอาจทำให้ได้เฟรมที่มีอัตราส่วนสัญญาณต่อสัญญาณรบกวน (SNR) ที่ดีขึ้นอย่างมาก เนื่องจากเวลาการเปิดรับแสงที่นานขึ้นแทนที่จะเพิ่มเกนของเซ็นเซอร์ดิจิทัล (ISO) ช่วยให้เซ็นเซอร์จับข้อมูลแสงได้มากขึ้น

ข้อได้เปรียบ:
คุณภาพของรูปภาพและประสิทธิภาพด้านพลังงานอาจดีขึ้นเนื่องจากใช้เส้นทางฮาร์ดแวร์เฉพาะ

ข้อเสีย:
อาจส่งผลให้อัตราเฟรมต่ำลงในสภาพแวดล้อมที่มืดมาก เนื่องจากเซ็นเซอร์ต้องใช้เวลามากขึ้นในการจับแสง อัตราเฟรมอาจลดลงเหลือ 10 FPS ในสภาพแวดล้อมที่มีแสงน้อยมาก

การเพิ่มแสงในสภาวะแสงน้อยของ Google (ซอฟต์แวร์ผ่านบริการ Google Play)

กลไก:
โซลูชันนี้ซึ่งเผยแพร่เป็นโมดูลที่ไม่บังคับผ่านบริการ Google Play จะใช้การประมวลผลภายหลังกับวิดีโอสตรีมจากกล้อง โซลูชันนี้ใช้เทคโนโลยีการปรับปรุงรูปภาพแบบเรียลไทม์ที่ซับซ้อนที่เรียกว่า HDRNet

Google HDRNet:
โมเดลการเรียนรู้เชิงลึกนี้จะวิเคราะห์รูปภาพที่ความละเอียดต่ำกว่าเพื่อคาดการณ์ชุดพารามิเตอร์ขนาดกะทัดรัด (กริดทวิภาคี) จากนั้นกริดนี้จะแนะนำการปรับปรุงรูปภาพแบบเต็มความละเอียดที่มีประสิทธิภาพและแตกต่างกันไปตามพื้นที่ใน GPU โมเดลนี้ได้รับการฝึกให้เพิ่มความสว่างและปรับปรุงคุณภาพของรูปภาพในสภาพแวดล้อมที่มีแสงน้อย โดยเน้นที่การมองเห็นใบหน้า

การจัดการเป็นกลุ่มกระบวนการ:
โมเดล HDRNet และตรรกะที่เกี่ยวข้องได้รับการจัดการเป็นกลุ่มโดยโปรเซสเซอร์การเพิ่มแสงในสภาวะแสงน้อย ซึ่งรวมถึงสิ่งต่อไปนี้

  1. การวิเคราะห์ฉาก:
    เครื่องคำนวณที่กำหนดเองซึ่งประมาณความสว่างของฉากจริงโดยใช้ข้อมูลเมตาของกล้อง (ความไวของเซ็นเซอร์ เวลาการเปิดรับแสง ฯลฯ) และเนื้อหาของรูปภาพ การวิเคราะห์นี้จะกำหนดระดับการเพิ่มแสง
  2. การประมวลผล HDRNet:
    ใช้โมเดล HDRNet เพื่อเพิ่มความสว่างให้กับเฟรม โมเดลที่ใช้ได้รับการปรับแต่งสำหรับฉากที่มีแสงน้อยและปรับให้เหมาะกับประสิทธิภาพแบบเรียลไทม์
  3. การผสม:
    เฟรมต้นฉบับและเฟรมที่ประมวลผลด้วย HDRNet จะถูกผสมเข้าด้วยกัน เครื่องคำนวณความสว่างของฉากจะควบคุมปริมาณการผสมที่ใช้แบบไดนามิก เพื่อให้มั่นใจว่ามีการเปลี่ยนผ่านที่ราบรื่นระหว่างสถานะที่มีการเพิ่มแสงและไม่มีการเพิ่มแสง
low-light-boost-processor-diagram.png

ข้อได้เปรียบ:
ทำงานในอุปกรณ์ที่หลากหลายมากขึ้น (ปัจจุบันรองรับ Samsung S22 Ultra, S23 Ultra, S24 Ultra, S25 Ultra และ Pixel 6 ถึง Pixel 9) โดยไม่จำเป็นต้องมีการรองรับ HAL ที่เฉพาะเจาะจง รักษาอัตราเฟรมของกล้องไว้เนื่องจากเป็นเอฟเฟกต์การประมวลผลภายหลัง

ข้อเสีย:
เนื่องจากเป็นวิธีการประมวลผลภายหลัง คุณภาพจึงถูกจำกัดโดยข้อมูลที่มีอยู่ในเฟรมที่เซ็นเซอร์ส่งมา จึงไม่สามารถกู้คืนรายละเอียดที่สูญหายไปเนื่องจากความมืดมิดที่ระดับเซ็นเซอร์

การเพิ่มแสงในสภาวะแสงน้อยมีทั้งเส้นทางฮาร์ดแวร์และซอฟต์แวร์ จึงเป็นโซลูชันที่รองรับการปรับขนาดได้เพื่อปรับปรุงประสิทธิภาพของกล้องในสภาวะแสงน้อยในระบบนิเวศ Android นักพัฒนาแอปควรให้ความสำคัญกับโหมด AE หากมี และใช้การเพิ่มแสงในสภาวะแสงน้อยของ Google เป็นตัวเลือกสำรองที่เชื่อถือได้

การติดตั้งใช้งานการเพิ่มแสงในสภาวะแสงน้อยในแอป

ตอนนี้เรามาดูวิธีติดตั้งใช้งานทั้ง 2 ข้อเสนอของ LLB กัน คุณสามารถติดตั้งใช้งานสิ่งต่อไปนี้ได้ไม่ว่าคุณจะใช้ CameraX หรือ Camera2 ในแอปก็ตาม เราขอแนะนำให้ติดตั้งใช้งานทั้งขั้นตอนที่ 1 และขั้นตอนที่ 2 เพื่อให้ได้ผลลัพธ์ที่ดีที่สุด

ขั้นตอนที่ 1: โหมด AE การเพิ่มแสงในสภาวะแสงน้อย

LLB โหมด AE พร้อมใช้งานในอุปกรณ์บางรุ่นที่ใช้ Android 15 ขึ้นไป และทำงานเป็นโหมดการเปิดรับแสงอัตโนมัติ (AE) ที่เฉพาะเจาะจง

1. ตรวจสอบความพร้อมให้บริการ

ก่อนอื่น ให้ตรวจสอบว่าอุปกรณ์กล้องรองรับ LLB โหมด AE หรือไม่

val cameraInfo = cameraProvider.getCameraInfo(cameraSelector)
val isLlbSupported = cameraInfo.isLowLightBoostSupported

2. เปิดใช้โหมด

หากรองรับ คุณสามารถเปิดใช้ LLB โหมด AE ได้โดยใช้ออบเจ็กต์ CameraControl ของ CameraX

// After setting up your camera, use the CameraInfo object to enable LLB AE Mode.
camera = cameraProvider.bindToLifecycle(...)

if (isLlbSupported) {
  try {
    // The .await() extension suspends the coroutine until the
    // ListenableFuture completes. If the operation fails, it throws
    // an exception which we catch below.
    camera?.cameraControl.enableLowLightBoostAsync(true).await()
  } catch (e: IllegalStateException) {
    Log.e(TAG, "Failed to enable low light boost: not available on this device or with the current camera configuration", e)
  } catch (e: CameraControl.OperationCanceledException) {
    Log.e(TAG, "Failed to enable low light boost: camera is closed or value has changed", e)
  }
}

3. ตรวจสอบสถานะ

การที่คุณขอโหมดนี้ไม่ได้หมายความว่าโหมดนี้จะ "เพิ่มแสง" อยู่ในขณะนี้ ระบบจะเปิดใช้งานการเพิ่มแสงเมื่อฉากมืดจริงเท่านั้น คุณสามารถตั้งค่า Observer เพื่ออัปเดต UI (เช่น แสดงไอคอนพระจันทร์) หรือแปลงเป็น Flow โดยใช้ฟังก์ชันส่วนขยาย asFlow()

if (isLlbSupported) {
  camera?.cameraInfo.lowLightBoostState.asFlow().collectLatest { state ->
    // Update UI accordingly
    updateMoonIcon(state == LowLightBoostState.ACTIVE)
  }
}

อ่านคู่มือฉบับเต็มเกี่ยวกับ Low Light Boost โหมด AE ได้ที่นี่

ขั้นตอนที่ 2: การเพิ่มแสงในสภาวะแสงน้อยของ Google

สำหรับอุปกรณ์ที่ไม่รองรับโหมด AE ของฮาร์ดแวร์ การเพิ่มแสงในสภาวะแสงน้อยของ Google จะทำหน้าที่เป็นตัวเลือกสำรองที่มีประสิทธิภาพ โดยใช้ LowLightBoostSession เพื่อสกัดกั้นและเพิ่มความสว่างให้กับวิดีโอสตรีม

1. เพิ่มการพึ่งพิง

ฟีเจอร์นี้ให้บริการผ่านบริการ Google Play

implementation("com.google.android.gms:play-services-camera-low-light-boost:16.0.1-beta06")
// Add coroutines-play-services to simplify Task APIs
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.10.2")

2. เริ่มต้นไคลเอ็นต์

ก่อนเริ่มกล้อง ให้ใช้ LowLightBoostClient เพื่อตรวจสอบว่าได้ติดตั้งโมดูลแล้วและอุปกรณ์ได้รับการรองรับ

val llbClient = LowLightBoost.getClient(context)

// Check support and install if necessary
val isSupported = llbClient.isCameraSupported(cameraId).await()
val isInstalled = llbClient.isModuleInstalled().await()

if (isSupported && !isInstalled) {
    // Trigger installation
    llbClient.installModule(installCallback).await()
}

3. สร้างเซสชัน LLB

การเพิ่มแสงในสภาวะแสงน้อยของ Google จะประมวลผลแต่ละเฟรม ดังนั้นคุณต้องส่ง Surface ของจอแสดงผลไปยัง LowLightBoostSession และระบบจะส่ง Surface ที่มีการเพิ่มแสงกลับมาให้คุณ สำหรับแอป Camera2 คุณสามารถเพิ่ม Surface ที่ได้ด้วย CaptureRequest.Builder.addTarget() สำหรับ CameraX ไปป์ไลน์การประมวลผลนี้จะสอดคล้องกับคลาส CameraEffect มากที่สุด ซึ่งคุณสามารถใช้เอฟเฟกต์กับ SurfaceProcessor และส่งกลับไปยังการแสดงตัวอย่างด้วย SurfaceProvider ได้ตามที่แสดงในโค้ดนี้

// With a SurfaceOutput from SurfaceProcessor.onSurfaceOutput() and a
// SurfaceRequest from Preview.SurfaceProvider.onSurfaceRequested(),
// create a LLB Session.
suspend fun createLlbSession(surfaceRequest: SurfaceRequest, outputSurfaceForLlb: Surface) {
  // 1. Create the LLB Session configuration
  val options = LowLightBoostOptions(
    outputSurfaceForLlb,
    cameraId,
    surfaceRequest.resolution.width,
    surfaceRequest.resolution.height,
    true // Start enabled
  )

  // 2. Create the session.
  val llbSession = llbClient.createSession(options, callback).await()

  // 3. Get the surface to use.
  val llbInputSurface = llbSession.getCameraSurface()

  // 4. Provide the surface to the CameraX Preview UseCase.
  surfaceRequest.provideSurface(llbInputSurface, executor, resultListener)

  // 5. Set the scene detector callback to monitor how much boost is being applied.
  val onSceneBrightnessChanged = object : SceneDetectorCallback {
    override fun onSceneBrightnessChanged(
      session: LowLightBoostSession,
      boostStrength: Float
    ) {
      // Monitor the boostStrength from 0 (no boosting) to 1 (maximum boosting)
    }
  }
  llbSession.setSceneDetectorCallback(onSceneBrightnessChanged, null)
}

4. ส่งข้อมูลเมตา

อัลกอริทึมต้องวิเคราะห์สถานะการเปิดรับแสงอัตโนมัติของกล้องจึงจะทำงานได้ คุณต้องส่งผลการจับภาพกลับไปยังเซสชัน LLB ใน CameraX คุณสามารถทำได้โดยขยาย Preview.Builder ด้วย Camera2Interop.Extender.setSessionCaptureCallback()

Camera2Interop.Extender(previewBuilder).setSessionCaptureCallback(
  object : CameraCaptureSession.CaptureCallback() {
    override fun onCaptureCompleted(
      session: CameraCaptureSession,
      request: CaptureRequest,
      result: TotalCaptureResult
    ) {
      super.onCaptureCompleted(session, request, result)
      llbSession?.processCaptureResult(result)
    }
  }
)

ดูขั้นตอนการติดตั้งใช้งานโดยละเอียดสำหรับไคลเอ็นต์และเซสชันได้ใน คู่มือการเพิ่มแสงในสภาวะแสงน้อยของ Google

ขั้นตอนถัดไป

การติดตั้งใช้งานทั้ง 2 ตัวเลือกนี้จะช่วยให้ผู้ใช้มองเห็นได้อย่างชัดเจน สแกนได้อย่างน่าเชื่อถือ และโต้ตอบได้อย่างมีประสิทธิภาพ ไม่ว่าสภาพแสงจะเป็นอย่างไร

หากต้องการดูฟีเจอร์เหล่านี้ในการทำงานภายในฐานของโค้ดที่สมบูรณ์และพร้อมใช้งานจริง โปรดดู แอปกล้อง Jetpack ใน GitHub แอปนี้ติดตั้งใช้งานทั้ง LLB โหมด AE และ การเพิ่มแสงในสภาวะแสงน้อยของ Google ซึ่งจะให้ข้อมูลอ้างอิงสำหรับการผสานรวมของคุณเอง

เขียนโดย

อ่านต่อ