获取MLKitAnalyzer使用的图像

问题描述 投票:0回答:1
下面使用的 MLKitAnalyzer 将在 labels 变量中显示找到的对象。但我还需要访问这些标签所基于的图像。我想对 MLKitAnalyzer 使用的图像进行进一步分析,如[此处][1]所述。我如何访问图像?

// ***************** 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
    
android image image-processing android-camerax google-mlkit
1个回答
0
投票

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。

© www.soinside.com 2019 - 2024. All rights reserved.