使用Android Camera2 API和Firebase ML Kit Vision进行实时条形码处理
在我的应用程序中,在试图使用ML Kit Vision库处理条形码时,呈现预览非常不稳定。我想这是因为我对背景音乐和Runnable缺乏了解 我已经按照Google/Firebase的一些快速入门指南安装了我的应用程序,Camera2预览效果很好 我还设置了onImageAvailableListener回调使用Android Camera2 API和Firebase ML Kit Vision进行实时条形码处理,android,kotlin,android-camera2,firebase-mlkit,Android,Kotlin,Android Camera2,Firebase Mlkit,在我的应用程序中,在试图使用ML Kit Vision库处理条形码时,呈现预览非常不稳定。我想这是因为我对背景音乐和Runnable缺乏了解 我已经按照Google/Firebase的一些快速入门指南安装了我的应用程序,Camera2预览效果很好 我还设置了onImageAvailableListener回调 /** * This a callback object for the [ImageReader]. "onImageAvailable" will be called when a
/**
* This a callback object for the [ImageReader]. "onImageAvailable" will be called when a
* preview frame is ready to be processed.
*/
private val onImageAvailableListener = ImageReader.OnImageAvailableListener {
// Processing code here
}
这是我的第一次尝试。使用mediaImage发布到后台处理程序,并在条形码处理器中调用image.close()
/**
* This a callback object for the [ImageReader]. "onImageAvailable" will be called when a
* preview frame is ready to be processed.
*/
private val onImageAvailableListener = ImageReader.OnImageAvailableListener {
val mediaImage = it.acquireNextImage()
backgroundHandler?.post(BarcodeProcessor(mediaImage, barcodeDetector))
}
internal class BarcodeProcessor(
private val image: Image,
private val barcodeDetector: FirebaseVisionBarcodeDetector
) : Runnable {
override fun run() {
Log.d(TAG, "run")
try {
val firebaseVisionImage = FirebaseVisionImage.fromMediaImage(image, 1)
// ... more processing
} catch (e: IOException) {
Log.e(TAG, e.toString())
} finally {
image.close()
}
}
companion object {
/**
* Tag for the [Log].
*/
private val TAG = "BarcodeProcessor"
}
}
问题是onImageAvailableListener将多个图像中的内容发布到backgroundHandler,而没有及时关闭它们。val firebaseVisionImage=firebaseVisionImage.fromMediaImage(图像,1)速度非常慢,这也是问题的一部分
第二次尝试
在这里,我尝试在调用backgroundHandler
后立即关闭图像。这种方法的问题是图像已经在backgroundHandler
/**
* This a callback object for the [ImageReader]. "onImageAvailable" will be called when a
* preview frame is ready to be processed.
*/
private val onImageAvailableListener = ImageReader.OnImageAvailableListener {
val mediaImage = it.acquireNextImage()
backgroundHandler?.post(BarcodeProcessor(mediaImage, barcodeDetector))
mediaImage.close()
}
internal class BarcodeProcessor(
private val image: Image,
private val barcodeDetector: FirebaseVisionBarcodeDetector
) : Runnable {
override fun run() {
Log.d(TAG, "run")
try {
val firebaseVisionImage = FirebaseVisionImage.fromMediaImage(image, 1)
// ... more processing
} catch (e: IOException) {
Log.e(TAG, e.toString())
} finally {
}
}
companion object {
/**
* Tag for the [Log].
*/
private val TAG = "BarcodeProcessor"
}
}
任何帮助/提示/指导都将不胜感激。我现在正在学习通过摄像头扫描条形码,github上的示例对我有所帮助。也许会对你有帮助
查看类
CameraSource
图像在FirebaseVisionImage.fromMediaImage(图像,1)
中使用后应首先关闭,因此在该行之后写入image.close()
,并删除mediaImage.close()
@MortenHolmgaard立即调用close仍然会导致处理速度非常慢。因为我也玩了很多,最后跳过了使用ML Kit,因为我无法正确执行它。我最终降低了曲面的分辨率,一切都变得更快。OP询问使用Camera2 API的解决方案,您提供了使用Camera类的链接,但该类不提供问题。