如何从图像中获取条形码?
How to get barcode from image?
我需要用Python pyzbar
库获取下面条形码中的信息,但它无法识别。在使用 pyzbar
之前我应该做任何改进吗?
这是代码:
from pyzbar.pyzbar import decode
import cv2
def barcodeReader(image):
gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
barcodes = decode(gray_img)
barcode = barcodeReader("My_image")
print (barcode)
Result: []
您可以尝试通过以下方式重建条形码:
- 用
cv2.threshold
对图像进行反向二值化,这样你就可以在黑色背景上得到白线。
- 使用
np.count_nonzero
. 计算沿行的所有非零像素
- 获取计数超过预定义阈值的所有索引,假设这里是
100
。
- 在新的全白图像上,在找到的索引处画黑线。
这是一些代码:
import cv2
import numpy as np
from skimage import io # Only needed for web grabbing images, use cv2.imread for local images
# Read image from web, convert to grayscale, and inverse binary threshold
image = cv2.cvtColor(io.imread('https://i.stack.imgur.com/D8Jk7.jpg'), cv2.COLOR_RGB2GRAY)
_, image_thr = cv2.threshold(image, 128, 255, cv2.THRESH_BINARY_INV)
# Count non-zero pixels along the rows; get indices, where count exceeds certain threshold (here: 100)
row_nz = np.count_nonzero(image_thr, axis=0)
idx = np.argwhere(row_nz > 100)
# Generate new image, draw lines at found indices
image_new = np.ones_like(image_thr) * 255
image_new[35:175, idx] = 0
cv2.imshow('image_thr', image_thr)
cv2.imshow('image_new', image_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
逆二值化图像:
重构图像:
我不确定结果是否是有效的条形码。要改进解决方案,您可以事先去掉这些数字。另外,玩弄门槛。
希望对您有所帮助!
您可以按照以下方法:
- 使用形态学运算检测垂直线并存储垂直图像的xmin、ymin、xmax和ymax。
- 对所有 xmin 值进行排序并根据距离对它们进行分组。
- 做同样的练习 ymin 和 ymax 并将它们分组。
- 分别考虑较大组 xmin 和 ymin 较大组中的最小像素值。
- 分别考虑较大组的 xmax 和 ymax 较大组中的最大值。
- 您将得到条码的精确 xmin,ymin,xmax,ymax。
我需要用Python pyzbar
库获取下面条形码中的信息,但它无法识别。在使用 pyzbar
之前我应该做任何改进吗?
这是代码:
from pyzbar.pyzbar import decode
import cv2
def barcodeReader(image):
gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
barcodes = decode(gray_img)
barcode = barcodeReader("My_image")
print (barcode)
Result: []
您可以尝试通过以下方式重建条形码:
- 用
cv2.threshold
对图像进行反向二值化,这样你就可以在黑色背景上得到白线。 - 使用
np.count_nonzero
. 计算沿行的所有非零像素
- 获取计数超过预定义阈值的所有索引,假设这里是
100
。 - 在新的全白图像上,在找到的索引处画黑线。
这是一些代码:
import cv2
import numpy as np
from skimage import io # Only needed for web grabbing images, use cv2.imread for local images
# Read image from web, convert to grayscale, and inverse binary threshold
image = cv2.cvtColor(io.imread('https://i.stack.imgur.com/D8Jk7.jpg'), cv2.COLOR_RGB2GRAY)
_, image_thr = cv2.threshold(image, 128, 255, cv2.THRESH_BINARY_INV)
# Count non-zero pixels along the rows; get indices, where count exceeds certain threshold (here: 100)
row_nz = np.count_nonzero(image_thr, axis=0)
idx = np.argwhere(row_nz > 100)
# Generate new image, draw lines at found indices
image_new = np.ones_like(image_thr) * 255
image_new[35:175, idx] = 0
cv2.imshow('image_thr', image_thr)
cv2.imshow('image_new', image_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
逆二值化图像:
重构图像:
我不确定结果是否是有效的条形码。要改进解决方案,您可以事先去掉这些数字。另外,玩弄门槛。
希望对您有所帮助!
您可以按照以下方法:
- 使用形态学运算检测垂直线并存储垂直图像的xmin、ymin、xmax和ymax。
- 对所有 xmin 值进行排序并根据距离对它们进行分组。
- 做同样的练习 ymin 和 ymax 并将它们分组。
- 分别考虑较大组 xmin 和 ymin 较大组中的最小像素值。
- 分别考虑较大组的 xmax 和 ymax 较大组中的最大值。
- 您将得到条码的精确 xmin,ymin,xmax,ymax。