Python OpenCV代码读取器

Python OpenCV代码读取器,python,opencv,qr-code,Python,Opencv,Qr Code,我想用opencv和Python制作二维码阅读器。我的硬件是Raspberry Pi 4B和Pi摄像头 在代码中,当我向摄像头显示QR代码时,opencv将对QR进行解码。之后,我想使用requests.post将此代码发送到Node.js服务器。里面一切正常,但有个问题。问题是,只要相同的二维码停留在摄像机前,它就会不断地用该码发送post请求 在该系统中,人们将从手机中读取二维码,然后根据二维码进入大楼。Nodejs向服务器发送无限请求,因为只要屏幕上有二维码,用户就会发送二维码 实际上系统

我想用opencv和Python制作二维码阅读器。我的硬件是Raspberry Pi 4B和Pi摄像头

在代码中,当我向摄像头显示QR代码时,opencv将对QR进行解码。之后,我想使用requests.post将此代码发送到Node.js服务器。里面一切正常,但有个问题。问题是,只要相同的二维码停留在摄像机前,它就会不断地用该码发送post请求

在该系统中,人们将从手机中读取二维码,然后根据二维码进入大楼。Nodejs向服务器发送无限请求,因为只要屏幕上有二维码,用户就会发送二维码

实际上系统应该是这样工作的

用户将二维码保存在相机中

对于requests.post,代码被发送到服务器

服务器返回否定或肯定响应

答案出现在屏幕上

在下一个用户到达之前,不会采取任何操作

请告诉我你对这件事的看法

如何在其他用户到达之前停止发送请求

我如何用函数控制它

test.py

basic_auth_url= "http://192.168.1.6:3000/test"


def qr_test(code):
    myObj={"code":code}
    response = requests.post(
            url=basic_auth_url,
            data=myObj
            )
            
    print(response.content)




cap = cv2.VideoCapture(0)

detector = cv2.QRCodeDetector()

while True:
    _, img = cap.read()
    data, bbox, _ = detector.detectAndDecode(img)
    
    if(bbox is not None):
        for i in range(len(bbox)):
            cv2.line(img, tuple(bbox[i][0]), tuple(bbox[(i+1) % len(bbox)][0]), color=(255,
                     0, 255), thickness=2)
        cv2.putText(img, data, (int(bbox[0][0][0]), int(bbox[0][0][1]) - 10), cv2.FONT_HERSHEY_SIMPLEX,
                    0.5, (0, 255, 0), 2)
        if data:
        
            code=data
            code1=str(code)
            code=code.split("|")

            code_1=code[1]
            code_1=code_1[0:10]
            qr_test(code_1)
    cv2.imshow("code detector", img)
    if(cv2.waitKey(1) == ord("q")):
        break
cap.release()
cv2.destroyAllWindows()

将全局变量previous\u qrcode声明为None,然后将其更新为当前条码的值,如果用户尝试调用具有类似于previous\u qrcode的qr码值的qr\u test()函数,该函数将不起任何作用

希望这会有所帮助

#/usr/bin/python
#-*-编码:utf-8-*-
#你可以这样做
基本身份验证url=http://192.168.1.6:3000/test'
以前的代码=无
def qr_测试(代码):
如果代码!=以前的错误代码:
myObj={'code':code}
response=requests.post(url=basic\u auth\u url,data=myObj)
打印(response.content)
前一个代码=前一个代码

正如我在评论中所写,您可以将last
qrcode
保留在变量中,并与新值进行比较。如果值相同,则不发送
请求
。如果新值不同,则发送
请求
,并保留新值以将其与下一个值进行比较

last\qrcode
必须位于函数外部,才能成为全局值,并在函数执行之间保持值。在函数内部,您必须使用
global
通知函数它必须为外部变量赋值

last_code = None   # default value at start

def qr_test(code):
    global last_code

    if code != last_code:
       myObj = {"code": code}
       response = requests.post(
                    url=basic_auth_url,
                    data=myObj
                 )
   
       result = response.content        
       last_code = code

       print(result)
您还可以在某些列表/字典中保留所有唯一值作为缓存,以从字典中获取它,而不是发送
请求
。因为它将更改ndictionary中的值,所以不需要
global

last_code = None   # default value at start
all_codes = {}     # empty dict at start

def qr_test(code):
    global last_code

    if code != last_code:

       if code in all_codes:
           result = all_codes[code]
           print('already seen before')
       else:
           myObj = {"code": code}
           response = requests.post(
                    url=basic_auth_url,
                    data=myObj
                 )
           result = response.content        
           all_codes[code] result

       last_code = code              

       print(result)
您可以使用标准缓存,但它需要以不同的方式写入,并且无法识别它是否是从缓存中获取的

import functools

last_code = None   # default value at start

@functools.cache
def check_code(code):
    myObj = {"code": code}
    response = requests.post(
                 url=basic_auth_url,
                 data=myObj
               )

    return response.content

def qr_test(code):
    global last_code

    if code != last_code:
       result = check_code(code)
       last_code = code              

       print(result)

使用此选项,您可以在缓存中仅保留10个最后结果。

将最后一个
qrcode
保留在变量中,并与新值进行比较-如果值相同,则不发送请求。如果新值不同,则发送请求并保留新值以将其与下一个值进行比较。您也可以在某些列表/字典中保留所有唯一的值作为缓存,以便从字典中获取,而不是发送请求。您可以解释一下程序的上下文吗?它如何解决OP的问题?解释你的答案。描述一下你们在代码中做了什么。我已经看到了代码中的错误。你在print‘非常感谢:’中提到了