求助,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)

 

 

 

...全文
721 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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秒,如果一直放着超过这个时间才会重复扫码。再次感谢。
OpenCV(Open Source Computer Vision Library)是一款开源的计算机视觉库,专门为图像和视频处理任务设计,广泛应用于学术研究、工业应用以及个人项目中。以下是关于OpenCV的详细介绍: 历史与发展 起源:OpenCV于1999年由英特尔公司发起,旨在促进计算机视觉技术的普及和商业化应用。该项目旨在创建一个易于使用、高效且跨平台的库,为开发者提供实现计算机视觉算法所需的基础工具。 社区与支持:随着时间的推移,OpenCV吸引了全球众多开发者和研究人员的参与,形成了活跃的社区。目前,OpenCV由非盈利组织OpenCV.org维护,并得到了全球开发者、研究机构以及企业的持续贡献和支持。 主要特点 跨平台:OpenCV支持多种操作系统,包括但不限于Windows、Linux、macOS、Android和iOS,确保代码能够在不同平台上无缝运行。 丰富的功能:库中包含了数千个优化过的函数,涵盖了计算机视觉领域的诸多方面,如图像处理(滤波、形态学操作、色彩空间转换等)、特征检测与描述(如SIFT、SURF、ORB等)、物体识别与检测(如Haar级联分类器、HOG、DNN等)、视频分析、相机校正、立体视觉、机器学习(SVM、KNN、决策树等)、深度学习(基于TensorFlow、PyTorch后端的模型加载与部署)等。 高效性能:OpenCV代码经过高度优化,能够利用多核CPU、GPU以及特定硬件加速(如Intel IPP、OpenCL等),实现高速图像处理和实时计算机视觉应用。 多语言支持:尽管OpenCV主要使用C++编写,但它提供了丰富的API绑定,支持包括C、Python、Java、MATLAB、JavaScript等多种编程语言,方便不同领域的开发者使用。 开源与免费:OpenCV遵循BSD开源许可证发布,用户可以免费下载、使用、修改和分发库及其源代码,无需担心版权问题。 架构与核心模块 OpenCV的架构围绕核心模块构建,这些模块提供了不同层次的功能: Core:包含基本的数据结构(如cv::Mat用于图像存储和操作)、基本的图像和矩阵操作、数学函数、文件I/O等底层功能。 ImgProc:提供图像预处理、滤波、几何变换、形态学操作、直方图计算、轮廓发现与分析等图像处理功能。 HighGui:提供图形用户界面(GUI)支持,如图像和视频的显示、用户交互(如鼠标事件处理)以及简单的窗口管理。 VideoIO:负责视频的读写操作,支持多种视频格式和捕获设备。 Objdetect:包含预训练的对象检测模型(如Haar级联分类器用于人脸检测)。 Features2D:提供特征点检测(如SIFT、ORB)与描述符计算、特征匹配与对应关系估计等功能。 Calib3d:用于相机标定、立体视觉、多视图几何等问题。 ML:包含传统机器学习算法,如支持向量机(SVM)、K近邻(KNN)、决策树等。 DNN:深度神经网络模块,支持导入和运行预训练的深度学习模型,如卷积神经网络(CNN)。

5,280

社区成员

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

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