Android摄像头识别多个二维码并绘制识别区域

说起Android扫描二维码,可能很多人都会想到用zxing,个人感觉不是很好用,后来使用华为的统一扫码服务,用着还行,不用开发者再辛苦钻研不同手机的分辨率以及方向了,如今机器学习热度这么高,各大厂商已经把条码识别归入机器学习SDK,本文要介绍的就是使用谷歌的 CameraX 以及机器学习,实现二维码识别,超级简单!

使用机器学习套件扫描条形码 (Android)

下载示例代码​​​​​​​

1、相机权限那是少不了的,添加如下权限:

<uses-permission android:name="android.permission.CAMERA"/>

2、添加相关依赖:

    def camerax_version = "1.2.0-beta02"
    implementation "androidx.camera:camera-camera2:${camerax_version}"
    implementation "androidx.camera:camera-core:${camerax_version}"
    implementation "androidx.camera:camera-extensions:${camerax_version}"
    implementation "androidx.camera:camera-lifecycle:${camerax_version}"
    implementation "androidx.camera:camera-view:${camerax_version}"
    implementation "androidx.camera:camera-video:${camerax_version}"
    implementation "androidx.camera:camera-mlkit-vision:${camerax_version}"
    implementation 'com.google.mlkit:barcode-scanning:17.0.3'//扫码库
    implementation 'com.google.guava:guava:27.1-android'

3、从官方的示例代码复制两份代码

GraphicOverlay.java

BarcodeGraphic.kt

4、布局文件

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.camera.view.PreviewView
        android:id="@+id/previewView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <site.feiyuliuxing.camera2test.widget.GraphicOverlay
        android:id="@+id/overlayView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintStart_toStartOf="@id/previewView"
        app:layout_constraintTop_toTopOf="@id/previewView"
        app:layout_constraintEnd_toEndOf="@id/previewView"
        app:layout_constraintBottom_toBottomOf="@id/previewView" />

</androidx.constraintlayout.widget.ConstraintLayout>

 5、主要代码

import android.annotation.SuppressLint
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.camera.core.CameraSelector
import androidx.camera.core.Preview
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.camera.mlkit.vision.MlKitAnalyzer
import androidx.camera.view.CameraController
import androidx.camera.view.LifecycleCameraController
import androidx.camera.view.PreviewView
import androidx.core.content.ContextCompat
import androidx.lifecycle.LifecycleOwner
import com.google.common.util.concurrent.ListenableFuture
import com.google.mlkit.vision.barcode.BarcodeScannerOptions
import com.google.mlkit.vision.barcode.BarcodeScanning
import com.google.mlkit.vision.barcode.common.Barcode

class MainActivity : AppCompatActivity() {
    private lateinit var previewView: PreviewView
    private lateinit var cameraController: LifecycleCameraController
    private lateinit var graphicOverlay: GraphicOverlay

    @SuppressLint("MissingInflatedId")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //申请权限
        PermissionUtil.requestPermissions(this)

        graphicOverlay = findViewById(R.id.overlayView)
        cameraController = LifecycleCameraController(this)
        cameraController.bindToLifecycle(this)
        previewView = findViewById(R.id.previewView)
        previewView.controller = cameraController
        listenBarcodeScanning()

    }

    override fun onResume() {
        super.onResume()
        graphicOverlay.clear()
    }

    private fun listenBarcodeScanning() {
        val options = BarcodeScannerOptions.Builder()
            .setBarcodeFormats(Barcode.FORMAT_QR_CODE)
            .build()
        val barcodeScanner = BarcodeScanning.getClient(options)
        cameraController.setImageAnalysisAnalyzer(
            ContextCompat.getMainExecutor(this),
            MlKitAnalyzer(
                listOf(barcodeScanner),
                CameraController.COORDINATE_SYSTEM_VIEW_REFERENCED,
                ContextCompat.getMainExecutor(this)
            ) { result ->
                result.getValue(barcodeScanner)?.let { barcodeList ->
                    graphicOverlay.clear()
                    barcodeList.forEach { barcode ->
                        //barcode还包含其他一些信息,比如根据位置,区域等可以绘制自己的UI
                        println("### ${barcode.rawValue}")
                        graphicOverlay.add(BarcodeGraphic(graphicOverlay, barcode))
                    }
                    graphicOverlay.invalidate()
                }
            })
    }

}

最后附上效果图

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: Android Studio 可以使用 Google Vision API 来实现二维码识别。首先,需要在项目中添加以下依赖项: ``` implementation 'com.google.android.gms:play-services-vision:20.1.3' ``` 接下来,在你的代码中,你需要使用 CameraSource 类来访问相机。你可以在 onCreate() 方法中创建一个 SurfaceView 和一个 CameraSource,如下所示: ``` SurfaceView surfaceView = findViewById(R.id.surface_view); CameraSource cameraSource = new CameraSource.Builder(this, new BarcodeDetector.Builder(this).build()) .setAutoFocusEnabled(true) .build(); ``` 在 SurfaceView 中,你可以使用 SurfaceHolder.Callback 接口的回调方法来设置相机预览。你可以通过 CameraSource.start() 方法启动相机,如下所示: ``` surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { try { cameraSource.start(holder); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {} @Override public void surfaceDestroyed(SurfaceHolder holder) { cameraSource.stop(); } }); ``` 最后,你可以使用 CameraSource.setFrameProcessor() 方法来设置一个 FrameProcessor,用于在每一帧图像上运行检测器。对于二维码检测,你可以使用 BarcodeDetector 类,如下所示: ``` cameraSource.setFrameProcessor(new FrameProcessor() { @Override public void process(Frame frame) { SparseArray<Barcode> barcodes = new BarcodeDetector.Builder(getApplicationContext()) .setBarcodeFormats(Barcode.QR_CODE) .build() .detect(frame); if (barcodes.size() > 0) { String barcodeValue = barcodes.valueAt(0).displayValue; // 在这里处理二维码值 } } }); ``` 当有二维码出现在相机预览中时,你可以在 process() 方法中获取到它的值。在这里,我们只取检测到的第一个二维码,你也可以根据需求进行修改。 ### 回答2: 在Android Studio中,我们可以使用一些库和技术来实现二维码识别功能。其中一个常用的库是Zxing,它是一个功能强大的开源库,用于二维码的生成和识别。 首先,我们需要在项目的`build.gradle`文件中添加Zxing依赖库的引用。然后,我们可以在相应的Activity或Fragment中创建一个相机预览视图,并在预览视图中添加一个Overlay图层,用于显示扫描二维码的位置。 接下来,我们需要使用Zxing提供的CaptureActivity类,它提供了一个默认的二维码扫描界面。我们可以将这个类作为子类,然后在它的onActivityResult()方法中获取二维码的扫描结果。 当用户点击“扫描”按钮时,我们可以启动CaptureActivity,并在onActivityResult()方法中获得二维码的结果。然后,我们可以对结果进行处理,例如解析二维码中的数据,展示给用户或者执行相应的操作。 除了使用Zxing库外,还有一些其他的二维码识别库,例如Google提供的Mobile Vision API。这个API提供了一些用于图像处理和二维码识别的类和方法,可以用来实现类似的功能。 总结来说,Android Studio中实现二维码识别功能可以借助第三方库Zxing或者使用Google提供的Mobile Vision API。通过在预览视图中添加相机扫描二维码的功能,并使用相应的类和方法来实现扫描结果的获取和处理,我们可以实现一个功能强大的二维码识别应用。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值