提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|对比评测|编辑:何跃|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@cahobeh.cn
当您需要在 SWT 应用程序中显示 Web 内容时,通常有两种选择:内置浏览器小部件或像 JxBrowser 这样的商业选项?本文分析了两者之间的差异,并帮助您根据自己的需求选择合适的解决方案。
本文将介绍标准WPF DataGrid与DevExpress WPF GridControl之间的主要区别,希望能帮助大家选择正确的工具!
本文将介绍标准WPF DataGrid与DevExpress WPF GridControl之间的主要区别,希望能帮助大家选择正确的工具!
本文将详细评测Navicat的主要功能、用户体验以及其在数据库管理中的应用,希望能帮助到大家~
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@cahobeh.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢