gpt4 book ai didi

Android MLKit 仅在屏幕中央扫描二维码

转载 作者:行者123 更新时间:2023-12-05 00:18:52 33 4
gpt4 key购买 nike

我实现了 firebase MLKit 来扫描 QRCode,它正在扫描,但它正在扫描屏幕上的所有 QRcode。我只需要扫描中心捕获的 QRCode(中心有箭头 ImageView),我该怎么做?

我尝试在 Analisys 函数上裁剪(在 analysisUseCase?.setAnalyzer 内)

imageProxy.cropRect()

我尝试在 processImageProxy 函数上裁剪。但是没有成功,我认为我不能用这个裁剪

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)
}

}

}

最佳答案

imageProxy.cropRect() 只在图片中放置元数据,不做裁剪操作。对于静态图像,您可以将其转换为位图并进行裁剪。更好的方法是在所有返回的条码都带有检测到的条码边界框时过滤掉结果。

在 MLKit 中,我们添加了对图像裁剪的支持。

关于Android MLKit 仅在屏幕中央扫描二维码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65746303/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com