python二维码特征定位与识别

1. 项目背景

在使用手机等移动设备对发票中的二维码进行扫描识别的时候,经常会出现这样的情况:由于部分纸质发票的打印质量比较差,二维码出现模糊和缺失导致无法直接扫描和识别。因此,在实际操作中需要对发票中的二维码进行定位识别。

本文基于window环境下的python3.6,使用python的opencv库来实现二维码的定位与识别。

2.引入相关库

;本文使用的库主要有cv2、numpy、math,在引入前请安装相关的python库。

import cv2
import numpy as np
import math

3. 图像预处理

# 读取图片
image = cv2.imread("images/test.jpg")
# 灰度化
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imwrite("images/gray.jpg", gray_image)
# 中值滤波
blur_image = cv2.medianBlur(gray_image, 5)
# OTSU二值化
(_, threshold_image) = cv2.threshold(blur_image, 0, 255, cv2.THRESH_OTSU)
cv2.imwrite("images/threshold.jpg", threshold_image)
# 图像腐蚀,使轮廓更加完整
erode_image = cv2.erode(threshold_image, None, iterations=2)
  • 原始图片
    原始图片

  • 灰度图片
    灰度图片

  • 二值化图片
    二值化图片

  • 腐蚀图片

腐蚀图片

4. 识别位置探测图像

经过上述步骤的处理,我们可以看出图片中二维码的位置探测图形的轮廓变得更加清晰了,下面我们就可以对位置探测图形进行定位了。

# 寻找轮廓
contours, hierarchy = cv2.findContours(erode_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    hierarchy = hierarchy[0]
    # 轮廓中有两个子轮廓的轮廓可能为二维码位置探测图形
    tempindex1 = 0
    tempindex2 = 0
    vin = []
    for i in range(0, len(contours)):
        if hierarchy[i][2] == -1:
            continue
        else:
            tempindex1 = hierarchy[i][2]
        if hierarchy[tempindex1][2] == -1:
            continue
        else:
            tempindex2 = hierarchy[tempindex1][2]
            vin.append((i, tempindex1, tempindex2))
    for v in vin:
        contour1 = contours[v[1]]
        contour2 = contours[v[2]]
        lenth1 = cv2.arcLength(contour1, True)
        lenth2 = cv2.arcLength(contour2, True)
        # 排除过大轮廓
        if abs(lenth1 / lenth2 - 2) > 1:
            vin.remove(v)
    # 位置探测图形中心点坐标
    points = []
    for v in vin:
        m = cv2.moments(contours[v[1]])
        cx = np.intp(m['m10'] / m['m00'])
        cy = np.intp(m['m01'] / m['m00'])
        points.append((cx, cy))
    # 计算区域面积
    area = cv2.contourArea(contours[vin[0][1]])
    # 计算轮廓边长
    area_side = np.intp(math.sqrt(area))
    # 绘制定位三角形
    for i in range(0, 3):
        cv2.line(erode_image, points[i % 3], points[(i + 1) % 3], (255, 0, 0), area_side // 10)
    cv2.imwrite("images/ercode.jpg", erode_image)

结果如图所示:

定位三角形

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

全栈探索者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值