Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android MLKit仅在屏幕中央扫描QRcode_Android_Firebase_Firebase Mlkit - Fatal编程技术网

Android MLKit仅在屏幕中央扫描QRcode

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

我实现了firebase MLKit来扫描QRCode,它正在扫描,但它正在扫描屏幕上的所有QRCode。 我只需要扫描中心捕获的QRCode(中心有arrow 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)
        }

    }

}
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它可以帮助您裁剪图像。