【问题标题】:How to locate and read Data Matrix code with python如何使用 python 定位和读取 Data Matrix 代码
【发布时间】:2017-12-09 03:03:39
【问题描述】:

我正在尝试读取微管底部的数据矩阵条形码。我试过libdmtx,它有python绑定,当矩阵的点是方形的时候效果相当好,但当它们是圆形的时候更糟:

另一个复杂的问题是在某些情况下会到达代码区域。

条形码在平板扫描仪的机架中进行扫描,因此它们具有恒定的大小并且大致居中。方向是随机的。

我得出一个结论,我必须自己找到代码并改进图像。我使用 python 和 OpenCV 3.1。我已经尝试过阈值,轮廓:

import matplotlib.pyplot as plt
import numpy as np
import cv2

well = plt.imread('https://i.stack.imgur.com/kqHkw.png')
well = cv2.cvtColor(well, cv2.COLOR_BGRA2GRAY)
plt.subplot(151); plt.imshow(well)

x, thr = cv2.threshold(well, .4[enter image description here][2], 1, cv2.THRESH_BINARY)
thr = np.uint8(thr)
plt.subplot(152); plt.imshow(thr)

dst, contours, hierarchy = cv2.findContours(thr.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
c = cv2.drawContours(np.zeros_like(thr), contours, -1, 255, 1)
plt.subplot(153); plt.imshow(c)

areas = map(lambda x: cv2.contourArea(cv2.convexHull(x)), contours)
max_i = areas.index(max(areas))
d = cv2.drawContours(np.zeros_like(thr), contours, max_i, 255, 1)
plt.subplot(154); plt.imshow(d)

rect = cv2.minAreaRect(contours[max_i])
box = cv2.boxPoints(rect)
box = np.int0(box)
e = cv2.drawContours(np.zeros_like(thr),[box],0,255,1)
plt.subplot(155); plt.imshow(e)

plt.show()

result

【问题讨论】:

标签: python opencv datamatrix


【解决方案1】:

为了兼容python 3,你需要修改上面的代码:

contours, hierarchy = cv2.findContours(thr.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 
areas = map(lambda x: cv2.contourArea(cv2.convexHull(x)), contours)  
areas = list(areas)  
max_i = areas.index(max(areas))

【讨论】:

    【解决方案2】:

    事实证明,Harris 角点检测器 (B) 可以通过适当的设置很好地找到圆形元素。

    在阈值处理 (C) 之后,我们检测结果区域的轮廓。我们选择最大的轮廓(D)并找到一个最小的边界框(E)。

    import matplotlib.pyplot as plt
    import numpy as np
    import cv2
    
    well = plt.imread('https://i.stack.imgur.com/kqHkw.png')
    well = cv2.cvtColor(well, cv2.COLOR_BGRA2GRAY)
    plt.subplot(151); plt.title('A')
    plt.imshow(well)
    
    harris = cv2.cornerHarris(well,4, 1,0.00)
    plt.subplot(152); plt.title('B')
    plt.imshow(harris)
    
    x, thr = cv2.threshold(harris, 0.1 * harris.max(), 255, cv2.THRESH_BINARY)
    thr = thr.astype('uint8')
    plt.subplot(153); plt.title('C')
    plt.imshow(thr)
    
    dst, contours, hierarchy = cv2.findContours(thr.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    areas = map(lambda x: cv2.contourArea(cv2.convexHull(x)), contours)
    max_i = areas.index(max(areas))
    d = cv2.drawContours(np.zeros_like(thr), contours, max_i, 255, 1)
    plt.subplot(154); plt.title('D')
    plt.imshow(d)
    
    rect =cv2.minAreaRect(contours[max_i])
    box = cv2.boxPoints(rect)
    box = np.int0(box)
    e= cv2.drawContours(well,[box],0,1,1)
    plt.subplot(155); plt.title('E')
    plt.imshow(e)
    
    plt.show()
    

    【讨论】:

    • 感谢您在找到解决方案后回答。
    猜你喜欢
    • 2015-02-19
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 2017-12-23
    • 2020-04-14
    • 1970-01-01
    相关资源
    最近更新 更多