使用opencv检测二维码后关闭框架

2024-05-20 00:00:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在做这个项目,检测二维码,出勤,并在sql数据库中输出结果,到目前为止,我已经完成了所有工作

问题是,当检测到一个二维码、解码并完成上述所有过程时,我实际上希望帧关闭。摄像机工作,帧显示,但检测二维码时速度非常慢

实际发生的情况是,在框架不断打开并检测到QR码后,它实际上会记录多个(大约15个)QR实例,大约2秒钟后被检测到。此外,帧仍然向上,我仍然可以检测图像

只有在按下waitkey(27)或“Esc”后,框架才会关闭

所以我实际上在寻找两件事:

  1. 检测到二维码后如何关闭框架
  2. (附加问题)如何仅检测一个二维码(无论框架是否关闭)。因此,当我扫描二维码时,要么框架关闭,留下一个解码数据,要么扫描二维码,框架保持打开,直到我点击“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()

Tags: pathnameimport框架datetimedatetimecv2
1条回答
网友
1楼 · 发布于 2024-05-20 00:00:44

不要为您拍摄的每个二维码和每张照片重新连接到数据库

连接一次。保持联系

imshow窗口是一个窗口。“帧”通常是来自视频的一幅图片/图像的术语。你不能“关闭”一个框架

您可以使用destroyAllWindows关闭imshow窗口,也可以使用destroyWindow关闭单个imshow窗口

使用python的“pdb”调试器。使用探查器调查代码的时间开销。如果找不到您喜欢的分析器,请使用time.perf_counter()并自己进行测量

相关问题 更多 >