如何提高 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)
我在 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)