Python在QtSide6(PyQt)上加载网页使用OpenCV进行图像处理

基本思路:

1.在Qt Designer中添加QWebEngineView,该组件可用于加载网页

2.在python中开启Timer事件,每10ms进行一次网页窗口截图(QWidget.grab)

3.将截图(QPixmap)转换为cv.mat,进行图像处理

运行效果,右图为OpenCV画了一个圆

ui.py代码

python 复制代码
# -*- coding: utf-8 -*-

################################################################################
## Form generated from reading UI file 'untitledNReTow.ui'
##
## Created by: Qt User Interface Compiler version 6.7.2
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################

from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
    QMetaObject, QObject, QPoint, QRect,
    QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
    QFont, QFontDatabase, QGradient, QIcon,
    QImage, QKeySequence, QLinearGradient, QPainter,
    QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWebEngineWidgets import QWebEngineView
from PySide6.QtWidgets import (QApplication, QDialog, QPushButton, QSizePolicy,
    QWidget)

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        if not Dialog.objectName():
            Dialog.setObjectName(u"Dialog")
        Dialog.resize(974, 687)
        self.webEngineView = QWebEngineView(Dialog)
        self.webEngineView.setObjectName(u"webEngineView")
        self.webEngineView.setGeometry(QRect(0, 10, 961, 611))
        self.webEngineView.setUrl(QUrl(u"https://open.ys7.com/ezopen/h5/iframe?url=ezopen://open.ys7.com/AW6277952/1.live&autoplay=1&accessToken=at.7hthi2pb71l35ssa0j4f7b9e8nmecl8r-2a50tvzyqk-06ad9jw-6yavo9soe"))
        self.pushButton = QPushButton(Dialog)
        self.pushButton.setObjectName(u"pushButton")
        self.pushButton.setGeometry(QRect(890, 660, 75, 24))

        self.retranslateUi(Dialog)

        QMetaObject.connectSlotsByName(Dialog)
    # setupUi

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(QCoreApplication.translate("Dialog", u"Dialog", None))
        self.pushButton.setText(QCoreApplication.translate("Dialog", u"play", None))
    # retranslateUi

main.py代码

python 复制代码
from symtable import Class

from ui import Ui_Dialog
import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton
from PySide6 import QtCore, QtGui
from PySide6.QtGui import QPixmap
from PySide6.QtCore import QRect, QPoint, QSize
from PySide6.QtCore import QTimer
import cv2
import numpy as np

class Main(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

    def closeEvent(self, event):
        print("close")

        mytimer.stop()
        cv2.destroyAllWindows()

def getImage():
    # 将QWidget转换为图片
    width = auto_ui_window.webEngineView.size().width()
    height = auto_ui_window.webEngineView.size().height()
    pixmap = auto_ui_window.webEngineView.grab(QRect(QPoint(0, 0), QSize(width,height)))

    # 保存图片到文件
    cvimage = qtpixmap_to_cvimg(pixmap)
    mat_img = cv2.cvtColor(cvimage, cv2.COLOR_BGR2BGRA)
    cv2.circle(mat_img,  (320, 240), 20, (255, 0, 0,255) , 2)
    cv2.imshow("image", mat_img)

def on_clicked_play():
    print("on_clicked_play")
    mytimer.start(10)

def qtpixmap_to_cvimg(qtpixmap):
    qimg = qtpixmap.toImage()
    temp_shape = (qimg.height(), qimg.bytesPerLine() * 8 // qimg.depth())
    temp_shape += (4,)
    ptr = qimg.bits()
    result = np.array(ptr, dtype=np.uint8).reshape(temp_shape)
    result = result[..., :3]
    return result

if __name__ == "__main__":
    app = QApplication(sys.argv)

    mytimer = QTimer()
    mytimer.timeout.connect(getImage)

    main_window = Main()
    auto_ui_window = Ui_Dialog()
    auto_ui_window.setupUi(main_window)

    #事件处理方法1
    auto_ui_window.pushButton.clicked.connect(on_clicked_play)

    # 事件处理方法2
    #QtCore.QObject.connect(auto_ui_window.pushButton, QtCore.SIGNAL("clicked()"), main_window,QtCore.SLOT('on_clicked2()'))
    main_window.show()

    app.exec()
    sys.exit(app.exec())
相关推荐
落苜蓿蓝8 分钟前
Java 循环中对象复用导致属性覆盖?从 JVM 内存模型讲解原因
java·jvm·python
小白说大模型24 分钟前
Python 工程化设计模式:AI 项目中的异步流水线与策略模式实战
人工智能·python·设计模式
阿童木写作1 小时前
TikTok Shop视频翻译工具实战测评
人工智能·python·音视频
circuitsosk1 小时前
大模型驱动的AI产品后端架构设计与实践
人工智能·python
JackSparrow4141 小时前
前端安全之JS混淆+请求加密+请求签名以提升爬虫难度
前端·javascript·后端·爬虫·python·安全
软糖姐姐1 小时前
python eureka服务发现_python与consul 实现gRPC服务注册-发现
python·consul·grpc·服务注册·发现
听雨入夜2 小时前
zero.zhang
开发语言·python
叶 落3 小时前
Mac 通过 Miniconda 安装 Python
python·macos·conda·miniconda
就改了9 小时前
Java8 日期处理(详细版)
java·python·算法
威联通安全存储11 小时前
TS-h1887XU-RP在汽车发动机热试与NVH在线质检网中的部署
python·汽车