【OpenCV】一种基于二维码色块的视觉分割及识别算法

【OpenCV】一种基于二维码色块的视觉分割及识别算法

  • 算法背景
  • 算法需求
  • 算法实现
    • 读入图片并预剪裁
    • 将读入图片剪裁为九份
    • 遍历切割图像并识别
    • 爆炸显示图片切割结果
  • 结语

算法背景

在智能制造中,二维码、条形码的应用十分广泛,其可以应用于拆零拣选、混合码垛、仓储等多个场合,均要求摄像头对于二维码信息的精确捕捉。现提出一个在典型视觉工站下,多个二维码色块的视觉分割与识别算法。

算法需求

图片样例如下
【OpenCV】一种基于二维码色块的视觉分割及识别算法_第1张图片

算法需求:将含二维码色块的格子单独切割提取,读取色块上的字母与数字,读取二维码内数据。

算法实现

读入图片并预剪裁

将图片读入,并剪裁为宽1000高900的三通道图片。

img1 = cv2.imread(r'project 1 pictures/1.bmp')#目录为根目录下
    img = cv2.resize(img1,(1224,1024))
    img_Model=cv2.imread(r'Model/R1.png')
    cv2.destroyAllWindows()
    img = img[60:960,200:1200]
    print(img.shape)
    cv2.imshow("aa", img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

效果如图所示:

将读入图片剪裁为九份

因视觉工站拍摄的图片中,放置色块为九宫格形式,故按九宫格切割为九份。

result = divided_to_9(img)

需要注意因拍摄图像两侧有畸变,故进行手动切割。

def divided_to_9(img):
    result = []
    img_1 = img[0:290,0:300]#因图片中两侧有畸变,故手动进行切割
    img_2 = img[0:290,314:628]
    img_3 = img[0:290,628:940]
    img_4 = img[300:600,0:314]
    img_5 = img[300:600,314:628]
    img_6 = img[300:600,628:940]
    img_7 = img[600:900,0:314]
    img_8 = img[600:900,314:628]
    img_9 = img[600:900,628:940]
    result.append(img_1)
    result.append(img_2)
    result.append(img_3)
    result.append(img_4)
    result.append(img_5)
    result.append(img_6)
    result.append(img_7)
    result.append(img_8)
    result.append(img_9)
    return result

遍历切割图像并识别

    for i in range(9):
        tmp = result[i]
        tmp = Pre_handle(tmp)
        zbar_DetctAndDecode(tmp)
        print("识别完毕")

识别结果如图所示:
【OpenCV】一种基于二维码色块的视觉分割及识别算法_第2张图片

爆炸显示图片切割结果

h, w = img.shape[0], img.shape[1]
    m = 3
    n = 3
    divide_image2 = divide_method2(img, m + 1, n + 1)  # 该函数中m+1和n+1表示网格点个数,m和n分别表示分块的块数
    fig3 = plt.figure('分块后的子图像:图像缩放法')
    display_blocks(divide_image2)
def divide_method2(img, m, n):  # 分割成m行n列
    h, w = img.shape[0], img.shape[1]
    grid_h = int(h * 1.0 / (m - 1) + 0.5)  # 每个网格的高
    grid_w = int(w * 1.0 / (n - 1) + 0.5)  # 每个网格的宽
    # 满足整除关系时的高、宽
    h = grid_h * (m - 1)
    w = grid_w * (n - 1)
    # 图像缩放
    img_re = cv2.resize(img, (w, h),
                        cv2.INTER_LINEAR)  # 也可以用img_re=skimage.transform.resize(img, (h,w)).astype(np.uint8)
    # plt.imshow(img_re)
    gx, gy = np.meshgrid(np.linspace(0, w, n), np.linspace(0, h, m))
    gx = gx.astype(np.int32)
    gy = gy.astype(np.int32)

    divide_image = np.zeros([m - 1, n - 1, grid_h, grid_w, 3],
                            np.uint8)  # 这是一个五维的张量,前面两维表示分块后图像的位置(第m行,第n列),后面三维表示每个分块后的图像信息
    for i in range(m - 1):
        for j in range(n - 1):
            divide_image[i, j, ...] = img_re[
                                      gy[i][j]:gy[i + 1][j + 1], gx[i][j]:gx[i + 1][j + 1], :]
    return divide_image

【OpenCV】一种基于二维码色块的视觉分割及识别算法_第3张图片

结语

算法基本实现了需求,但在稳定性上还存在不足需要提升。
全代码下载地址:https://download.csdn.net/download/qq_47842513/85522715

你可能感兴趣的:(智能制造,opencv,计算机视觉,算法,python)