gpt4 book ai didi

安卓相机X |颜色检测

转载 作者:行者123 更新时间:2023-12-02 12:32:34 26 4
gpt4 key购买 nike

我在 Android 上使用新的 CameraX。

我做了一个基本应用程序(类似于“入门”),其中有一个相机预览和一个光度分析器。每一秒我都会在 TextView 中显示我的亮度。

现在,按照 CameraX 指南,我想进行颜色检测。每隔一秒左右,我都希望获得屏幕中央像素的颜色。

事实是我不知道如何按照与亮度分析仪相同的结构进行颜色检测。

亮度分析器类:

class LuminosityAnalyzer : ImageAnalysis.Analyzer {

private var lastTimeStamp = 0L
private val TAG = this.javaClass.simpleName
var luma = BehaviorSubject.create<Double>()

override fun analyze(image: ImageProxy, rotationDegrees: Int) {
val currentTimeStamp = System.currentTimeMillis()
val intervalInSeconds = TimeUnit.SECONDS.toMillis(1)
val deltaTime = currentTimeStamp - lastTimeStamp
if(deltaTime >= intervalInSeconds) {
val buffer = image.planes[0].buffer
val data = buffer.toByteArray()
val pixels = data.map { it.toInt() and 0xFF }
luma.onNext(pixels.average())
lastTimeStamp = currentTimeStamp
Log.d(TAG, "Average luminosity: ${luma.value}")
}


private fun ByteBuffer.toByteArray(): ByteArray {
rewind()
val data = ByteArray(remaining())
get(data)
return data
}
}

主要 Activity :

/* display the luminosity */
private fun createLuminosityAnalyzer(): ImageAnalysis{
val analyzerConfig = ImageAnalysisConfig.Builder().apply {
setLensFacing(lensFacing)
setImageReaderMode(ImageAnalysis.ImageReaderMode.ACQUIRE_LATEST_IMAGE)
}.build()

val analyzer = ImageAnalysis(analyzerConfig).apply {
val luminosityAnalyzer = LuminosityAnalyzer()
luminosityAnalyzer.luma
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
// success
luminosity.text = it.toString()
},{
// error
Log.d(TAG, "Can not get luminosity :(")
})
setAnalyzer(executor, luminosityAnalyzer)
}
return analyzer
}

我怎样才能做一些与色彩分析仪相当的事情?

最佳答案

如评论中所述,如果您的目标是仅获取中心像素颜色,则将整个 YUV 图像转换为位图然后分析中心值的逻辑可能非常低效。您可以通过瞄准正确的像素直接查看 YUV 图像中的颜色。在 YUV 图像中,您有三个平面,一个用于 Y(每像素 1 字节)和 U 和 V 平面(每像素 .5 字节,交错)。无论旋转如何,忽略此刻作为中心像素的旋转应该是相同的(丢弃高度或宽度奇值的可能性)。获取中心像素 rgb 值的有效逻辑如下所示:

planes = imageProxy.getPlanes()

val height = imageProxy.getHeight()
val width = imageProxy.getWidth()

// You may have to find the logic to get array from ByteBuffer
// Y
val yArr = planes[0].buffer.array()
val yPixelStride = planes[0].getPixelStride()
val yRowStride = planes[0].getRowStride()

// U
val uArr = planes[1].buffer.array()
val uPixelStride = planes[1].getPixelStride()
val uRowStride = planes[1].getRowStride()

// V
val vArr = planes[2].buffer.array()
val vPixelStride = planes[2].getPixelStride()
val vRowStride = planes[2].getRowStride()

val y = yArr[(height * yRowStride + width * yPixelStride) / 2] & 255
val u = (uArr[(height * uRowStride + width * uPixelStride) / 4] & 255) - 128
val v = (vArr[(height * vRowStride + width * vPixelStride) / 4] & 255) - 128

val r = y + (1.370705 * v);
val g = y - (0.698001 * v) - (0.337633 * u);
val b = y + (1.732446 * u);

引用魔法值:https://en.wikipedia.org/wiki/YUV#Y%E2%80%B2UV420sp_(NV21)_to_RGB_conversion_(Android)

尝试在您的 Kotlin 代码中使用此逻辑,看看它是否正常工作以及是否可以快速进行实时操作。这肯定会将 O(height * width) 操作减少到常数时间复杂度。

关于安卓相机X |颜色检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59613886/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com