Tin tức về sản phẩm

Làm sáng nguồn cấp dữ liệu camera theo thời gian thực bằng tính năng Tăng cường ánh sáng yếu

Đọc trong 7 phút
Donovan McMurray
Kỹ sư quan hệ với nhà phát triển

Gần đây, chúng tôi đã chia sẻ cách Instagram cho phép người dùng chụp ảnh thiếu sáng tuyệt đẹp bằng Chế độ ban đêm. Tính năng đó rất phù hợp với ảnh tĩnh, nơi có thời gian để kết hợp nhiều lần phơi sáng nhằm tạo ra một bức ảnh tĩnh chất lượng cao. Nhưng còn những khoảnh khắc xảy ra giữa các bức ảnh thì sao? Người dùng cần tương tác với camera nhiều hơn là chỉ trong khoảnh khắc nhấn nút chụp. Họ cũng sử dụng bản xem trước để bố cục cảnh hoặc quét mã QR.

Hôm nay, chúng ta sẽ tìm hiểu về tính năng Tăng cường ánh sáng yếu (LLB), một tính năng mạnh mẽ được thiết kế để làm sáng các luồng camera theo thời gian thực. Không giống như Chế độ ban đêm (yêu cầu thời gian chụp ảnh tĩnh), tính năng Tăng cường ánh sáng yếu hoạt động ngay lập tức trên bản xem trước trực tiếp và bản ghi video. LLB tự động điều chỉnh mức độ làm sáng cần thiết dựa trên ánh sáng hiện có, vì vậy, tính năng này được tối ưu hoá cho mọi môi trường.

Với bản cập nhật gần đây, LLB cho phép người dùng Instagram sắp xếp bức ảnh hoàn hảo, sau đó, việc triển khai Chế độ ban đêm hiện có sẽ mang lại những bức ảnh thiếu sáng chất lượng cao tương tự mà người dùng đã thưởng thức trong hơn một năm.

Tại sao độ sáng theo thời gian thực lại quan trọng

Mặc dù Chế độ ban đêm nhằm mục đích cải thiện chất lượng hình ảnh cuối cùng, nhưng tính năng Tăng cường ánh sáng yếu được thiết kế để cải thiện khả năng sử dụng và tính tương tác trong môi trường tối. Một yếu tố quan trọng khác cần cân nhắc là mặc dù hoạt động rất hiệu quả cùng nhau, nhưng bạn có thể sử dụng LLB và Chế độ ban đêm một cách độc lập. Bạn sẽ thấy trong một số trường hợp sử dụng này, LLB có giá trị riêng khi không cần ảnh Chế độ ban đêm. Sau đây là cách LLB cải thiện trải nghiệm người dùng:

  • Cải thiện việc tạo khung và chụp: Trong các cảnh thiếu sáng, bản xem trước camera tiêu chuẩn có thể tối đen. LLB làm sáng kính ngắm, cho phép người dùng thực sự nhìn thấy những gì họ đang lấy khung hình trước khi nhấn nút chụp. Để có trải nghiệm này, bạn có thể sử dụng Chế độ ban đêm để có kết quả ảnh thiếu sáng chất lượng tốt nhất hoặc bạn có thể để LLB mang lại cho người dùng kết quả ảnh "thấy sao chụp vậy".
  • Quét đáng tin cậy: Mã QR có ở khắp mọi nơi, nhưng việc quét mã QR trong một nhà hàng tối hoặc gara đỗ xe thường gây khó chịu. Với nguồn cấp dữ liệu từ camera sáng hơn đáng kể, các thuật toán quét có thể phát hiện và giải mã mã QR một cách đáng tin cậy ngay cả trong môi trường rất tối.
  • Tăng cường tương tác: Đối với các ứng dụng liên quan đến hoạt động tương tác bằng video trực tiếp (như trợ lý AI hoặc cuộc gọi video), LLB sẽ tăng lượng thông tin có thể nhận biết được, đảm bảo các mô hình thị giác máy tính có đủ dữ liệu để hoạt động

Sự khác biệt trong Instagram

LLB_IG_demo_white_background.gif

Nhóm kỹ thuật đằng sau ứng dụng Instagram dành cho Android luôn nỗ lực để mang đến trải nghiệm camera hiện đại cho người dùng. Bạn có thể thấy trong ví dụ ở trên sự khác biệt mà LLB tạo ra trên Pixel 10 Pro. 

lowlight.png

Bạn có thể dễ dàng hình dung sự khác biệt này trong trải nghiệm người dùng. Nếu người dùng không thể nhìn thấy những gì họ đang chụp, thì khả năng họ bỏ qua việc chụp sẽ cao hơn. 

lowlight1.png

Chọn cách triển khai

Có 2 cách để triển khai tính năng Tăng cường ánh sáng yếu nhằm mang lại trải nghiệm tốt nhất trên nhiều thiết bị nhất:

  1. Chế độ AE Tăng cường ánh sáng yếu: Đây là chế độ tự động phơi sáng ở lớp phần cứng. Chế độ này mang lại chất lượng và hiệu suất cao nhất vì tinh chỉnh trực tiếp quy trình bộ xử lý tín hiệu hình ảnh (ISP). Luôn kiểm tra chế độ này trước tiên.
  2. Tính năng Tăng cường ánh sáng yếu của Google: Nếu thiết bị không hỗ trợ chế độ AE, bạn có thể chuyển sang giải pháp dựa trên phần mềm này do Dịch vụ Google Play cung cấp. Giải pháp này áp dụng quy trình xử lý hậu kỳ cho luồng video của camera để làm sáng luồng đó. Là một giải pháp hoàn toàn bằng phần mềm, giải pháp này có trên nhiều thiết bị hơn, vì vậy, việc triển khai này giúp bạn tiếp cận nhiều thiết bị hơn bằng tính năng Tăng cường ánh sáng yếu.

Chế độ AE Tăng cường ánh sáng yếu (Phần cứng)

Cơ chế:
Chế độ này được hỗ trợ trên các thiết bị chạy Android 15 trở lên và yêu cầu OEM đã triển khai tính năng hỗ trợ trong HAL (hiện có trên các thiết bị Pixel 10). Chế độ này tích hợp trực tiếp với Bộ xử lý tín hiệu hình ảnh (ISP) của camera. Nếu bạn đặt CaptureRequest.CONTROL_AE_MODE thành CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY, hệ thống camera sẽ kiểm soát.

Hành vi:
HAL/ISP phân tích cảnh và điều chỉnh các tham số xử lý và cảm biến, thường bao gồm cả việc tăng thời gian phơi sáng, để làm sáng hình ảnh.Điều này có thể tạo ra các khung hình có tỷ lệ tín hiệu trên nhiễu (SNR) được cải thiện đáng kể vì thời gian phơi sáng kéo dài, thay vì tăng độ lợi của cảm biến kỹ thuật số (ISO), cho phép cảm biến thu thập thêm thông tin về ánh sáng.

Ưu điểm:
Có khả năng cải thiện chất lượng hình ảnh và hiệu suất sử dụng năng lượng vì tận dụng các đường dẫn phần cứng chuyên dụng.

Đánh đổi:
Có thể dẫn đến tốc độ khung hình thấp hơn trong điều kiện rất tối vì cảm biến cần nhiều thời gian hơn để thu thập ánh sáng. Tốc độ khung hình có thể giảm xuống thấp nhất là 10 khung hình/giây trong điều kiện ánh sáng rất yếu.

Tính năng Tăng cường ánh sáng yếu của Google (Phần mềm thông qua Dịch vụ Google Play)

Cơ chế:
Giải pháp này được phân phối dưới dạng mô-đun tuỳ chọn thông qua Dịch vụ Google Play, áp dụng quy trình xử lý hậu kỳ cho luồng video của camera. Giải pháp này sử dụng một công nghệ nâng cao hình ảnh theo thời gian thực tinh vi có tên là HDRNet.

Google HDRNet:
Mô hình học sâu này phân tích hình ảnh ở độ phân giải thấp hơn để dự đoán một tập hợp tham số nhỏ gọn (lưới song phương). Sau đó, lưới này hướng dẫn việc nâng cao hiệu quả, thay đổi theo không gian của hình ảnh có độ phân giải đầy đủ trên GPU. Mô hình này được huấn luyện để làm sáng và cải thiện chất lượng hình ảnh trong điều kiện ánh sáng yếu, tập trung vào khả năng hiển thị khuôn mặt.

Điều phối quy trình:
Mô hình HDRNet và logic đi kèm được điều phối bởi bộ xử lý Tăng cường ánh sáng yếu. Trong đó có:

  1. Phân tích cảnh:
    Một máy tính tuỳ chỉnh ước tính độ sáng thực của cảnh bằng cách sử dụng siêu dữ liệu camera (độ nhạy của cảm biến, thời gian phơi sáng, v.v.) và nội dung hình ảnh. Phân tích này xác định mức tăng cường.
  2. Xử lý HDRNet:
    Áp dụng mô hình HDRNet để làm sáng khung hình. Mô hình được sử dụng được điều chỉnh cho các cảnh thiếu sáng và được tối ưu hoá cho hiệu suất theo thời gian thực.
  3. Hoà trộn:
    Các khung hình gốc và khung hình được xử lý bằng HDRNet được hoà trộn. Lượng hoà trộn được áp dụng được kiểm soát động bởi máy tính độ sáng cảnh, đảm bảo quá trình chuyển đổi mượt mà giữa trạng thái tăng cường và không tăng cường.
low-light-boost-processor-diagram.png

Ưu điểm:
Hoạt động trên nhiều thiết bị hơn (hiện hỗ trợ Samsung S22 Ultra, S23 Ultra, S24 Ultra, S25 Ultra và Pixel 6 đến Pixel 9) mà không yêu cầu hỗ trợ HAL cụ thể. Duy trì tốc độ khung hình của camera vì đây là hiệu ứng xử lý hậu kỳ.

Đánh đổi:
Là một phương pháp xử lý hậu kỳ, chất lượng bị giới hạn bởi thông tin có trong các khung hình do cảm biến cung cấp. Phương pháp này không thể khôi phục các chi tiết bị mất do bóng tối cực độ ở cấp độ cảm biến.

Bằng cách cung cấp cả đường dẫn phần cứng và phần mềm, tính năng Tăng cường ánh sáng yếu mang đến một giải pháp có thể mở rộng để nâng cao hiệu suất camera thiếu sáng trên toàn bộ hệ sinh thái Android. Nhà phát triển nên ưu tiên chế độ AE khi có sẵn và sử dụng tính năng Tăng cường ánh sáng yếu của Google làm giải pháp dự phòng mạnh mẽ.

Triển khai tính năng Tăng cường ánh sáng yếu trong ứng dụng

Bây giờ, hãy xem cách triển khai cả hai tính năng Tăng cường ánh sáng yếu. Bạn có thể triển khai các tính năng sau đây cho dù bạn sử dụng CameraX hay Camera2 trong ứng dụng. Để có kết quả tốt nhất, bạn nên triển khai cả Bước 1 và Bước 2.

Bước 1: Chế độ AE Tăng cường ánh sáng yếu

Có trên một số thiết bị chạy Android 15 trở lên, Chế độ AE Tăng cường ánh sáng yếu hoạt động như một chế độ Tự động phơi sáng (AE) cụ thể.

1. Kiểm tra phạm vi cung cấp

Trước tiên, hãy kiểm tra xem thiết bị camera có hỗ trợ Chế độ AE Tăng cường ánh sáng yếu hay không.

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

2. Bật chế độ

Nếu được hỗ trợ, bạn có thể bật Chế độ AE Tăng cường ánh sáng yếu bằng đối tượng CameraControl của 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. Theo dõi trạng thái

Chỉ vì bạn yêu cầu chế độ này không có nghĩa là chế độ này hiện đang "tăng cường". Hệ thống chỉ kích hoạt tính năng tăng cường khi cảnh thực sự tối. Bạn có thể thiết lập một Trình quan sát để cập nhật giao diện người dùng (như hiển thị biểu tượng mặt trăng) hoặc chuyển đổi thành một Luồng bằng hàm mở rộng asFlow().

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

Bạn có thể đọc hướng dẫn đầy đủ về Chế độ AE Tăng cường ánh sáng yếu tại đây.

Bước 2: Tính năng Tăng cường ánh sáng yếu của Google

Đối với các thiết bị không hỗ trợ chế độ AE phần cứng, tính năng Tăng cường ánh sáng yếu của Google hoạt động như một giải pháp dự phòng mạnh mẽ. Giải pháp này sử dụng LowLightBoostSession để chặn và làm sáng luồng.

1. Thêm phần phụ thuộc

Tính năng này được cung cấp thông qua Dịch vụ 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. Khởi động ứng dụng

Trước khi bắt đầu camera, hãy sử dụng LowLightBoostClient để đảm bảo mô-đun được cài đặt và thiết bị được hỗ trợ.

  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. Tạo phiên LLB

Google LLB xử lý từng khung hình, vì vậy, bạn phải cung cấp Surface hiển thị cho LowLightBoostSession và hệ thống sẽ trả lại cho bạn một Surface đã áp dụng tính năng làm sáng. Đối với các ứng dụng Camera2, bạn có thể thêm Surface kết quả bằng CaptureRequest.Builder.addTarget(). Đối với CameraX, quy trình xử lý này phù hợp nhất với lớp CameraEffect, nơi bạn có thể áp dụng hiệu ứng bằng SurfaceProcessor và cung cấp lại cho Bản xem trước bằng SurfaceProvider, như trong mã này.

  // 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. Truyền siêu dữ liệu

Để thuật toán hoạt động, thuật toán cần phân tích trạng thái tự động phơi sáng của camera. Bạn phải truyền kết quả chụp trở lại phiên LLB. Trong CameraX, bạn có thể thực hiện việc này bằng cách mở rộng Preview.Builder bằng 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)
    }
  }
)

Bạn có thể tìm thấy các bước triển khai chi tiết cho ứng dụng và phiên trong hướng dẫn về tính năng Tăng cường ánh sáng yếu của Google.

Các bước tiếp theo

Bằng cách triển khai 2 lựa chọn này, bạn đảm bảo rằng người dùng có thể nhìn rõ, quét đáng tin cậy và tương tác hiệu quả, bất kể điều kiện ánh sáng.

Để xem các tính năng này hoạt động trong một cơ sở mã hoàn chỉnh, sẵn sàng cho bản phát hành chính thức, hãy xem  Ứng dụng camera Jetpack trên GitHub. Ứng dụng này triển khai cả Chế độ AE Tăng cường ánh sáng yếu và tính năng Tăng cường ánh sáng yếu của Google, cung cấp cho bạn một tài liệu tham khảo để tích hợp riêng. 

Tác giả:

Tiếp tục đọc