当前位置: 首页 > news >正文

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

基本思路:

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

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

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

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

ui.py代码 

# -*- 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)# setupUidef retranslateUi(self, Dialog):Dialog.setWindowTitle(QCoreApplication.translate("Dialog", u"Dialog", None))self.pushButton.setText(QCoreApplication.translate("Dialog", u"play", None))# retranslateUi

main.py代码

from symtable import Classfrom 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 npclass 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 resultif __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)#事件处理方法1auto_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())

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PyQtGraph库的基本使用
  • 集合及数据结构第九节————树和二叉树
  • SSL/TLS协议信息泄露漏洞修复
  • C++初学(14)
  • 回顾前面刷过的算法(8)
  • Java-希尔排序算法介绍、应用场景和示例代码
  • spingboot实现常规增删改查
  • erlang学习:gen_server书上案例22.6练习题4
  • jmeter通过参数文件、循环组件实现多账号登陆
  • npm install 报错解决记录
  • Golang 使用redis stream实现一个实时推送功能
  • Groupings sets详解
  • 东方银行--用 MinIO 和 Dremio 替代 Hadoop
  • React18快速入门教程
  • C HTML格式解析与生成
  • CSS 三角实现
  • django开发-定时任务的使用
  • download使用浅析
  • iOS小技巧之UIImagePickerController实现头像选择
  • nodejs调试方法
  • php中curl和soap方式请求服务超时问题
  • React Transition Group -- Transition 组件
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • vue学习系列(二)vue-cli
  • Vue组件定义
  • 包装类对象
  • 将 Measurements 和 Units 应用到物理学
  • 爬虫模拟登陆 SegmentFault
  • 正则表达式
  • 自定义函数
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #Spring-boot高级
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)ssm高校实验室 毕业设计 800008
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (篇九)MySQL常用内置函数
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .net 提取注释生成API文档 帮助文档
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET中winform传递参数至Url并获得返回值或文件
  • .ui文件相关
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [ IO.File ] FileSystemWatcher
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [2019/05/17]解决springboot测试List接口时JSON传参异常
  • [AHK V2]鼠标悬停展开窗口,鼠标离开折叠窗口
  • [AIGC] Java List接口详解
  • [Angular] 笔记 20:NgContent