Python OpenCV代码读取器
我想用opencv和Python制作二维码阅读器。我的硬件是Raspberry Pi 4B和Pi摄像头 在代码中,当我向摄像头显示QR代码时,opencv将对QR进行解码。之后,我想使用requests.post将此代码发送到Node.js服务器。里面一切正常,但有个问题。问题是,只要相同的二维码停留在摄像机前,它就会不断地用该码发送post请求 在该系统中,人们将从手机中读取二维码,然后根据二维码进入大楼。Nodejs向服务器发送无限请求,因为只要屏幕上有二维码,用户就会发送二维码 实际上系统应该是这样工作的 用户将二维码保存在相机中 对于requests.post,代码被发送到服务器 服务器返回否定或肯定响应 答案出现在屏幕上 在下一个用户到达之前,不会采取任何操作 请告诉我你对这件事的看法 如何在其他用户到达之前停止发送请求 我如何用函数控制它 test.pyPython OpenCV代码读取器,python,opencv,qr-code,Python,Opencv,Qr Code,我想用opencv和Python制作二维码阅读器。我的硬件是Raspberry Pi 4B和Pi摄像头 在代码中,当我向摄像头显示QR代码时,opencv将对QR进行解码。之后,我想使用requests.post将此代码发送到Node.js服务器。里面一切正常,但有个问题。问题是,只要相同的二维码停留在摄像机前,它就会不断地用该码发送post请求 在该系统中,人们将从手机中读取二维码,然后根据二维码进入大楼。Nodejs向服务器发送无限请求,因为只要屏幕上有二维码,用户就会发送二维码 实际上系统
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)
前一个代码=前一个代码
正如我在评论中所写,您可以将lastqrcode
保留在变量中,并与新值进行比较。如果值相同,则不发送请求
。如果新值不同,则发送请求
,并保留新值以将其与下一个值进行比较
值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‘非常感谢:’中提到了