如何提高 pylibdmtx 性能?

Mr.*_*. T 5 python ocr image-processing

我在 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)
Run Code Online (Sandbox Code Playgroud)

小智 6

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

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

这是检测到的输出(了解宽度和高度): [Decoded(data=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)
Run Code Online (Sandbox Code Playgroud)