如何在Python中对Dynamsoft Barcode Reader性能进行基准测试

news2024/12/23 14:37:11

Dynamsoft Barcode Reader SDK一款多功能的条码读取控件,只需要几行代码就可以将条码读取功能嵌入到Web或桌面应用程序。这可以节省数月的开发时间和成本。能支持多种图像文件格式以及从摄像机或扫描仪获取的DIB格式。使用Dynamsoft Barcode Reader SDK,你可以创建强大且实用的条形码扫描仪软件,以满足你的业务需求。

点击下载Dynamsoft Barcode Reader正式版icon-default.png?t=N7T8https://www.evget.com/product/3691/download

在StackOverflow上,您可能会看到这样的问题:为什么某些开源条形码SDK无法解码某些条形码?通常,有三种可选的解决方法:提高输入图像质量、改进条形码算法或找到更好的条形码SDK。ZXing和ZBar可能是最受欢迎的开源条形码SDK,但在过去的几年中,它们的算法很少得到改进。如果免费SDK不理想,为什么不使用商业条形码SDK?在本文中,我将向您展示如何在Python中使用Dynamsoft Barcode Reader,并将其性能与ZXing和ZBar进行比较。

在Python中使用Dynamsoft Barcode Reader

安装Python包:

pip install dbr==7.2.2.3 

下面是一些简单用法:

from dbr import DynamsoftBarcodeReader
 
dbr_reader = DynamsoftBarcodeReader()
dbr_reader.InitLicense('LICENSE-KEY') # Get the license from https://www.dynamsoft.com/CustomerPortal/Portal/Triallicense.aspx
try:
    params = dbr_reader.GetRuntimeSettings()
    params["BarcodeFormatIds"] = dbr_reader.BF_ALL
    ret = dbr_reader.UpdataRuntimeSettings(params)
 
    start = time.time()
    dbr_results = dbr_reader.DecodeFile(filename)
    elapsed_time = time.time() - start
    textResults = dbr_results["TextResults"]
    resultsLength = len(textResults)
    if resultsLength > 0:
        for textResult in textResults:
            print(textResult["BarcodeFormatString"])
            print('Dynamsoft Barcode Reader: {}. Elapsed time: {}ms'.format(textResult["BarcodeText"], int(elapsed_time * 1000)))
 
        return textResults
    else:
        print("DBR failed to decode {}".format(filename))
except Exception as err:
    print("DBR failed to decode {}".format(filename))

要使用该条形码SDK,您必须下载免费试用版。

如何基于数据集获得识别率

下载公共图像数据集。

检查图像数据集,您会发现条形码结果在文件名中,我们可以使用它们来验证解码结果是否正确。

从目录获取文件列表:

import os
files = os.listdir(directory)

通过检查后缀来过滤图像文件:

files = [f for f in files if f.endswith('.jpg') or f.endswith('.png')]

分割文件名以获得预期的结果:

expected_result = filename.split('_')[0]

当条形码结果与预期结果相符时增加计数:

if r1 == expected_result:
zbar_count += 1
 
if r2 == expected_result:
    dbr_count += 1
 
if r3 == expected_result:
    zxing_count += 1

计算ZBar,Dynamsoft Barcode Reader和ZXing的识别率:

total_count = len(files)
 
zbar_rate = zbar_count * 100 / total_count
print('ZBar recognition rate: {0:.2f}%'.format(zbar_rate))
 
dbr_rate = dbr_count * 100 / total_count
print('DBR recognition rate: {0:.2f}%'.format(dbr_rate))
 
zxing_rate = zxing_count * 100 / total_count
print('ZXing recognition rate: {0:.2f}%'.format(zxing_rate))

如何在Python中读取和写入Excel文件

在对条形码SDK性能进行基准测试之后,最后一步是将结果保存到Excel文件中。您可以从这个网址中选择一个Python包。

我选择了openpyxl:

pip install openpyxl

创建一个新的工作簿或从现有的Excel文件中加载工作簿:

from openpyxl import utils
from openpyxl import Workbook
from openpyxl import load_workbook
from openpyxl.styles import Color, PatternFill
import os
 
def get_workbook(wb_name):
 
    if os.path.isfile(wb_name):
        wb = load_workbook(wb_name)
    else:
        wb = Workbook()
        ws = wb.active
        ws.title = 'Recognition Rate'
        ws['A1'] = 'File Name'
        # Set column width
        ws.column_dimensions[utils.get_column_letter(1)].width = 25
        ws['B1'] = 'Expected Results'
        ws.column_dimensions[utils.get_column_letter(2)].width = 20
        ws['C1'] = 'ZBar'
        ws.column_dimensions[utils.get_column_letter(3)].width = 20
        ws['D1'] = 'DBR'
        ws.column_dimensions[utils.get_column_letter(4)].width = 20
        ws['E1'] = 'ZXing'
        ws.column_dimensions[utils.get_column_letter(5)].width = 20
    return wb

设置值并更改工作表单元格的填充颜色:

red = PatternFill(start_color='FFFF0000',
                   end_color='FFFF0000',
                   fill_type='solid')
 
green = PatternFill(start_color='FF00FF00',
                   end_color='FF00FF00',
                   fill_type='solid')
 
def update_row(wb, row_index, filename=None, expected_results=None, zbar_results=None, dbr_results=None, ZXing_results=None):
    ws = wb.active
    row = ws[row_index]
    row[0].value = filename
    row[1].value = expected_results
    if zbar_results != None:
        row[2].value = zbar_results
        if zbar_results == expected_results:
            row[2].fill = green
        else:
            row[2].fill = red
 
    if dbr_results != None:
        row[3].value = dbr_results
        if dbr_results == expected_results:
            row[3].fill = green
        else:
            row[3].fill = red
 
    if ZXing_results != None:
        row[4].value = ZXing_results
        if ZXing_results == expected_results:
            row[4].fill = green
        else:
            row[4].fill = red

将工作簿保存到一个.xlsx文件:

def save_workbook(wb, wb_name):
    if wb != None:
        wb.save(wb_name)

现在运行Python应用程序以生成基准文件:

python app.py -d D:\python-zxing-zbar-dbr\dataset

本教程内容就是这样了,希望对您所有帮助!想要了解更多产品资讯请继续关注我们慧都网,您可以下载Dynamsoft Barcode Reader试用版免费评估~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1275796.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ThinkPHP 2.x任意代码执行漏洞

任务一: 复现环境中的代码漏洞 任务二: 尝试利用代码执行漏洞读取服务器web目录下的文件列表。 任务一: 1.搭建环境: 2.在php环境下直接输入{${phpinfo}}测试代码片段 2.写入一句话木马,用antsword连接&#xff0…

Java数据结构之《循环队列》题目

一、前言: 这是怀化学院的:Java数据结构中的一道难度中等的一道编程题(此方法为博主自己研究,问题基本解决,若有bug欢迎下方评论提出意见,我会第一时间改进代码,谢谢!) 后面其他编程题只要我写完…

夯实c基础

夯实c基础 区别: 图一的交换,(交换的是地址而不是两数)无法实现两数的交换。 题干以下程序的输出结果为( c  )。 void fun(int a, int b, int c){ ca*b; } void main( ){ int…

【Unity】Blender场景导入

素材 下载场景:https://www.aplaybox.com/details/model/keDSIks72Qh3 blender文件导出为.fbx文件,路径选择复制(做的过程太乱了不知道有没有影响),物理类型选择网格,勾选应用变换 blender下的物体长度是u…

openbabel 安装 生成指纹方法

今日踩坑小结: openbabel 安装: 可以装,但是得在 Linux 环境下,win 环境装会报错(安装不会报错,但是生成指纹的时候会) 指纹: 在下面这个链接里,官方给出了命令行调用 o…

袖珍可穿戴手持气象仪是什么?

随着科技的不断发展,我们身边的世界正在变得越来越智能化。近日,一款名为WX-SQ12可穿戴手持气象仪的科技新品引起了人们的广泛关注。这款气象仪不仅具有创新性的可穿戴设计,还具备强大的气象数据监测功能,让用户可以随时掌握天气变…

nvm安装管理nodejs版本

1:如果之前先安装了nodejs先卸载nodejs 2:下载nvm,点击下载路径https://github.com/coreybutler/nvm-windows/releases,选择相应环境下载,如下window环境下载 下载成功后,选择NVM安装在哪个文件目录下&…

【图论】重庆大学图论与应用课程期末复习资料2-各章考点(计算部分)(私人复习资料)

图论各章考点 二、树1、避圈法(克鲁斯克尔算法)2、破圈法3、Prim算法 四、路径算法1、Dijkstra算法2、Floyd算法 五、匹配1、匈牙利算法(最大权理想匹配(最小权权值取反)) 六、行遍性问题1、Fleury算法&…

从 Oracle 到 TiDB,全链路数据迁移平台核心能力和杭州银行迁移实践

作者:邵健 杭州银行数据库专家 王辉 PingCAP 杭州银行在 TMS beta 阶段就进行了深度的测试体验,在过程中提供了大量的宝贵建议,帮助 TMS 进行了快速的优化和迭代。近期杭州银行借助 TMS 进行了多次 Oracle 生产数据库的迁移实践,…

双远心镜头:让视觉检测更精准、高效!

工业镜头是视觉系统中的重要组件,工业镜头的选型影响着整个系统的成像效果。在做视觉检测时,会遇到无法检测空间物体、无法控制视场变化、无法控制图像扭曲、对比度低、畸变大、反光等问题,这时普通的工业镜头并不能有效地解决问题&#xff0…

Electron+Ts+Vue+Vite桌面应用系列:TypeScript常用系统目录文件处理工具

文章目录 1️⃣ TypeScript操作电脑目录和文件1.1 获取磁盘信息1.2 获取目录下所有文件夹和文件1.3 新建文件夹1.4 新建文本1.5 重命名1.6 删除文件夹1.7 删除文件1.8 打开系统文件或系统文件夹1.9 根据字节转换文件大小带单位 优质资源分享 作者:xcLeigh 文章地址&…

JOSEF约瑟 剩余电流保护器 CLJ3-100A+LH30 导轨安装

CLJ3系列剩余电流动作继电器 系列型号: CLJ3-100A剩余电流动作继电器 CLJ3-250A剩余电流动作继电器 CLJ3-400A剩余电流动作继电器 CLJ3-630A剩余电流动作继电器 LH30剩余电流互感器 LH80剩余电流互感器 LH100剩余电流互感器 LH140剩余电流互感器 一、产品概…

Linux5-计划任务、进程

计划任务 一、cron 计划任务 周期性计划任务 cron 任务概述 • 用途:按照设置的时间间隔为用户反复执行某一项固定的系统任务 • 软件包:cronie、crontabs • 系统服务:crond • 日志文件:/var/log/crond 管理计划任务策略 • 使用 cro…

Leetcode—1657.确定两个字符串是否接近【中等】

2023每日刷题(四十五) Leetcode—1657.确定两个字符串是否接近 算法思想 源于灵神 实现代码 class Solution { public:bool closeStrings(string word1, string word2) {int len1 word1.size();int len2 word2.size();if(len1 ! len2) {return fa…

【note: This is an issue with the package mentioned above, not pip.】

安装gym时出现问题,note: This is an issue with the package mentioned above, not pip. 报错原因: 缺失了某些依赖模块,所以安装报错。 Collecting package metadata (current_repodata.json): done Solving environment: failed with in…

阿里云新版公共实例从注册账号到创建设备生成参数教程

1 注册阿里云 打开阿里云官网,点击右上角的登录/注册 打开的界面按照图片输入手机号注册 注册成功后,登录返回第一次打开的界面,点击控制台 点击控制台后界面如下 点击左上角的菜单,弹出新窗口,搜索物联网平台 开通物…

分治算法——75. 颜色分类

文章目录 🌿0. 分治🌻1. 题目🌼2. 算法原理🌴3. 代码实现 🌿0. 分治 分治分治,顾名思义分而治之,将一个大问题转换成若干个子问题,再将这些子问题的基础上继续划分成更小的子问题&a…

springboot+java校园自助洗衣机预约系统的分析与设计ssm+jsp

洗衣服是每个人都必须做的事情,而洗衣机更成为了人们常见的电器,但是单个洗衣机价格不菲,如果每人都买,就会造成资源的冗余。所有就出现了公用设备,随着时代的发展,很多公用都开始向着无人看守的自助模式经…

centOS使用docker部署ElasticSearch和Kibana

一、docker部署ElasticSearch 1、创建网桥 docker network create xybnet 2、下载镜像 docker pull elasticsearch:8.2.0 3、先运行容器 docker run -d \ --name es \ --net xybnet \ -p 9200:9200 \ -p 9300:9300 \ -p 5601:5601 \ -e "discovery.typesing…

笔记二十四、剖析Redux的工作流程

24.1 定义 用做于状态管理的第三方 js 库react框架中使用,也可应用于其他的框架 使用场景 组件间需要共享状态和改变另一个组件的状态在react项目中可以不使用就尽量不用,复杂场景下才使用 24.2 原理图 24.3 代码 安装 yarn add reduxjs/toolkit rea…