python - 用opencv检测到二维码后关闭框架
问题描述
我一直在做这个项目来检测二维码并进行考勤并将输出保存在 sql 数据库中,到目前为止,我已经完成了所有工作,
问题是我实际上希望在检测到单个二维码时关闭框架,解码并且上述所有过程也完成了相机工作并且框架显示但是在检测到二维码时它非常慢。
实际发生的情况是在框架不断打开它并检测到 QR 码后,它实际上会记录多个(大约 15 个)在 2 秒后检测到的 QR 实例。此外,框架仍在上升,我仍然可以检测到图像。
只有在按下等待键 27 或“Esc”后,框架才会关闭
所以我实际上在寻找两件事:
- 检测到二维码后如何关闭框架?
- (附加问题)我如何只检测一个二维码(框架是否关闭)。因此,当我扫描二维码时,要么框架关闭,我只剩下一个解码数据,要么我扫描二维码,框架保持打开状态,直到我点击“Esc”,我只剩下一个解码数据。
这是完整的代码供参考:
import cv2
import os
import csv
import sqlite3
import vobject
from datetime import datetime
import numpy as np
from pyzbar import pyzbar
path = 'qr-codes'
images = []
classNames = []
lists = os.listdir(path)
for cl in lists:
curImage = cv2.imread(f'{path}/{cl}')
images.append(curImage)
classNames.append(os.path.splitext(cl)[0])
def main():
camera = cv2.VideoCapture(0)
ret, frame = camera.read()
while ret:
ret, frame = camera.read()
recognizer = parse_vcard(frame)
win_name = 'Face and QR Detection'
cv2.imshow(win_name, recognizer)
if cv2.waitKey(1) & 0xFF == 27:
break
camera.release()
cv2.destroyAllWindows()
def parse_vcard(frame):
barcodes = pyzbar.decode(frame)
for barcode in barcodes:
x, y, w, h = barcode.rect
cv2.rectangle(frame, (x, y),(x+w, y+h), (0, 255, 0), 2)
mydata = barcode.data.decode('utf-8')
vcard = vobject.readOne(mydata)
make_attendence(vcard)
return frame
def make_attendence(vcard):
name = str(vcard.contents['n'][0].value)
# print(type(Employee.name))
profession = str(vcard.contents['title'][0].value)
now = datetime.now()
date = datetime.date(now)
attendance_time = now.strftime('%H:%M:%S')
leave_time = '21:00:00'
connection = sqlite3.connect('employee.db')
conn = connection.cursor()
# conn.execute("""CREATE TABLE employees (
# name text,
# profission text,
# date date,
# attendance_time time,
# leave_time time
# )""")
conn.execute("INSERT INTO employees VALUES \
(:name, :profession, :date, :attendance_time, :leave_time)", {
'name': name,
'profession': profession,
'date': date,
'attendance_time': attendance_time,
'leave_time': leave_time})
connection.commit()
connection.close()
if __name__ == '__main__':
main()
解决方案
不要为每个 QR 码和您拍摄的每张照片重新连接到数据库。
连接一次。保持连接。
imshow 窗口是一个窗口。“帧”通常是视频中一张图片/图像的术语。你不能“关闭”一个框架。
您可以使用关闭 imshow 窗口destroyAllWindows
或使用单独的 imshow 窗口destroyWindow
使用 python 的“pdb”调试器。使用分析器来调查代码的时间成本。time.perf_counter()
如果您没有找到自己喜欢的分析器,请自行使用并进行测量。
推荐阅读
- android - Google Play 管理中心:将应用从 Alpha 升级到 Beta,但仍需要预先注册
- html - 如何在wijmo网格行之间设置间距
- c# - 如何从 asp.net web api 中的身份声明中获取经过 JWT 身份验证的登录用户
- mysql - 选择查询需要更多执行时间
- html - 尝试使用垂直居中的文本创建圆圈并且存在圆圈下的文本
- swift - I don't know where to define removeFromSuperview () for memory leak countermeasures when implementing addSubview with viewDidLoad
- android - 适用于 Android 和 iOS 的开放式街道地图
- python - 如何避免生成一个 vcard 而不是给定的?
- node.js - 为什么 npm 在我的 react native 项目中抛出 Event.js 187 错误?
- flutter - 如何在 CupertinoPicker 中显示来自服务器的 json 数据