资讯专栏INFORMATION COLUMN

让Python 从桌面读取二维码信息

trilever / 2007人阅读

摘要:原因一从显示器屏幕上拍摄的照片具有干扰码识别的莫尔图案。原因二你可能希望直接在上使用解码后的信息,例如用于打开网站的。本文将使用实现一个简单的工具,以方便在桌面屏幕上识别二维码。

日常生活中,我们通常会拿出智能手机扫描二维码。但是当我们在电脑上工作时,手机可能不是扫描网页上出现的二维码的最佳选择。

  • 原因一:从显示器屏幕上拍摄的照片具有干扰 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 npimport cv2from PIL import ImageGrabfrom PySide2 import QtWidgets, QtCore, QtGuifrom PySide2.QtCore import Qtclass 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() 

测试屏幕二维码阅读器

  1. 运行条码识别程序:
python3 app_advanced.py
  1. 在百度搜索二维码。
  2. 点击Select Area按钮扫描搜索引擎返回的二维码(一个或多个)。

    您还可以一键进行全屏条码识别。您还可以一键进行全屏条码识别。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/122534.html

相关文章

  • Windows桌面程序自动化控制之uiautomation模块全面讲解

    摘要:大家好,我是小小明,经过个月断断续续的整理,模块桌面自动化控制的系统教程终于成型出炉了。模块所支持的剪切板操作的功能也远远超过常规的专门用于剪切板复制粘贴的库。很多程序没有实现,所以不支持自动化。 ...

    GT 评论0 收藏0
  • Python到底能做什么?

    摘要:数据科学包括机器学习,数据分析和数据可视化首先,机器学习是什么解释机器学习的最佳方法是给你一个简单的例子。机器学习算法的工作方式大致相同。这是一个人们竞争为特定问题构建最佳机器学习算法的网站。 showImg(https://segmentfault.com/img/remote/1460000018887722); 来源 | 愿码(ChainDesk.CN)内容编辑 愿码Sloga...

    Lionad-Morotar 评论0 收藏0
  • Python到底能做什么?

    摘要:数据科学包括机器学习,数据分析和数据可视化首先,机器学习是什么解释机器学习的最佳方法是给你一个简单的例子。机器学习算法的工作方式大致相同。这是一个人们竞争为特定问题构建最佳机器学习算法的网站。 showImg(https://segmentfault.com/img/remote/1460000018887722); 来源 | 愿码(ChainDesk.CN)内容编辑 愿码Sloga...

    YacaToy 评论0 收藏0
  • 常用的数据可视化工具

    摘要:俗话说,不会使用工具来完成任务的都是进化不完全的表现,大数据时代,可视化已经深深钻进我们的生活,使用可视化工具也变的相当普遍,今天我们来总结下当下可视化工具都有哪些。是一个地图库,主要面向数据可视化用户。 俗话说,不会使用工具来完成任务的都是进化不完全的表现,大数据时代,可视化已经深深钻进我们的生活,使用可视化工具也变的相当普遍,今天我们来总结下当下可视化工具都有哪些。 showImg...

    philadelphia 评论0 收藏0
  • SegmentFault 技术周刊 Vol.30 - 学习 Python 来做一些神奇好玩的事情吧

    摘要:学习笔记七数学形态学关注的是图像中的形状,它提供了一些方法用于检测形状和改变形状。学习笔记十一尺度不变特征变换,简称是图像局部特征提取的现代方法基于区域图像块的分析。本文的目的是简明扼要地说明的编码机制,并给出一些建议。 showImg(https://segmentfault.com/img/bVRJbz?w=900&h=385); 前言 开始之前,我们先来看这样一个提问: pyth...

    lifesimple 评论0 收藏0

发表评论

0条评论

trilever

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<