簡體   English   中英

如何降低 Android CameraX ImageAnalysis 的幀率?

[英]How to decrease frame rate of Android CameraX ImageAnalysis?

如何在圖像分析中將幀速率降低到 1 fps,這樣我就不會多次檢測到條形碼。 在我的用例中,以 1 秒的間隔多次掃描相同的條形碼應該增加一個計數器。 所以我希望它能夠正常工作。 (類似於商店收銀台的產品掃描儀)

cameraX 版本:1.0.0-beta02

類似的問題:

當前實施:

https://proandroiddev.com/update-android-camerax-4a44c3e4cdcc
遵循此文檔,以限制圖像分析。

override fun analyze(image: ImageProxy) {
    val currentTimestamp = System.currentTimeMillis()
    if (currentTimestamp - lastAnalyzedTimestamp >= TimeUnit.SECONDS.toMillis(1)) {
        // Image analysis code
    }
    image.close()
}

更好的解決方案會有所幫助。

您可以利用在關閉提供的 ImageProxy 之前不會開始下一次分析的事實。

就我而言,我只是讓線程進入睡眠狀態,因為我的分析器的執行器是單線程執行器。

class MyAnalyzer : ImageAnalysis.Analyzer {
    override fun analyze(image: ImageProxy) {
        val elapsedAnalysisTime = measureTimeMillis {
            // do your stuff here
        }
        image.use {
            if (elapsedAnalysisTime < 1000) {
                Thread.sleep(1000 - elapsedAnalysisTime)
            }
        }
    }
}

嘗試了 bmdelacruz 的解決方案。 關閉圖像時遇到問題。
收到與此類似的錯誤。
無法讓它工作。

使用delay對我來說效果很好。

代碼

CoroutineScope(Dispatchers.IO).launch {
    delay(1000 - (System.currentTimeMillis() - currentTimestamp))
    imageProxy.close()
}

完整的 BarcodeAnalyser 代碼

class BarcodeAnalyser(
    private val onBarcodesDetected: (barcodes: List<Barcode>) -> Unit,
) : ImageAnalysis.Analyzer {
    private val barcodeScannerOptions = BarcodeScannerOptions.Builder()
        .setBarcodeFormats(Barcode.FORMAT_ALL_FORMATS)
        .build()
    private val barcodeScanner = BarcodeScanning.getClient(barcodeScannerOptions)
    var currentTimestamp: Long = 0

    override fun analyze(
        imageProxy: ImageProxy,
    ) {
        currentTimestamp = System.currentTimeMillis()
        imageProxy.image?.let { imageToAnalyze ->
            val imageToProcess =
                InputImage.fromMediaImage(imageToAnalyze, imageProxy.imageInfo.rotationDegrees)
            barcodeScanner.process(imageToProcess)
                .addOnSuccessListener { barcodes ->
                    // Success handling
                }
                .addOnFailureListener { exception ->
                    // Failure handling
                }
                .addOnCompleteListener {
                    CoroutineScope(Dispatchers.IO).launch {
                        delay(1000 - (System.currentTimeMillis() - currentTimestamp))
                        imageProxy.close()
                    }
                }
        }
    }
}

private var firstDetected = true

for (barcode in barcodes) {
            if (barcodes.size > 0 && firstDetected) {
                LoggingUtility.writeLog("Analyzer",
                        "MLKitBarcode Result",
                        "Barcode is ${barcode.rawValue!!}")
                firstDetected = false
       }
}

這可能會有所幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM