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

算法背景

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

算法需求

图片样例如下
视觉工站拍摄二维码色块

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

算法实现

读入图片并预剪裁

将图片读入,并剪裁为宽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("识别完毕")

识别结果如图所示:
识别结果

爆炸显示图片切割结果

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

爆炸显示切割图片

结语

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: OpenCV是一个开源的计算机视觉库,可以用于图像处理和分析。要使用OpenCV识别彩色二维码,可以按照以下步骤进行: 1. 导入OpenCV库并加载图像: 要使用OpenCV,首先需要安装并导入相应的库。然后使用OpenCV的函数来加载要识别的彩色二维码图像。 2. 将图像转换为灰度图像: 使用OpenCV的函数将彩色图像转换为灰度图像。这是因为在处理二维码时,灰度图像有助于提取图像中的黑白信息。 3. 检测和解码二维码: 使用OpenCV的函数来检测图像中的二维码。对于彩色二维码,可以使用适当的函数参数来指定扫描彩色二维码。一旦检测到二维码,就可以使用OpenCV的函数来解码二维码中的信息。 4. 显示和输出解码信息: 将解码的信息显示在图像上,以便用户可以看到识别的结果。此外,可以将解码的信息输出到文件或其他系统中,以便进一步处理或存储。 需要注意的是,识别彩色二维码可能需要适当的图像处理和参数设置,以确保准确性和可靠性。此外,根据具体需求,还可以对识别到的二维码进行额外的处理或分析。 ### 回答2: OpenCV一种开源的计算机视觉和机器学习软件库,它提供了许多功能强大的图像处理和分析工具。通过使用OpenCV,我们可以实现彩色二维码识别。 在进行彩色二维码识别之前,我们需要首先加载图像并对其进行预处理。首先,我们可以使用OpenCV的函数将图像转换为灰度图像,这将有助于提高识别的准确性。然后,我们可以使用OpenCV中的二维码检测函数来检测图像中的二维码。这些函数可以识别不同角度和尺寸的二维码。 在识别过程中,OpenCV会返回一个包含二维码信息的数据结构。我们可以从这个数据结构中提取二维码的内容并进行进一步处理,比如解码和解析其包含的信息。 在识别彩色二维码时,我们需要注意光照对识别的影响。光照强度和颜色可能会导致识别结果的误差或失败。为了解决这个问题,我们可以使用OpenCV的图像增强技术,如亮度调整和对比度增强,来改善图像的质量。 总结来说,通过使用OpenCV的图像处理和分析功能,我们可以实现彩色二维码识别。我们需要对图像进行预处理,使用二维码检测函数进行识别,并从识别结果中提取二维码的内容。并且需要注意光照对识别的影响,可以采用图像增强技术来改善识别结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攉胖高手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值