// ***************** Analyze with MLKit imageLabeler
val options = ImageLabelerOptions.Builder()
.setConfidenceThreshold(0.7f)
.build()
val imageLabeler = ImageLabeling.getClient(options)
val detectors = listOf(imageLabeler)
val analyzer = MlKitAnalyzer(
detectors,
ImageAnalysis.COORDINATE_SYSTEM_ORIGINAL,
executor
)
{
val labels = it.getValue(imageLabeler)
if (labels.isNullOrEmpty()) {
return@MlKitAnalyzer
}
var result = ""
for (label in labels) {
val text = label.text
val confidence = (label.confidence * 100).toInt()
val index = label.index
result = result + text + " " + confidence + "%\n"
}
Log.d(TAG, "*****************Image Labelling result $result")
}
val imageAnalysis = ImageAnalysis.Builder()
// Default is OUTPUT_IMAGE_FORMAT_YUV_420_888
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build()
imageAnalysis.setAnalyzer(executor, analyzer)
[1]: https://stackoverflow.com/questions/77795598/using-two-camerax-imageanalysis-analyzers?noredirect=1#comment137150195_77795598
MlKitAnalyzer
通过
ImageAnalysis
函数从
MlKitAnalyzer.analyze(ImageProxy)
获取图像进行分析。因此,您可以将自己的
ImageAnalysis.Analyzer
设置为
ImageAnalysis
,先自己获取
ImageProxy
,然后将其传递给自己
MlKitAnalyzer
,然后根据结果做任何您想做的事情。主要问题是如何将保存的
ImageProxy
(输入到
MlKitAnalyzer
)与
MlKitAnalyzer
给出的结果进行匹配,因为结果是异步给出的。解决方案在于
MlKitAnalyzer.Result.getTimestamp()
函数,该函数应根据文档提供输入
ImageProxy
的时间戳。因此,只需根据时间戳保存每个
ImageProxy
,然后从保存的数据中获取输入
ImageProxy
。
val imageProxyMap = HashMap<Long, ImageProxy>()
val mlKitAnalyzer = MlKitAnalyzer(
detectors,
ImageAnalysis.COORDINATE_SYSTEM_ORIGINAL,
executor
) {
// get the input image for this result
val inputImageProxy = imageProxyMap[it.timestamp]
val labels = it.getValue(imageLabeler)
if (labels.isNullOrEmpty()) {
return@MlKitAnalyzer
}
var result = ""
for (label in labels) {
val text = label.text
val confidence = (label.confidence * 100).toInt()
val index = label.index
result = result + text + " " + confidence + "%\n"
}
Log.d(TAG, "*****************Image Labelling result $result")
Log.d(TAG, "*****************Image input = $inputImageProxy")
}
val analyzer = ImageAnalysis.Analyzer { image ->
// save the input image and pass it to MlKitAnalyzer
imageProxyMap[image.image!!.timestamp] = image
mlKitAnalyzer.analyze(image)
}
val imageAnalysis = ImageAnalysis.Builder()
// Default is OUTPUT_IMAGE_FORMAT_YUV_420_888
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build()
imageAnalysis.setAnalyzer(executor, analyzer)
PS:虽然这回答了这个具体问题,但我不太确定你原来的问题[1]。看来您不仅需要两个单独的 ImageAnalysis.Analyzer
,而且实际上需要两个
ImageAnalysis
用例,因为您在一个中需要 YUV 格式,在另一个中需要 RGBA 格式。也许,您可以尝试了解如何将 YUV 格式转换为 RGBA。