当前位置:   article > 正文

opencv实战---检测二维码和条形码_opencv 条形码

opencv 条形码

目录

制作简易的二维码:

识别二维码和条形码:

相关库:

decode函数解码:

准确圈出二维码的位置:

cv2.polylines():

cv2.putText():

判断二维码是否授权:

使用图片进行识别的完整代码:

使用摄像头实时识别完整代码:


以下所有代码在识别条形码处也适用。

制作简易的二维码:

如果已经有二维码的可以跳过这一步。

使用的是办公软件excel实现。但这里只能做英文和数字类型的。

1、在任意单元格内输入内容。这里是在A40处输入内容“168Qr”。

 2、选项卡里找到开发工具---插入---点击ActiveX控件的最右下角。

3、弹出的窗口内,往下滑动选择Microsoft BarCode Control 16.0后,点击确定。

4、在任意区域,摁住鼠标左键不放,拖动鼠标,画出合适大小的矩形,松开鼠标,即可获得一个条形码。

5、右击条形码,选择属性,点击自定义右边“...”,弹窗内的样式,选择最后一个“11 - QR Code”,点击确定。

6、回到这里的属性,找到"LinledCell",输入前面有内容的单元格位置,这里输入的是“A40”。结束后,点击右上角关闭。

 

 

 手机扫一扫即可。

识别二维码和条形码:

软件:pycharm    解释器:python 3.7

相关库:

  1. import cv2 # opencv-python==4.2.0.34
  2. import numpy as np # numpy==1.21.6
  3. from pyzbar.pyzbar import decode

decode函数解码:

使用decode函数对二维码的图片进行解码,会看到结果会出现以下一些参数。其中,data代表二维码的内容;type代表是条形码还是二维码类型;rect代表二维码轮廓的信息;polygon二维码轮廓的位置,从左上角逆时针旋转。

  1. img = cv2.imread('2.png')
  2. result = decode(img)
  3. print(result)

[Decoded(data=b'168Qr', type='QRCODE', rect=Rect(left=91, top=84, width=174, height=162), polygon=[Point(x=91, y=84), Point(x=91, y=246), Point(x=265, y=245), Point(x=265, y=84)], quality=1, orientation='UP')]

 利用循环分别获取解码出来的信息:

  1. for barCode in result:
  2. print(barCode.data)
  3. print(barCode.rect)
  4. print(barCode.polygon)

结果:

 发现会出现“ b'168Qr' ”,b代表它是以字节为单位。想要去掉这个“b”,那么需要进行解码。

  1. for barCode in result:
  2. print(barCode.data)
  3. myData = barCode.data.decode('utf-8')
  4. print(myData)

结果:解码成功

准确圈出二维码的位置:

解码结束后,在图片上显示出二维码的位置和二维码的内容。

根据解码后的polygon返回值,框出二维码。

  1. for barCode in result:
  2. myData = barCode.data.decode('utf-8')
  3. pts = np.array([barCode.polygon], np.int32) # 创建一个int32数据类型的二维码轮廓数组
  4. pts = pts.reshape((-1, 1, 2)) # 自适应维度大小
  5. cv2.polylines(img, [pts], True, (255, 0, 255), 5)

cv2.polylines():

  • cv2.polylines(img,  pts, isClosed, color, thickness)
  • 其中,pts: 折线顶点数组;isClosed:是否是闭合折线(多边形)

 根据解码后的rect返回值,确定二维码内容放置的位置。

  1. pts2 = barCode.rect
  2. cv2.putText(img, myData, (pts2[0], pts2[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255, 0, 255), 2)

cv2.putText():

cv.putText(img, text, org, fontFace,fontScale,color[, thickness[, lineType[, bottomLeftOrigin]]])

其中,参数依次为:图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细

判断二维码是否授权:

先在当前文件夹内创建一个文本文件,里面输入一些授权的二维码内容。

比如:

 然后在解码的py文件下,读取这个文本文件的内容:

  1. with open('myDataList.txt') as f:
  2. myDataList = f.read().splitlines()
  3. print(myDataList)

结果:

 接着,根据二维码的内容来判断是否授权。如果二维码的内容在这个文本文件内,那么输出“Authorized”,而且框二维码的线条为绿色;如果二维码的内容不在这个文本文件内,那么输出“Un-Authorized”,而且框二维码的线条为红色。

使用图片进行识别的完整代码:

  1. import cv2
  2. import numpy as np
  3. from pyzbar.pyzbar import decode
  4. img = cv2.imread('8.png')
  5. result = decode(img)
  6. with open('myDataList.txt') as f:
  7. myDataList = f.read().splitlines()
  8. print(myDataList)
  9. for barCode in result:
  10. myData = barCode.data.decode('utf-8')
  11. if myData in myDataList:
  12. myOutPut = "Authorized"
  13. myColor = (0, 255, 0)
  14. else:
  15. myOutPut = "Un-Authorized"
  16. myColor = (0, 0, 255)
  17. pts = np.array([barCode.polygon], np.int32) # 创建一个int32数据类型的二维码轮廓数组
  18. pts = pts.reshape((-1, 1, 2)) # 自适应维度大小
  19. cv2.polylines(img, [pts], True, myColor, 5)
  20. pts2 = barCode.rect
  21. cv2.putText(img, myData, (pts2[0], pts2[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.9, myColor, 2)
  22. cv2.imshow('22', img)
  23. cv2.waitKey(0)

使用摄像头实时识别完整代码:

  1. import cv2
  2. import numpy as np
  3. from pyzbar.pyzbar import decode
  4. # 导入摄像头
  5. cap = cv2.VideoCapture(0)
  6. cap.set(3, 320) #摄像头的宽度
  7. cap.set(4, 320) #摄像头的高度
  8. cap.set(10, 100) #摄像头的亮度
  9. with open('myDataList.txt') as f:
  10. myDataList = f.read().splitlines()
  11. while True:
  12. success, img = cap.read()
  13. for barcode in decode(img):
  14. myData = barcode.data.decode('utf-8')
  15. print(myData)
  16. if myData in myDataList:
  17. myOutPut = "Authorized"
  18. myColor = (0, 255, 0)
  19. else:
  20. myOutPut = "Un-Authorized"
  21. myColor = (0, 0, 255)
  22. pts = np.array([barcode.polygon], np.int32)
  23. pts = pts.reshape((-1, 1, 2))
  24. cv2.polylines(img, [pts], True, myColor, 5)
  25. pts2 = barcode.rect
  26. cv2.putText(img, myOutPut, (pts2[0], pts2[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.9, myColor, 2)
  27. cv2.imshow("Result",img)
  28. if cv2.waitKey(1) & 0xFF == ord('q'):
  29. break

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/649289
推荐阅读
相关标签
  

闽ICP备14008679号