让Python 从桌面读取二维码信息
Posted 初遇我ㄖ寸の热情呢?
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了让Python 从桌面读取二维码信息相关的知识,希望对你有一定的参考价值。
日常生活中,我们通常会拿出智能手机扫描二维码。但是当我们在电脑上工作时,手机可能不是扫描网页上出现的二维码的最佳选择。
- 原因一:从显示器屏幕上拍摄的照片具有干扰 QR 码识别的莫尔图案。
- 原因二:你可能希望直接在 PC 上使用解码后的信息,例如用于打开网站的 URL。
本文将使用 Python 实现一个简单的工具,以方便在桌面屏幕上识别二维码。
安装
所需的 Python 包包括PIL、OpenCV、Dynamsoft Barcode Reader和Qt。
python3 -m pip install pillow opencv-python dbr pyside2
条码 SDK
需要解锁Dynamsoft Barcode SDK 的功能,您可以申请30 天免费试用许可。
从屏幕扫描二维码
由于我已经使用 Qt for Python、OpenCV 和 Dynamsoft Barcode Reader实现了一个GUI 条形码阅读器,剩下的就是添加屏幕截图功能。实现截图功能的步骤:
- 创建一个自定义 Qt 小部件并将其放在屏幕顶部。
- paintEvent()在移动鼠标的同时绘制所选区域的功能。
- 释放鼠标后,调用PIL.ImageGrab.grab()以获取所选区域的图像。
添加用于剪切事件的按钮
我们design.ui在 Qt Creator 中打开文件并添加两个按钮来触发截图事件。
保存文件并重新编译design.ui为design.py:
pyside2-uic design.ui -o design.py
在 中app_advanced.py,两个新按钮现在应该可以识别了。将它们连接到插槽函数:
self.ui.pushButton_area.clicked.connect(self.snipArea)
self.ui.pushButton_full.clicked.connect(self.snipFull)
创建自定义 Qt 小部件
创建一个SnippingTool.py文件,我们在其中创建一个自定义 Qt 小部件:
import numpy as np
import cv2
from PIL import ImageGrab
from PySide2 import QtWidgets, QtCore, QtGui
from PySide2.QtCore import Qt
class SnippingWidget(QtWidgets.QWidget):
is_snipping = False
def __init__(self, parent=None, app=None):
super(SnippingWidget, self).__init__()
self.parent = parent
self.setWindowFlags(Qt.WindowStaysOnTopHint)
self.screen = app.primaryScreen()
self.setGeometry(0, 0, self.screen.size().width(), self.screen.size().height())
self.begin = QtCore.QPoint()
self.end = QtCore.QPoint()
self.onSnippingCompleted = None
def start(self):
SnippingWidget.is_snipping = True
self.setWindowOpacity(0.3)
QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.CrossCursor))
self.show()
小部件的大小应与屏幕分辨率相同,可从primaryScreen()函数中获取。
接下来,我们处理鼠标事件:
def mousePressEvent(self, event):
self.begin = event.pos()
self.end = self.begin
self.update()
def mouseMoveEvent(self, event):
self.end = event.pos()
self.update()
def mouseReleaseEvent(self, event):
SnippingWidget.is_snipping = False
QtWidgets.QApplication.restoreOverrideCursor()
x1 = min(self.begin.x(), self.end.x())
y1 = min(self.begin.y(), self.end.y())
x2 = max(self.begin.x(), self.end.x())
y2 = max(self.begin.y(), self.end.y())
self.repaint()
QtWidgets.QApplication.processEvents()
self.close()
当鼠标移动时,我们画一个矩形来表示paintEvent()函数中的选定区域:
def paintEvent(self, event):
if SnippingWidget.is_snipping:
brush_color = (128, 128, 255, 100)
lw = 3
opacity = 0.3
else:
self.begin = QtCore.QPoint()
self.end = QtCore.QPoint()
brush_color = (0, 0, 0, 0)
lw = 0
opacity = 0
self.setWindowOpacity(opacity)
qp = QtGui.QPainter(self)
qp.setPen(QtGui.QPen(QtGui.QColor('black'), lw))
qp.setBrush(QtGui.QColor(*brush_color))
rect = QtCore.QRectF(self.begin, self.end)
qp.drawRect(rect)
拍摄屏幕图像
PIL 是用于从屏幕捕获图像的 Python 库。松开鼠标后,我们根据矩形的坐标对选中区域进行截图。
img = ImageGrab.grab(bbox=(x1, y1, x2, y2))
try:
img = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
except:
img = None
拍摄全屏图像很容易:
img = ImageGrab.grab(bbox=(0, 0, self.screen.size().width(), self.screen.size().height()))
隐藏和显示应用程序窗口
一旦截图小部件准备好,我们就可以在按钮点击事件中调用它。注意:为避免遮挡屏幕,应用程序窗口应在启动截图小部件前最小化,并在截图完成后恢复:
def onSnippingCompleted(self, frame):
self.setWindowState(Qt.WindowMaximized)
if frame is None:
return
frame, self._results = self._barcodeManager.decode_frame(frame)
self.showResults(frame, self._results)
def snipArea(self):
self.setWindowState(Qt.WindowMinimized)
self.snippingWidget.start()
def snipFull(self):
self.setWindowState(Qt.WindowMinimized)
self.snippingWidget.fullscreen()
测试屏幕二维码阅读器
- 运行条码识别程序:
python3 app_advanced.py
- 在百度搜索二维码。
- 点击Select Area按钮扫描搜索引擎返回的二维码(一个或多个)。
您还可以一键进行全屏条码识别。您还可以一键进行全屏条码识别。
以上是关于让Python 从桌面读取二维码信息的主要内容,如果未能解决你的问题,请参考以下文章
如何让 Python 从文本文件中读取和提取单词? [复制]