felixfqz 发表于 2022-4-16 21:39

python调用摄像头进行二维码连续扫描,结果保存为excel文件

需求:有多张印有二维码的投票卡,需要通过扫描二维码将投票码读取出来,然后保存到excel文件中
代码如下:
# 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

pkni1230 发表于 2022-4-17 00:11

这个apk文件是怎么生成的?

sanyuebeichen 发表于 2022-4-17 00:53

来看一下

话痨司机啊 发表于 2022-4-17 08:15

又学到新东西了,不错不错,爱了爱了,希望以后多处教程,加油

y6428021 发表于 2022-4-17 08:47

看看学习下{:1_921:}

11qq... 发表于 2022-4-17 10:08

棒!!!!

xiadongming 发表于 2022-4-17 10:13

king100 发表于 2022-4-17 10:27

学习了,慢慢揣摩

felixfqz 发表于 2022-4-17 10:42

pkni1230 发表于 2022-4-17 00:11
这个apk文件是怎么生成的?

apk的文件是别人的,就是不会写apk,所以参考用windows下调用摄像头实现的
页: [1]
查看完整版本: python调用摄像头进行二维码连续扫描,结果保存为excel文件