如何提高pylibdmtx的性能?

4

我正在使用Python 3.6中的pylibdmtx来检测条码类型(Datamatrix),这些类型无法被zbar检测到。不幸的是,文档很少,并且条形码检测速度非常慢,即使在硬件相对较新的计算机上,每张图像需要花费长达30秒的时间。有哪些方法可以加快检测时间?我的当前代码如下,可以将时间缩短到约20秒,但仍然太慢。

from PIL import Image
import cv2
from pylibdmtx.pylibdmtx import decode as dmtxdecode
image = cv2.imread(imagepath, cv2.IMREAD_UNCHANGED);
scale_percent = 50
width = int(image.shape[1] * scale_percent / 100)
height = int(image.shape[0] * scale_percent / 100)
dsize = (width, height)
# calculate the 50 percent of original dimensions
output = cv2.resize(image, dsize)
gray = cv2.cvtColor(output, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
pylibresult = dmtxdecode(thresh)

我尝试了同样的方法,只需将scale_percent设置为5或10,速度非常快! - Rivered
2个回答

4

速度是一个问题,但通过做一些妥协可以达到合理的速度。

我从互联网上随机选择了一个分辨率中等的图片。例如:https://www.matthews.com.au/application/third_party/ckfinder/userfiles/images/printed-datamtrix.jpg

这里是检测到的输出(以了解宽度和高度): [解码数据=b'011234567890123110HJS6491715022821923Z845Y716W',矩形=Rect(left=372, top=250, width=47, height=70)]

这个图片没有任何参数需要运行4.18秒!

添加参数:

  • max_count = 1 -> 0.75秒(5.5倍的改善!)

现在以下所有测试都有max_count = 1

  • threshold = 50 -> 0.26秒(再次提高2.9倍)
  • min_edge = 20 -> 0.71秒(1.05倍)
  • max_edge = 60 -> 0.22秒(3.4倍)
  • shape = DmtxSymbolSize.DmtxSymbol24x24 -> n/a - 可能会进一步改善。

组合:max_count = 1,threshold = 50,min_edge = 20,max_edge = 60 -> 0.17秒(4.4倍)

请注意:这只是参数影响的指示。实际时间取决于图像内容,分辨率,第一个标记的位置和大小等。持续时间平均了两次测试(因为值非常匹配)。

CPU:2.6 GHz i5-4278U,MBP晚2014年 libdmtx:0.7.5 pylibdmtx:0.1.9

from pylibdmtx.pylibdmtx import decode
import cv2, time

path = 'printed-datamtrix.jpg'
img = cv2.imread(path)
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

for _ in range(2):
    start = time.time()
    res = decode(gray, max_count=1, threshold=50, min_edge=20, max_edge=60)
    print("elapsed: ", time.time() - start)

0

收缩和阈值的组合将把它减少到4秒

import cv2
from pylibdmtx.pylibdmtx import decode

image = cv2.imread('img.png')
decode(image, shrink=3, threshold=6)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接