首页 > 解决方案 > 用opencv检测到二维码后关闭框架

问题描述

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

问题是我实际上希望在检测到单个二维码时关闭框架,解码并且上述所有过程也完成了相机工作并且框架显示但是在检测到二维码时它非常慢。

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

只有在按下等待键 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()

标签: pythonsqliteopencv

解决方案


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

连接一次。保持连接。

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

您可以使用关闭 imshow 窗口destroyAllWindows或使用单独的 imshow 窗口destroyWindow

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


推荐阅读