环境:Win 10、Pycharm 、Python3.9

1.Pycharm安装OpenCV

因需用到cv2库(安装的OpenCV版本为OpenCV4.5.5),所以需要在PyCharm中安装OpenCV。安装步骤为:点开”File“菜单的“Setting”选项,然后按照下面的两张图进行操作。

点“+”号,输入“opencv-python”,后进行安装,安装进度会展示在Pycharm的状态栏。

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

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

    更新pip的方式与上同,更新完之后,输入命令:
    pip3 install opencv-python
    
    如图所示:

    这里需要注意,使用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()
    
    报错如下
    报错
    原因:文件路径中包含中文。
    修改为英文路径后,报错

    这是因为读取文件时用了“\”,在字符串中“\”被当做转义字符来使用,路径经过转义之后可能找不到文件的路径,例如’\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)

报错:

找到第QR-00041.jpg右键属性,发现不能正常处理的图片都是位深为8位的图片。

位深为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张。


数据集(测试用了其中的34张,共3000多张):二维码数据集
代码下载

后续工作

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