Я пытаюсь написать сканер QR-кода в реальном времени, используя комплект ML и просмотр камеры . Тем не менее, ни успех, ни провал никогда не вызывают. Я попытался изменить формат изображения (даже несмотря на то, что документация о просмотре камеры указывает NV21), но ничего не изменилось.
class ScanningQrActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_scan_qr)
camera_view.setLifecycleOwner(this)
val options = FirebaseVisionBarcodeDetectorOptions.Builder()
.setBarcodeFormats(FirebaseVisionBarcode.FORMAT_QR_CODE)
.build()
camera_view.addFrameProcessor {
extractDataFromFrame(it, options) {
Log.e("QR Callback: ", it)
}
}
}
private fun getVisionImageFromFrame(frame : Frame) : FirebaseVisionImage {
val data = frame.data
val imageMetaData = FirebaseVisionImageMetadata.Builder()
.setFormat(FirebaseVisionImageMetadata.IMAGE_FORMAT_NV21)
.setRotation(frame.rotation)
.setHeight(frame.size.height)
.setWidth(frame.size.width)
.build()
val image = FirebaseVisionImage.fromByteArray(data, imageMetaData)
return image
}
private fun extractDataFromFrame(frame: Frame, options: FirebaseVisionBarcodeDetectorOptions, callback: (String) -> Unit) {
val objectDetector = FirebaseVision.getInstance().getVisionBarcodeDetector(options)
objectDetector.detectInImage(getVisionImageFromFrame(frame))
.addOnSuccessListener { objects ->
objects.forEach { item ->
Log.e("QR: ", item.rawValue)
}
callback(objects.first().rawValue!!)
}
.addOnFailureListener {
callback("Unable to detect an object")
}
}
}