【二维码、条码识别】【Python+OpenCV】基于OpenCV库的二维码、条形码识别识别【含源码 1-1】

@TOC【二维码、条码识别】【Python+OpenCV】基于OpenCV库的二维码、条形码识别识别【含源码 1-1】环境:Win 10、Pycharm 、Python3.91.Pycharm安装OpenCV因需用到cv2库(安装的OpenCV版本为OpenCV4.5.5),所以需要在PyCharm中安装OpenCV。安装步骤为:点开”File”菜单的“Setting”选项,然后按照下面的两张图进行操作。点“+”号,输入“opencv-python”,后进行安装,安装进度会展示在Pycharm的状

@TOC【二维码、条码识别】【Python+OpenCV】基于OpenCV库的二维码、条形码识别识别【含源码 1-1】

环境:Win 10、Pycharm 、Python3.9

1.Pycharm安装OpenCV

因需用到cv2库(安装的OpenCV版本为OpenCV4.5.5),所以需要在PyCharm中安装OpenCV。安装步骤为:点开”File“菜单的“Setting”选项,然后按照下面的两张图进行操作。
【二维码、条码识别】【Python+OpenCV】基于OpenCV库的二维码、条形码识别识别【含源码 1-1】
点“+”号,输入“opencv-python”,后进行安装,安装进度会展示在Pycharm的状态栏。
【二维码、条码识别】【Python+OpenCV】基于OpenCV库的二维码、条形码识别识别【含源码 1-1】

  • 安装过程中遇到的问题
    1.按照上述步骤进行安装,如安装报错。原因多为pip没有升级为最新版本导致,,该问题是安装其他库也会遇到的问题,需在命令提示符窗口输入“python -m pip install —upgrade pip”命令更新,如下图所示:【二维码、条码识别】【Python+OpenCV】基于OpenCV库的二维码、条形码识别识别【含源码 1-1】
    2.可能导致无法正常更新pip的原因是没有关闭代理服务器【二维码、条码识别】【Python+OpenCV】基于OpenCV库的二维码、条形码识别识别【含源码 1-1】

2.使用命令提示符窗口安装OpenCV

更新pip的方式与上同,更新完之后,输入命令:

pip3 install opencv-python

如图所示:
【二维码、条码识别】【Python+OpenCV】基于OpenCV库的二维码、条形码识别识别【含源码 1-1】
这里需要注意,使用windows系统自带的命令提示符窗口,安装的OpenCV对应Pycharm开发环境,使用anaconda命令提示符窗口,安装的OpenCV对应的是JupyterNoteBook和Spyder开发环境。(参考博客:在Python环境下的OpenCV安装

3.简单的图像二值化程序测试OpenCV是否正常

import cv2
img1 = cv2.imread("E:\Download\二维码样本\二维码样本\二维码222\QR-01604.jpg") #填自己的图片路径
#灰度化处理
gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
#根据所需填充颜色,这里是填充白色,只要不是黑色(0)就填充白色(255)
retval,thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY)
cv2.imshow("a",thresh)
cv2.waitKey(0)
cv2.destroyWindow()

报错如下
【二维码、条码识别】【Python+OpenCV】基于OpenCV库的二维码、条形码识别识别【含源码 1-1】
原因:文件路径中包含中文。
修改为英文路径后,报错
【二维码、条码识别】【Python+OpenCV】基于OpenCV库的二维码、条形码识别识别【含源码 1-1】
这是因为读取文件时用了“\”,在字符串中“\”被当做转义字符来使用,路径经过转义之后可能找不到文件的路径,例如’\t’转义为tab键,也存在有时候能够正常读取的可能(参考博客)。

4.利用OpenCV4的QRCodeDetector进行二维码检测与解析

OpenCV4自带QRCodeDetector有两个API负责二维码检测与解析,分别为detect()函数decode()函数,前者负责检测二维码,并返回二维码的四个顶点的坐标,后者返回二维码的最小外接矩形的顶点坐标、二维码信息。两个API如下:

# 检测二维码
bool cv::QRCodeDetector::detect(
    InputArray img,
    OutputArray points 
)const
#img输入图像,灰度或者彩色图像
#points 得到的二维码四个点的坐标信息

解析二维码

# 解析二维码
std::string cv::QRCodeDetector::decode(
    InputArray img,
    InputArray points,
    OutputArray straight_qrcode = noArray() 
)
#img输入图像,灰度或者彩色图像
#points 二维码ROI最小外接矩形顶点坐标
#qrcode 输出的是二维码区域ROI图像信息
#返回的二维码utf-8字符串

上述两个API功能,可以通过一个API来实现:

std::string cv::QRCodeDetector::detectAndDecode(
    InputArray img,
    OutputArray points = noArray(),
    OutputArray straight_qrcode = noArray() 
)

实现代码如下:

# -*- coding: utf-8 -*-
"""
Created on Fri Jan 21 12:42:23 2022
@author: Victor
"""
import cv2
import glob
import numpy as np
#实例化
detect_obj = cv2.QRCodeDetector()
#获取固定路径下的所有jpg格式图片
path = glob.glob(r"C:\Users\Victor\Desktop\ImagesSets\*.jpg")
for i in range(len(path)):
    #加载图片
     img = cv2.imread(path[i])  
     #QR检测和解析
     qr_info, points, qr_img = detect_obj.detectAndDecode(img)
     #可视化检测效果,绘制其外接矩形
     #cv2.drawContours(img, [np.int32(points)], 0, (0, 0, 255), 2)
     #打印图片路径
     print(path[i])
     #打印解码信息
     print('qr_info:',qr_info)

报错:
【二维码、条码识别】【Python+OpenCV】基于OpenCV库的二维码、条形码识别识别【含源码 1-1】
找到第QR-00041.jpg右键属性,发现不能正常处理的图片都是位深为8位的图片。
【二维码、条码识别】【Python+OpenCV】基于OpenCV库的二维码、条形码识别识别【含源码 1-1】
位深为24的能够正常处理,从图中也可以看出即使属性显示位深为8,仍然还是彩色,所以这也可能是不能正常读取该类图片的原因,将该类图片删掉继续进行调试。
最终代码如下:

# -*- coding: utf-8 -*-
"""
Created on Fri Jan 21 12:42:23 2022
@author: Victor
"""
import cv2
import glob
import numpy as np
j=0  #对识别出信息的图片计数
save_path='C:\\Users\\Victor\\Desktop\\test\\'
#实例化
detect_obj = cv2.QRCodeDetector()
#获取固定路径下的所有jpg格式图片
path = glob.glob(r"C:\Users\Victor\Desktop\ImagesSets\*.jpg")
for i in range(len(path)):
    #加载图片
     if i<34:
       img = cv2.imread(path[i])  
       #QR检测和解析
       qr_info, points, qr_img = detect_obj.detectAndDecode(img)
       #打印图片路径
       print(path[i])
       #打印解码信息
       print('qr_info:',qr_info)
       if qr_info!="":
           j=j+1
            #可视化检测效果,绘制其外接矩形
           cv2.drawContours(img, [np.int32(points)], 0, (0, 0, 255), 2)
           #批量保存检测出来并绘制外接矩形的图片
           cv2.imwrite(save_path+str(i)+'.jpg', img)
print('检出个数',j,';总数为34个')
print('检测准确率为',j/34)

最终检测结果如下
34张图片,共检测出6张。
【二维码、条码识别】【Python+OpenCV】基于OpenCV库的二维码、条形码识别识别【含源码 1-1】
【二维码、条码识别】【Python+OpenCV】基于OpenCV库的二维码、条形码识别识别【含源码 1-1】
数据集(测试用了其中的34张,共3000多张):二维码数据集
代码下载

后续工作

  • 将识别结果存到数据库或excel中。
  • 增加图形界面,可以选择对指定文件夹中的图像进行识别分析。
  • 识别率不是很高,需要改进。
  • 需要对识别结果和实际信息进行对比。
  • 增加数据集和源码链接。

版权声明:本文为博主无敌三角猫原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/u013035197/article/details/122632556

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2022年1月21日 下午5:11
下一篇 2022年1月22日 上午9:53

相关推荐