Android MLKit仅在屏幕中央扫描QRcode
我实现了firebase MLKit来扫描QRCode,它正在扫描,但它正在扫描屏幕上的所有QRCode。 我只需要扫描中心捕获的QRCode(中心有arrow ImageView),我怎么做 我试图打开Analisys函数(在analysisUseCase?.setAnalyzer中) imageProxy.cropRect() 我尝试使用processImageProxy函数。 但是没有成功,我想我不能接受这个Android MLKit仅在屏幕中央扫描QRcode,android,firebase,firebase-mlkit,Android,Firebase,Firebase Mlkit,我实现了firebase MLKit来扫描QRCode,它正在扫描,但它正在扫描屏幕上的所有QRCode。 我只需要扫描中心捕获的QRCode(中心有arrow ImageView),我怎么做 我试图打开Analisys函数(在analysisUseCase?.setAnalyzer中) imageProxy.cropRect() 我尝试使用processImageProxy函数。 但是没有成功,我想我不能接受这个 class QrcodeScanner( private val
class QrcodeScanner(
private val onQrCapture: Barcode.() -> Unit,
private val onFailure: Throwable.() -> Unit,
private val lifecycleOwner: LifecycleOwner,
private val context: Context,
private val previewView: PreviewView
) {
private var cameraSelector: CameraSelector = CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build()
private var cameraProvider: ProcessCameraProvider? = null
private var previewUseCase: Preview? = null
private var analysisUseCase: ImageAnalysis? = null
fun startCamera() {
val cameraProviderFuture =
ProcessCameraProvider.getInstance(context)
cameraProviderFuture.addListener(
{
runCatching {
val provider = cameraProviderFuture.get()
cameraProvider = provider
startPreview()
startAnalysis()
}.onFailure {
onFailure(it)
}
},
ContextCompat.getMainExecutor(context)
)
}
private fun startPreview() {
if (previewUseCase != null) {
cameraProvider?.unbind(previewUseCase)
}
previewUseCase = Preview.Builder()
.setTargetRotation(previewView.display.rotation)
.build()
previewUseCase?.setSurfaceProvider(previewView.surfaceProvider)
runCatching {
cameraProvider?.bindToLifecycle(lifecycleOwner,
cameraSelector,
previewUseCase
)
}.onFailure {
onFailure(it)
}
}
private fun startAnalysis() {
val options = BarcodeScannerOptions.Builder()
.setBarcodeFormats(Barcode.FORMAT_QR_CODE)
.build()
val barcodeScanner: BarcodeScanner = BarcodeScanning.getClient(options)
if (cameraProvider == null) {
return
}
if (analysisUseCase != null) {
cameraProvider?.unbind(analysisUseCase)
}
analysisUseCase = ImageAnalysis.Builder()
.setTargetRotation(previewView.display.rotation)
.build()
val cameraExecutor = Executors.newSingleThreadExecutor()
analysisUseCase?.setAnalyzer(cameraExecutor, ImageAnalysis.Analyzer { imageProxy ->
processImageProxy(barcodeScanner, imageProxy)
})
runCatching {
cameraProvider?.bindToLifecycle(lifecycleOwner,
cameraSelector,
analysisUseCase
)
}.onFailure {
onFailure(it)
}
}
@SuppressLint("UnsafeExperimentalUsageError")
private fun processImageProxy(
barcodeScanner: BarcodeScanner,
imageProxy: ImageProxy
) {
runCatching {
val img = imageProxy.image
if (img != null) {
val inputImage =
InputImage.fromMediaImage(img, imageProxy.imageInfo.rotationDegrees)
barcodeScanner.process(inputImage)
.addOnSuccessListener { barcodes ->
barcodes.forEach {
onQrCapture(it)
}
}
.addOnFailureListener {
onFailure(it)
}.addOnCompleteListener {
imageProxy.close()
}
} else {
throw Exception("Falha ao processar a imagem")
}
}.onFailure {
onFailure(it)
}
}
}
cropRect()仅在图像中放置元数据,而不执行裁剪操作。对于静态图像,您可以将其转换为位图并进行裁剪。一种更好的方法是,当您使用检测到的条形码边界框获得所有返回的条形码时,过滤掉结果
在MLKit中,我们正在添加对图像裁剪的支持。imageProxy.cropRect()只在图像中放置元数据,而不执行裁剪操作。对于静态图像,您可以将其转换为位图并进行裁剪。一种更好的方法是,当您使用检测到的条形码边界框获得所有返回的条形码时,过滤掉结果
在MLKit中,我们正在添加对图像裁剪的支持。因此我不能使用裁剪,我必须使用另一种方法。因为我不拍照,我会现场扫描QR。。。但是我如何过滤这个结果呢?当QR位于预览视图(cam)中心时检测QR代码。我不知道您现在能做的是获取检测到的条形码列表,并且只处理感兴趣区域内的条形码(如显示检测结果)。每个条形码的边界框都可以通过条形码#getBoundingBox()获得。因此我不能使用裁剪,我必须使用另一种方法。因为我不拍照,我会现场扫描QR。。。但是我如何过滤这个结果呢?当QR位于预览视图(cam)中心时检测QR代码。我不知道您现在能做的是获取检测到的条形码列表,并且只处理感兴趣区域内的条形码(如显示检测结果)。每个条形码的边界框可以通过条形码#getBoundingBox()获得。您好,您可以看看我在这里给出的解决方案stackoverflow.com/a/67348548/13300615。Mb它可以帮助您裁剪图像。您好,您可以看看我在stackoverflow.com/a/67348548/13300615给出的解决方案。Mb它可以帮助您裁剪图像。