需求:有多张印有二维码的投票卡,需要通过扫描二维码将投票码读取出来,然后保存到excel文件中
代码如下:
[Python] 纯文本查看 复制代码 # encoding:utf-8
'''
所用调试设备:surface pro 6
步骤:
获取图片
识别二维码内容,需要校验是否有重复扫码
保存到excel文档中
'''
import cv2 # opencv库,用于调用摄像头
import pyzbar.pyzbar as pyzbar # 识别二维码
import requests
import re
import json
import random
from threading import Thread # 多线程
from multiprocessing import Process # 多进程
import time # 用于代码间的暂停
import datetime # 用于设定抢购时间
from urllib import parse # 用于字符进行URL编码和解码
import pandas as pd # 处理数据流
def camera1():
'''
例子:调用摄像头,并且在窗口中显示摄像头拍摄的画面
'''
camera = cv2.VideoCapture(1) # 捕捉摄像头,0为surface的前置摄像头,1为后置摄像头,如果要打开本地视频,则输入视频路径
# ret,frame = camera.read() # 读取摄像头画面
# print(ret)
# cv2.imshow('windows',frame)
# cv2.waitKey(1) # 帧显示间隔,单位为ms
fps = camera.get(cv2.CAP_PROP_FPS) # 获取视频帧率
size = (int(camera.get(cv2.CAP_PROP_FRAME_WIDTH)),int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT))) # 获取图像尺寸
while True:
ret,frame = camera.read() # 读取摄像头画面,ret为读取结果,成功为
cv2.imshow('windows',frame) # 视频按帧形式显示
c = cv2.waitKey(1) # 帧显示间隔,单位为ms
if c == 27: # 功能:按esc键退出,c得到的是键盘输入的ASCII码,esc键对应的ASCII码是27,c = cv2.waitKey(1)等待输入一个字符,当输入的字符是esc键(对应的ASCII码是27),即当按esc键,执行if然后程序break就退出
break
camera.release() # 释放,表示视频结束了
cv2.destroyAllWindows() # 关闭所有的窗口
def decode(gray):
barcodes = pyzbar.decode(gray) # 识别出来是一个列表list类型
if barcodes == []: # 如果没有识别到二维码的话,就会返回空值
# print('barcodes is ',barcodes,type(barcodes))
pass
else: # 识别出二维码则退出
for barcode in barcodes:
barcodeData = barcode.data.decode('utf-8') # 输出数据类型为str类型
print(barcodeData)
return barcodeData
def scanner(file_path):
camera = cv2.VideoCapture(1) # 捕捉摄像头,0为surface的前置摄像头,1为后置摄像头,如果要打开本地视频,则输入视频路径
# ret,frame = camera.read() # 读取摄像头画面
# print(ret)
# cv2.imshow('windows',frame)
# cv2.waitKey(1) # 帧显示间隔,单位为ms
fps = camera.get(cv2.CAP_PROP_FPS) # 获取视频帧率
size = (int(camera.get(cv2.CAP_PROP_FRAME_WIDTH)),int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT))) # 获取图像尺寸
temp = ['内容'] # 列表list类型数据,用于暂存扫码结果,同时用于比对扫码结果是否有重复的
count = 0 # 用于记录扫码成功个数
while True:
ret,frame = camera.read() # 读取摄像头画面,ret为读取结果,成功为
cv2.imshow('windows',frame) # 视频按帧形式显示
# 转为灰度图像
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
# 解码
barcodeData = decode(gray)
# 比对是否有重复扫描结果
if barcodeData == None:
# print('没有识别出二维码,请重试')
pass
elif barcodeData in temp:
print('重复扫描,请扫描下一个二维码')
else:
temp.append(barcodeData)
count+=1
print('已成功扫描了',count,'个二维码')
c = cv2.waitKey(100) # 帧显示间隔,单位为ms,相当于刷新率,控制识别频率
if c == 27: # 功能:按esc键退出,c得到的是键盘输入的ASCII码,esc键对应的ASCII码是27,c = cv2.waitKey(1)等待输入一个字符,当输入的字符是esc键(对应的ASCII码是27),即当按esc键,执行if然后程序break就退出
break
camera.release() # 释放,表示视频结束了
cv2.destroyAllWindows() # 关闭所有的窗口
df = pd.DataFrame(temp) # 将列表temp转化为pandas的dataframe数据
print('-'*25)
print(df)
print('-'*25)
print('本次扫码成功扫描了',count,'个二维码')
print('-'*25)
df.to_excel(file_path,sheet_name='code',index=False,header = False) # 将最终的扫码结果保存为excel表格
# 程序入口
if __name__ == '__main__':
file_path = r'C:\Users\Felix\Desktop\code.xlsx' # 扫码结果保存的路径和文件名称
scanner(file_path)
TODO:增加语音提示,增加窗口显示扫扫描结果
效果视频:
https://www.bilibili.com/video/BV1Q34y1e7ak |