写点什么

CameraX ImageAnalysis

作者:Changing Lin
  • 2021 年 12 月 21 日
  • 本文字数:1352 字

    阅读完需:约 4 分钟

1.背景

  • CameraX 是一个旨在帮助开发者简化相机应用开发工作的 Jetpack 支持库。

  • 它支持多种诸如 ImageCapture、Preview 和 ImageAnalysis 这种可以和 ML Kit 或 TensorFlow Lite 无缝结合的使用场景。

  • CameraX 使用 YUV420_888 来生成图像,该格式有 8 位的 Luma(Y)、Chroma(U, V) 和 Paddings(P) 三个通道。

  • YUV 是一种通用且灵活的格式。

2.原理

  • YUV_420_888 格式,YUV 格式也可以被称为 "YCbCr",它包括平面 (planar,如 I420)、半平面 (semi-planar,如 NV21/NV12) 和打包 (packed,如 UYVY) 格式。

  • YUV_420_888 是一种通用的 YCbCr 格式,它能够表示任何 4:2:0 色度二次采样的平面或半平面缓冲区 (但不完全交错),每个颜色样本有 8 位。且能够保证 Y 平面不会与 U/V 平面交错 (且像素步长始终为 1),以及 U/V 平面总是具有相同的行步长和像素步长。

  • RGBA_8888 是一种标准的具有红、绿、蓝和 alpha 通道的 RGB 格式,每个通道有 8 位。主要的转换对象是 RGB 颜色空间,RGB 因为色差变化较少,相对来说比较简单。

3.使用 ImageAnalysis 输出 RGBA_8888 的图片输出格式

            val imageAnalyzer = ImageAnalysis.Builder()                    .setOutputImageFormat(ImageAnalysis.OUTPUT_IMAGE_FORMAT_RGBA_8888)//                    .setTargetResolution(Size(720, 1080))                    .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)                    .build()
imageAnalyzer.also { it.setAnalyzer(cameraExecutor, LuminosityAnalyzer { luma -> Log.d(TAG, "Average luminosity: $luma") }) } private class LuminosityAnalyzer(private val listener: LumaListener) : ImageAnalysis.Analyzer {
private fun ByteBuffer.toByteArray(): ByteArray { rewind() // Rewind the buffer to zero val data = ByteArray(remaining()) get(data) // Copy the buffer into a byte array return data // Return the byte array }
override fun analyze(image: ImageProxy) { Log.e(TAG, "analyze: ${image.height} ${image.width} ${image.format}") if(image.format == PixelFormat.RGBA_8888){ val buffer = image.planes[0].buffer val R = buffer.get(0) and 0xff.toByte() val G = buffer.get(1) and 0xff.toByte() val B = buffer.get(2) and 0xff.toByte() val A = buffer.get(3) and 0xff.toByte()
Log.e(TAG, "analyze: $R $G $B $A ${buffer.toString()} ${image.planes.size} ${buffer.capacity()}") }else { val buffer = image.planes[0].buffer val data = buffer.toByteArray() val pixels = data.map { it.toInt() and 0xFF } val luma = pixels.average()
listener(luma) } image.close() } }
复制代码


发布于: 3 小时前阅读数: 5
用户头像

Changing Lin

关注

获得机遇的手段远超于固有常规之上~ 2020.04.29 加入

我能做的,就是调整好自己的精神状态,以最佳的面貌去面对那些未曾经历过得事情,对生活充满热情和希望。

评论

发布
暂无评论
CameraX ImageAnalysis