Я пытаюсь обнаружить этот штрих-код Code128 с помощью модуля Python + zbar
:
(Ссылка для скачивания изображения здесь).
Это работает:
import cv2, numpy
import zbar
from PIL import Image
import matplotlib.pyplot as plt
scanner = zbar.ImageScanner()
pil = Image.open("000.jpg").convert('L')
width, height = pil.size
plt.imshow(pil); plt.show()
image = zbar.Image(width, height, 'Y800', pil.tobytes())
result = scanner.scan(image)
for symbol in image:
print symbol.data, symbol.type, symbol.quality, symbol.location, symbol.count, symbol.orientation
но обнаружена только одна точка: (596, 210)
.
Если я применяю черно-белое пороговое значение:
pil = Image.open("000.jpg").convert('L')
pil = pil .point(lambda x: 0 if x<100 else 255, '1').convert('L')
лучше, и у нас 3 точки: (596, 210), (482, 211), (596, 212). Но это добавляет еще одну сложность (нахождение оптимального порога - здесь 100 - автоматически для каждого нового изображения).
Тем не менее, у нас нет 4 углов штрих-кода.
Вопрос: как надежно найти 4 угла штрих-кода на изображении с помощью Python? (и, может быть, OpenCV или другая библиотека?)
Примечания:
Возможно, это отличный пример (но, к сожалению, не с открытым исходным кодом, как упоминалось в комментариях):
Обнаружение углов кажется отличным и очень быстрым, даже если штрих-код является лишь небольшой частью всего изображения (для меня это важно).
Интересное решение: обнаружение штрих-кода в реальном времени. в видео с Python и OpenCV, но есть ограничения метода (см. в статье: штрих-код должен быть крупным планом и т. д.), которые ограничивают потенциальное использование. Также я больше ищу готовую библиотеку для этого.
Интересное решение 2: Обнаружение штрих-кодов на изображениях с помощью Python и OpenCV но опять же, это не похоже на готовое решение, а скорее на то, что оно находится в стадии исследования. Действительно, я попробовал их код на этом изображении, но обнаружение не дало успешного результата. Следует отметить, что при обнаружении не учитываются никакие характеристики штрих-кода (факт наличия символ запуска/остановки и т. д.)
import numpy as np import cv2 image = cv2.imread("000.jpg") gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) gradX = cv2.Sobel(gray, ddepth = cv2.CV_32F, dx = 1, dy = 0, ksize = -1) gradY = cv2.Sobel(gray, ddepth = cv2.CV_32F, dx = 0, dy = 1, ksize = -1) gradient = cv2.subtract(gradX, gradY) gradient = cv2.convertScaleAbs(gradient) blurred = cv2.blur(gradient, (9, 9)) (_, thresh) = cv2.threshold(blurred, 225, 255, cv2.THRESH_BINARY) kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 7)) closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel) closed = cv2.erode(closed, None, iterations = 4) closed = cv2.dilate(closed, None, iterations = 4) (_, cnts, _) = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) c = sorted(cnts, key = cv2.contourArea, reverse = True)[0] rect = cv2.minAreaRect(c) box = np.int0(cv2.boxPoints(rect)) cv2.drawContours(image, [box], -1, (0, 255, 0), 3) cv2.imshow("Image", image) cv2.waitKey(0)