Я пытаюсь сделать сканер штрих-кода, используя детектор штрих-кода ML kit, camera2 API и Kotlin.Что касается камеры2, я начинаю с примера Google camera2basic Что касается детектора штрих-кодов комплекта ML, я начинаю с документа: Сканирование штрих-кодов с помощью комплекта ML на Android
В Camera2BasicFragment/ createCameraPreviewSession метод, я добавил
previewRequestBuilder.addTarget(imageReader!!.surface)
, поэтому onImageAvailableListener вызывается каждый раз, когда изображение доступно.
В методе Camera2BasicFragment / setUpCameraOutputs я изменил ImageReader ImageFormat.JPEG
на ImageFormat YUV420_888
,поэтому в onImageAvailableListener ImageReader выдает YUV-изображение
Тогда вот мой onImageAvailableListener:
private val onImageAvailableListener = ImageReader.OnImageAvailableListener {
val metadata = FirebaseVisionImageMetadata.Builder()
.setWidth(480) // 480x360 is typically sufficient for
.setHeight(360) // image recognition
.setFormat(FirebaseVisionImageMetadata.IMAGE_FORMAT_YV12)
.setRotation(getRotationCompensation(cameraId, activity as Activity, context!!))
.build()
BarcodeReader(it.acquireNextImage(), detector, metadata, mListener).run()
}
В метаданных «ширина» и «высота» соответствуют указанным в документе ML kit doc, «формат»'является YV12 для обработки формата YUV
, а считыватель штрих-кода:
class BarcodeReader (private val image: Image,
private val detector: FirebaseVisionBarcodeDetector,
private val metadata: FirebaseVisionImageMetadata,
private val mListener: IBarcodeScanner) : Runnable {
override fun run() {
val visionImage = FirebaseVisionImage.fromByteBuffer(image.planes[0].buffer, metadata)
detector.detectInImage(visionImage)
.addOnSuccessListener { barcodes ->
// Task completed successfully
// [START_EXCLUDE]
// [START get_barcodes]
for (barcode in barcodes) {
val bounds = barcode.boundingBox
val corners = barcode.cornerPoints
val rawValue = barcode.rawValue
if (rawValue!=null)
mListener.onBarcode(rawValue)
}
// [END get_barcodes]
// [END_EXCLUDE]
}
.addOnFailureListener {
// Task failed with an exception
// ...
Log.d("barcode", "null")
}
image.close()
}
Detector.detectInImage входит в onSuccessListener, но не обнаруживается штрих-код: barcodes
массив всегда пуст.
Может кто-нибудь помочь мне, пожалуйста?