求助,wechat_qrcode_WeChatQRCode过于灵敏和自动聚焦放大问题

bleach210 2023-08-10 14:26:55

大家好,我用Python编写了一个启用摄像头扫码的功能,使用了wechat的库进行扫码识别,但在实际测试的过程中发现,当二维码放在镜头下,一张二维码经常会被连续扫码两次,出现两个一样的扫码结果,这种情况如何解决。
另外一个问题就是,想让电脑上的摄像头能够实现和手机微信里的扫一扫,有绿线从上到下然后自动聚焦并放大二维码的功能。如何实现?

部分代码如下:

qrcode_detector = cv2.wechat_qrcode_WeChatQRCode( # 创建二维码检测器
"./model/detect.prototxt",
"./model/detect.caffemodel",
"./model/sr.prototxt",
"./model/sr.caffemodel",
)

while True:
#start_time = time.time() # 用于计算用时
ret, image = cap.read() # 读取帧

result = qrcode_detector.detectAndDecode(image) #

if len(result[0]) > 0: # 如果检测到二维码
text = result[0] # 获取二维码文本(链接或文字)
text = ''.join(str(i) for i in text)

print(text)

 

 

 

...全文
1139 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mr Dinosaur 2023-08-11
  • 打赏
  • 举报
回复

问题2:实现电脑摄像头扫描类似手机微信的功能

要实现类似手机微信的扫码体验,你需要实现以下功能:

自动聚焦:使用OpenCV的cv2.VideoCapture对象,你可以调用cap.set(cv2.CAP_PROP_AUTOFOCUS, 1)来启用自动对焦。

自动放大:你可以通过调整摄像头的焦距来实现自动放大。这取决于你的摄像头硬件支持的程度。

绿线效果:你可以在扫描时在图像上绘制一个绿色的竖线,模拟手机微信扫码时的绿线效果。

演示代码如下:

import cv2

cap = cv2.VideoCapture(0)

启用自动聚焦

cap.set(cv2.CAP_PROP_AUTOFOCUS, 1)

while True:
ret, image = cap.read()

# 在图像上绘制绿线
cv2.line(image, (image.shape[1] // 2, 0), (image.shape[1] // 2, image.shape[0]), (0, 255, 0), 2)

cv2.imshow('Scanner', image)
key = cv2.waitKey(1)
if key == 27:  # 按下ESC键退出循环
    break

cap.release()
cv2.destroyAllWindows()

bleach210 2023-08-11
  • 举报
回复
@Mr Dinosaur 我是想说能不能实现类似微信扫一扫的功能,就是如果二维码比较小或者比较远,微信扫码的时候,摄像头会自动放大图像来拉近二维码,然后扫码成功,而且微信的绿线是一直在从上到下循环滚动扫描,谢谢。
Mr Dinosaur 2023-08-11
  • 举报
回复
@bleach210 你所说的这种实现效果可能就比较复杂一些了,我只能为你提供一个基本的框架和思路 这个框架将使用Python的OpenCV库来处理图像,以及Tkinter库来构建简单的GUI界面。 pip install opencv-python opencv-python-headless pillow 演示代码: import cv2 import tkinter as tk from tkinter import ttk from PIL import Image, ImageTk # 创建主窗口 root = tk.Tk() root.title("QR Code Scanner") # 创建摄像头捕获对象 cap = cv2.VideoCapture(0) # 创建标签用于显示摄像头图像 video_label = ttk.Label(root) video_label.pack() # 绿线扫描参数 line_position = 0 line_color = (0, 255, 0) # 绿色 line_thickness = 2 def update_frame(): global line_position ret, frame = cap.read() # 读取帧 if ret: # 在图像上绘制绿色扫描线 cv2.line(frame, (0, line_position), (frame.shape[1], line_position), line_color, line_thickness) # 更新扫描线位置 line_position = (line_position + 5) % frame.shape[0] # 循环滚动 # 将OpenCV图像转换为Tkinter PhotoImage img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) img = Image.fromarray(img) img = ImageTk.PhotoImage(image=img) video_label.img = img video_label.config(image=img) root.after(10, update_frame) # 启动图像更新循环 update_frame() root.mainloop() # 释放摄像头资源 cap.release()
Mr Dinosaur 2023-08-11
  • 打赏
  • 举报
回复 1

问题1:二维码被连续扫码两次的解决方法

这种情况可能是由于视频帧连续捕获到的图像微小变化引起的。你可以通过引入一个冷却时间来解决这个问题,确保每次检测到的二维码之间有一段时间的间隔。

你可以使用Python的time模块来实现冷却时间。在每次成功检测到二维码后,记录当前时间,然后在下一次检测之前检查一下时间间隔是否足够。

演示代码如下:
import time

在循环内部

if len(result[0]) > 0: # 如果检测到二维码
current_time = time.time()
if current_time - last_detection_time > cooldown_duration: # 检查是否过了冷却时间
text = result[0] # 获取二维码文本(链接或文字)
text = ''.join(str(i) for i in text)
print(text)
last_detection_time = current_time

bleach210 2023-08-11
  • 举报
回复
@Mr Dinosaur 非常感谢,此问题已解决,我将间隔设置为了0.5秒,如果一直放着超过这个时间才会重复扫码。再次感谢。

5,486

社区成员

发帖
与我相关
我的任务
社区描述
《深度学习计算机视觉实战》和《学习OpenCV4:基于Python的算法实战》作者,喜欢深度学习、计算机视觉、OpenCV、无人驾驶、算法、C++/Python编程及其提升。
opencv计算机视觉深度学习 个人社区 广东省·珠海市
社区管理员
  • 编程大师兄
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧