如何提高 pylibdmtx 性能?

How to improve pylibdmtx performance?

我在 Python 3.6 中使用 pylibdmtx 来检测 zbar 无法检测到的条形码类型 (Datamatrix)。不幸的是,文档很少,条形码检测速度非常慢,在硬件相对较新的机器上每张图像最多需要 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)

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

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

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

这张没有任何参数的图片需要 4.18 秒才能 运行!

添加参数:

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

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

  • 阈值=50 -> 0.26 秒(进一步提高 2.9 倍)
  • min_edge=20 -> 0.71 秒 (1,05x)
  • max_edge=60 -> 0.22 秒 (3,4x)
  • shape=DmtxSymbolSize.DmtxSymbol24x24 -> na - 可能会进一步改进。

组合:max_count=1,阈值=50,min_edge=20,max_edge=60 -> 0.17 秒 (4,4x)

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

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)

收缩和阈值相结合将使它减少到 4 秒

import cv2
from pylibdmtx.pylibdmtx import decode

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