![](/img/trans.png)
[英]How to increase frame rate with Android CameraX ImageAnalysis?
[英]How to decrease frame rate of Android CameraX ImageAnalysis?
如何在圖像分析中將幀速率降低到 1 fps,這樣我就不會多次檢測到條形碼。 在我的用例中,以 1 秒的間隔多次掃描相同的條形碼應該增加一個計數器。 所以我希望它能夠正常工作。 (類似於商店收銀台的產品掃描儀)
cameraX 版本:1.0.0-beta02
類似的問題:
如何使用 Android CameraX ImageAnalysis 提高幀率?
在此,答案基於 cameraX alpha 版本中的預覽配置和分析配置 Builders。 但它在 beta 版本中找不到。
從 SurfaceView 使用 ByteBuffer 時如何在 android ML-kit 中暫停條碼掃描
在這種情況下,圖像分析受到限制,但我希望對圖像分析器的調用以較低的幀速率進行。 即從圖像分析用例到圖像分析器的調用應該每秒一次。
當前實施:
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.