彩票走势图

在安卓设备上扫描高密度的QR码:谷歌ML工具包与Dynamsoft的SDK对比

原创|对比评测|编辑:何跃|2021-11-08 11:35:37.440|阅读 796 次

概述:在市场上有许多QR码工具和SDK。对于Android开发,Google ML Kit免费的、支持一般的QR码检测。然而,它不能满足高密度的QR码检测的要求。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

作为一个商业条码SDK,Dynamsoft Barcode Reader可以覆盖特殊条码类型。在这篇文章中,我们将简化ML Kit的样本并将其与Dynamsoft Barcode SDK集成,以比较ML Kit和Dynamsoft Barcode Reader。



本文直接上手对比两个SDK的下载安装和使用效率。

Barcode SDK Download

①  ML Kit: 在 AndroidManifest.xml添加: <meta-dataandroid:name="com.google.mlkit.vision.DEPENDENCIES"android:value="barcode"/>

在build.gradle添加:dependencies { implementation 'com.google.mlkit:barcode-scanning:17.0.0' }

你可以在生成的apk文件中找到模型文件 apk/assets/mlkit_barcode_models/barcode_ssd_mobilenet_v1_dmp25_quant.tflite

②  Dynamsoft Barcode Reader:下载地址点击
解压SDK并复制文件DynamsoftBarcodeReaderAndroid.aar到项目库,并在build.gradle添加:dependencies { implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) }

另外,您也可以在build.gradle文件中配置Maven仓库,方法如下:

allprojects {
      repositories {
          google()
          jcenter()
          maven {
              url "//download2.dynamsoft.com/maven/dbr/aar"
          }
      }
  }

  dependencies {
      implementation 'com.dynamsoft:dynamsoftbarcodereader:8.8.0@aar'
  }
从静态图像中读取QR码


用谷歌ML套件扫描QR码, 这是一个优秀的样本应用程序,具有物体检测、人脸检测、文本识别、条形码扫描、图像标签、自定义图像标签、姿势检测和自拍分割的功能。

为了专注于静止图像的检测,我们只保留StillImageActivity,并在AndroidManifest.xml中把它设置为LAUNCHER

<activity
    android:name=".java.StillImageActivity"
    android:exported="true"
    android:theme="@style/AppTheme">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>
用Dynamsoft的SDK扫描QR码


我们创建一个dynamsoftbarcodescanner文件夹和两个类文件。DynamsoftBarcodeGraphic.java和DynamsoftBarcodeProcessor.java。
DynamsoftBarcodeGraphic类是用来绘制检测结果的:

@Override
public void draw(Canvas canvas) {
    if (result == null) {
        throw new IllegalStateException("Attempting to draw a null barcode.");
    }

    // Draws the bounding box around the BarcodeBlock.
    Point[] points = result.localizationResult.resultPoints;
    int minx = points[0].x;
    int miny = points[0].y;
    int maxx = points[0].x;
    int maxy = points[0].y;
    for (int i = 1; i < 4; i++) {
        if (points[i].x < minx) {
            minx = points[i].x;
        }
        else if (points[i].x > maxx) {
            maxx = points[i].x;
        }

        if (points[i].y < miny) {
            miny = points[i].y;
        }
        else if (points[i].y > maxy) {
            maxy = points[i].y;
        }
    }
    RectF rect = new RectF(minx, miny, maxx, maxy);
    // If the image is flipped, the left will be translated to right, and the right to left.
    float x0 = translateX(rect.left);
    float x1 = translateX(rect.right);
    rect.left = min(x0, x1);
    rect.right = max(x0, x1);
    rect.top = translateY(rect.top);
    rect.bottom = translateY(rect.bottom);
    canvas.drawRect(rect, rectPaint);

    // Draws other object info.
    float lineHeight = TEXT_SIZE + (2 * STROKE_WIDTH);
    float textWidth = barcodePaint.measureText(result.barcodeText);
    canvas.drawRect(
            rect.left - STROKE_WIDTH,
            rect.top - lineHeight,
            rect.left + textWidth + (2 * STROKE_WIDTH),
            rect.top,
            labelPaint);
    // Renders the barcode at the bottom of the box.
    canvas.drawText(result.barcodeText, rect.left, rect.top - STROKE_WIDTH, barcodePaint);
}
DynamsoftBarcodeProcessor类用于解码QR码。当我们加载一个图像文件时,在DynamsoftBarcodeProcessor.java中会触发processBitmap(Bitmap bitmap, final GraphicOverlay graphicOverlay) 函数。此后,我们调用decodeBufferedImage(bitmap, "" )来识别QR码。



@Override
public void processBitmap(Bitmap bitmap, final GraphicOverlay graphicOverlay) {
    try {
        long frameStartMs = SystemClock.elapsedRealtime();
        TextResult[] results = barcodeScanner.decodeBufferedImage(bitmap, "");
        long frameEndMs = SystemClock.elapsedRealtime();

        if (results != null) {
            for (int i = 0; i < results.length; ++i) {
                TextResult barcode = results[i];
                graphicOverlay.add(new DynamsoftBarcodeGraphic(graphicOverlay, barcode));
            }
            graphicOverlay.add(
                    new InferenceInfoGraphic(
                            graphicOverlay,
                            frameEndMs - frameStartMs,
                            frameEndMs - frameStartMs,
                            null));
        }

    } catch (IOException e) {
        e.printStackTrace();
    } catch (BarcodeReaderException e) {
        e.printStackTrace();
    }
}

对比测试

我们使用同样的6张,来判断不同密度中两个SDK的效率。ML Kit的条形码扫描API对这些图像是无能为力的。ML Kit比Dynamsoft Barcode Reader花了更多的时间,却什么也没识别出来。相比之下,Dynamsoft Barcode Reader能够识别所有高密度的QR码图像。

本次实验使用到的源码





标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP