如何降低 Android CameraX ImageAnalysis 的帧速率?
How to decrease frame rate of Android CameraX ImageAnalysis?
如何在图像分析中将帧速率降低到 1 fps,这样我就不会多次检测到条形码。在我的用例中,以 1 秒的间隔多次扫描相同的条形码应该会增加一个计数器。所以我希望它能正常工作。 (类似于商店收银台的产品扫描仪)
cameraX 版本:1.0.0-beta02
类似问题:
在此,答案基于 cameraX alpha 版本中的预览配置和分析配置构建器。但是在beta版本中找不到。
How to pause barcode scanning in android ML-kit when using ByteBuffer from SurfaceView
在此,图像分析受到限制,但我希望以较低的帧速率调用图像分析器。即从图像分析用例到图像分析器的调用应该是每秒一次。
当前实现:
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()
}
更好的解决方案会有所帮助。
private var firstDetected = true
for (barcode in barcodes) {
if (barcodes.size > 0 && firstDetected) {
LoggingUtility.writeLog("Analyzer",
"MLKitBarcode Result",
"Barcode is ${barcode.rawValue!!}")
firstDetected = false
}
}
这可能有帮助
您可以利用下一个分析只有在您关闭提供的 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()
}
完整的条码分析器代码
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()
}
}
}
}
}
如何在图像分析中将帧速率降低到 1 fps,这样我就不会多次检测到条形码。在我的用例中,以 1 秒的间隔多次扫描相同的条形码应该会增加一个计数器。所以我希望它能正常工作。 (类似于商店收银台的产品扫描仪)
cameraX 版本:1.0.0-beta02
类似问题:
在此,答案基于 cameraX alpha 版本中的预览配置和分析配置构建器。但是在beta版本中找不到。How to pause barcode scanning in android ML-kit when using ByteBuffer from SurfaceView
在此,图像分析受到限制,但我希望以较低的帧速率调用图像分析器。即从图像分析用例到图像分析器的调用应该是每秒一次。
当前实现:
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()
}
更好的解决方案会有所帮助。
private var firstDetected = true
for (barcode in barcodes) {
if (barcodes.size > 0 && firstDetected) {
LoggingUtility.writeLog("Analyzer",
"MLKitBarcode Result",
"Barcode is ${barcode.rawValue!!}")
firstDetected = false
}
}
这可能有帮助
您可以利用下一个分析只有在您关闭提供的 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()
}
完整的条码分析器代码
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()
}
}
}
}
}