android - 使用 Android Camera2 API 和 Firebase ML-Kit Vision 进行实时条码处理
问题描述
在我的应用程序中,在尝试使用 ML-Kit Vision 库处理条形码时渲染预览确实很不稳定。我认为这是由于我对背景主题和可运行文件缺乏了解。
我已经按照一些 Googles / Firebase 快速入门指南设置了我的应用程序,并且 Camera2 预览工作正常。
我还设置了一个 onImageAvailableListener 回调
/**
* 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 发布到后台处理程序并在 BarcodeProcessor 中调用 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(image, 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上的示例帮助了我。也许会对你有所帮助https://github.com/firebase/quickstart-android/tree/master/mlkit
推荐阅读
- c - 程序在 gdb 中没有段错误
- python - 如何使用 SQLAlchemy 访问 Posgres DATE 列?
- r - 如何在 r 中使用 lme4 获得组内关联?
- c - 当我尝试使用 char * it 打印字符串时,指针中出现分段错误,为什么?
- reactjs - 设置 IconContext.Provider 光标值?(这与反应图标一起使用)
- python - seaborn count 绘制每条线以表示总计数和非零计数
- xml - XML XSLT 转换:将带前缀的命名空间添加到 rss 元素
- terraform - Terraform:AWS Codepipeline 多个 Codecommit 源
- html - 如何在主 div 内容中包含 Bootstrap v5 表
- c++ - 打印迭代器地址