Как повысить производительность pylibdmtx?

#python #image-processing #ocr

#python #обработка изображений #ocr

Вопрос:

Я использую pylibdmtx в Python 3.6 для обнаружения типов штрих-кодов (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)
 

Комментарии:

1. Я пробовал то же самое, просто поставил scale_percent равным 5 или 10, и это очень быстро!

Ответ №1:

Скорость — это проблема, но с некоторыми компромиссами можно достичь разумных скоростей.

Я выбрал случайное изображение из Интернета со средним разрешением. например https://www.matthews.com.au/application/third_party/ckfinder/userfiles/images/printed-datamtrix.jpg

Вот обнаруженный вывод (чтобы узнать ширину и высоту): [Декодировано (данные = b ‘ 011234567890123110HJS6491715022821923Z845Y716W’, rect = Rect(слева = 372, сверху = 250, ширина = 47, высота = 70))]

Выполнение этого pic без каких-либо аргументов занимает 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,4 раза)
  • shape=DmtxSymbolSize.DmtxSymbol24x24 -> na — возможно некоторое дальнейшее улучшение.

Комбинированный: max_count= 1, порог = 50, min_edge= 20, max_edge= 60 -> 0,17 сек (4,4 раза)

Пожалуйста, обратите внимание: это просто дает представление о влиянии параметров. Фактическое время зависит от содержимого изображения, разрешения, положения и размера первого тега и т.д. Длительности, усредненные по 2 тестам (поскольку значения действительно хорошо совпадали).

Процессор: 2,6 ГГц i5-4278U, Мбит / с в конце 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)
 

Ответ №2:

Сжатие и пороговое значение в сочетании сократят его до 4 секунд

 import cv2
from pylibdmtx.pylibdmtx import decode

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