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

青岛专业制作网站安徽城乡建设厅网站焊工证查询

青岛专业制作网站,安徽城乡建设厅网站焊工证查询,网站热点关键词,山西做网站哪个好介绍 这里我们的主要目标是实现一个基于PyQt5和OpenCV的图像浏览和视频播放应用。用户可以选择本地的图像或视频文件夹#xff0c;进行图像自动播放和图像切换以及视频播放和调用摄像头等操作#xff0c;并且支持图像保存功能。项目的核心设计包括文件路径选择、图像或视频的…介绍 这里我们的主要目标是实现一个基于PyQt5和OpenCV的图像浏览和视频播放应用。用户可以选择本地的图像或视频文件夹进行图像自动播放和图像切换以及视频播放和调用摄像头等操作并且支持图像保存功能。项目的核心设计包括文件路径选择、图像或视频的显示、自动播放、图像保存等功能。 UI的初步设计 整体的设计如图所示主体的窗口名我命名为ImageLoadWindow其他控件的标记我已经写在了上方图片中大家可以和下面的代码进行对比。 视频的加载 文件路径的读取 当我们在开发视频处理或视频播放应用时经常需要让用户选择视频文件以及指定保存路径。 SetPFilePath 方法用于选择视频文件。它使用 QFileDialog.getOpenFileName 弹出一个文件选择对话框允许用户从文件系统中选择一个视频文件。如果用户选择了文件该方法将更新界面上的文本和内部变量。 def SetPFilePath(self):filename, _ QFileDialog.getOpenFileName(self, 选择视频文件, ., Video Files (*.mp4 *.avi *.mkv))if filename:self.PFilePathLiEd.setText(filename)self.PFilePath filename SetSFilePath 方法用于设置保存路径。它使用 QFileDialog.getExistingDirectory 弹出一个目录选择对话框允许用户选择一个目录作为保存路径。如果用户选择了目录该方法将更新界面上的文本和内部变量。 def SetSFilePath(self):dirname QFileDialog.getExistingDirectory(self, 选择保存目录, .)if dirname:self.SFilePathLiEd.setText(dirname)self.SFilePath dirname / 这是一个很好用的框架以后的ui设计可以直接对着我这里命名这样在创建新的时候可以实现代码的移植。 视频文件的读取和显示 这里我们想让用户选择本地的视频文件或者通过摄像头实时获取视频流并将视频帧显示在 PyQt5 的窗口中。 SetPFilePath用于选择视频文件并将文件路径显示在输入框中。此处的SetSFilePath用于选择保存目录路径但实际在下面的代码中并没有添加相关的逻辑。 当我们选择了视频文件并点击运行按钮后在左侧的OutputLabQLable控件显示了视频的播放。当不没有选择视频文件就会根据LoadWayCBoxCombo Box控件的索引去选择我们的摄像头请注意此处是下拉框选项索引是从0开始符合摄像头的读取顺序如果要用在其他项目时要注意是否正确。 from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QMessageBox from PyQt5.QtGui import QPixmap from PyQt5.QtCore import QTimer import qimage2ndarray import cv2 from load_image import Ui_ImageLoadWindowclass ImageLoadWindow(QMainWindow, Ui_ImageLoadWindow):def __init__(self):super().__init__()self.setupUi(self)self.PrepParameters()self.CallBackFunctions()self.timer QTimer(self)self.timer.timeout.connect(self.update_frame)self.capture None # 用于存储视频捕获对象self.frame None # 用于存储当前帧def PrepParameters(self):# 选择文件路径self.PFilePath # 保存文件路径self.SFilePath self.PFilePathLiEd.setText(self.PFilePath)self.SFilePathLiEd.setText(self.SFilePath)def CallBackFunctions(self):self.PFilePathBt.clicked.connect(self.SetPFilePath)self.SFilePathBt.clicked.connect(self.SetSFilePath)self.RunBt.clicked.connect(self.start_video_playback)self.ExitBt.clicked.connect(self.close_application)def SetPFilePath(self):filename, _ QFileDialog.getOpenFileName(self, 选择视频文件, ., Video Files (*.mp4 *.avi *.mkv))if filename:self.PFilePathLiEd.setText(filename)self.PFilePath filenamedef SetSFilePath(self):dirname QFileDialog.getExistingDirectory(self, 选择保存目录, .)if dirname:self.SFilePathLiEd.setText(dirname)self.SFilePath dirname /def start_video_playback(self):# 选择视频文件后启动视频播放if self.PFilePath:self.capture cv2.VideoCapture(self.PFilePath)else:load_way self.LoadWayCBox.currentIndex()self.capture cv2.VideoCapture(load_way)if self.capture.isOpened():self.timer.start(30) # 每30毫秒更新一次帧else:print(无法打开视频文件或摄像头)def update_frame(self):ret, self.frame self.capture.read()if ret:rgb_image cv2.cvtColor(self.frame, cv2.COLOR_BGR2RGB)# 使用 qimage2ndarray 将 NumPy 数组转换为 QImageqimg qimage2ndarray.array2qimage(rgb_image)pixmap QPixmap.fromImage(qimg)self.OutputLab.setPixmap(pixmap)else:self.timer.stop() # 停止定时器当视频播放完时def close_application(self):关闭应用程序reply QMessageBox.question(self, 退出, 您确定要退出程序吗?, QMessageBox.Yes | QMessageBox.No, QMessageBox.No)if reply QMessageBox.Yes:if self.capture:self.capture.release()QApplication.quit()if __name__ __main__:import sysapp QApplication(sys.argv)window ImageLoadWindow()window.show()sys.exit(app.exec_())视频文件的处理  如下所示即为选择了视频文件后运行的情况。如果不选就会调用本地的摄像头。 关于对视频处理的一块你可以在下面注释的地方完成逻辑的实现。 def update_frame(self):ret, self.frame self.capture.read()if ret:# self.frame ... 此处实现rgb_image cv2.cvtColor(self.frame, cv2.COLOR_BGR2RGB)qimg qimage2ndarray.array2qimage(rgb_image)pixmap QPixmap.fromImage(qimg)self.OutputLab.setPixmap(pixmap)else:self.timer.stop() 图像的加载 文件路径的读取 SetPFilePath方法允许用户选择一个目录目录中的所有文件都会被读取并存储在 self.pimage_list 中。为了仅获取图片文件我过滤了所有非图片文件确保 self.pimage_list 只包含有比如.jpg、.png、.jpeg、.bmp 和 .gif 等图片格式。 def SetPFilePath(self):dirname QFileDialog.getExistingDirectory(self, 浏览, .)if dirname:self.PFilePathLiEd.setText(dirname)self.PFilePathdirname/self.pimage_list [f for f in os.listdir(self.PFilePath) iff.lower().endswith((.png, .jpg, .jpeg, .bmp, .gif))] SetSFilePath方法选择一个保存目录。选择完成后保存路径会被显示在 SFilePathLiEd 文本框中并将 SFilePath 变量更新为所选目录的路径。 def SetSFilePath(self):dirname QFileDialog.getExistingDirectory(self, 浏览, .)if dirname:self.SFilePathLiEd.setText(dirname)self.SFilePathdirname/ 图像的切换 为了进一步丰富我们ui的功能这里我们提供了两个方式去显示图像第一种是通过控件显示图片另外一种可以实现自动播放的功能。 下面为更新设计后的UI: 这里我们先要理清楚我们接下来要做什么首先选择处理文件的路径以及保存的路径并点击运行按钮显示第一张图像如果没有选择保存路径则只显示图像而不进行保存。 通过Last和Next键去控制图像的显示并且第一张图像Last键被禁用最后一张图像Next键被禁用。图像的显示和保存都通过opencv实现。 from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QMessageBox from PyQt5.QtGui import QPixmap import qimage2ndarray import cv2 import os from load_image import Ui_ImageLoadWindowclass ImageLoadWindow2(QMainWindow, Ui_ImageLoadWindow):def __init__(self):super().__init__()self.setupUi(self)self.PrepParameters()self.CallBackFunctions()def PrepParameters(self):self.PFilePath r # 初始化路径为空self.SFilePath r # 初始化保存路径为空self.PFilePathLiEd.setText(self.PFilePath)self.SFilePathLiEd.setText(self.SFilePath)self.pimage_list [] # 存储图像文件列表self.current_image_idx -1 # 用于追踪当前显示的图像索引self.current_image None # 用于存储当前显示的图像数据def CallBackFunctions(self):self.PFilePathBt.clicked.connect(self.SetPFilePath)self.SFilePathBt.clicked.connect(self.SetSFilePath)self.RunBt.clicked.connect(self.start_image_show) # 运行按钮开始显示图像self.LastBt.clicked.connect(self.show_last_image) # 上一张按钮self.NextBt.clicked.connect(self.show_next_image) # 下一张按钮self.ExitBt.clicked.connect(self.close_application) # 退出按钮def SetPFilePath(self):dirname QFileDialog.getExistingDirectory(self, 浏览, .)if dirname:self.PFilePathLiEd.setText(dirname)self.PFilePath dirname /self.pimage_list [f for f in os.listdir(self.PFilePath)if f.lower().endswith((.png, .jpg, .jpeg, .bmp, .gif))]self.current_image_idx -1 # 重置图像索引def SetSFilePath(self):dirname QFileDialog.getExistingDirectory(self, 浏览, .)if dirname:self.SFilePathLiEd.setText(dirname)self.SFilePath dirname /def start_image_show(self):if not self.pimage_list:QMessageBox.warning(self, 警告, 没有找到图像文件, QMessageBox.Ok)return# 如果保存路径为空弹出警告窗口询问是否继续if not self.SFilePath:reply QMessageBox.question(self, 保存路径未选择, 保存路径未选择是否继续显示图像,QMessageBox.Yes | QMessageBox.No, QMessageBox.No)if reply QMessageBox.No:return # 如果用户选择 No返回不继续self.current_image_idx 0 # 从第一张图像开始显示self.show_image(self.current_image_idx)# 启用和禁用按钮self.update_navigation_buttons()def show_image(self, idx):if 0 idx len(self.pimage_list):# 获取图像文件路径img_path os.path.join(self.PFilePath, self.pimage_list[idx])image cv2.imread(img_path)if image is not None:# 转换为RGB模式rgb_image cv2.cvtColor(image, cv2.COLOR_BGR2RGB)self.current_image imageqimg qimage2ndarray.array2qimage(rgb_image)pixmap QPixmap.fromImage(qimg)self.OutputLab.setPixmap(pixmap)# 如果有保存路径才进行自动保存if self.SFilePath:self.auto_save_image(self.pimage_list[idx])else:print(f无法读取图像: {img_path})def auto_save_image(self, image_filename):if self.current_image is None:returnsave_path os.path.join(self.SFilePath, image_filename)os.makedirs(self.SFilePath, exist_okTrue)cv2.imwrite(save_path, self.current_image)print(f图像已自动保存到: {save_path})def show_last_image(self):if self.current_image_idx 0:self.current_image_idx - 1self.show_image(self.current_image_idx)self.update_navigation_buttons()def show_next_image(self):if self.current_image_idx len(self.pimage_list) - 1:self.current_image_idx 1self.show_image(self.current_image_idx)self.update_navigation_buttons()def update_navigation_buttons(self):if self.current_image_idx 0:self.LastBt.setEnabled(False) # 禁用上一张按钮else:self.LastBt.setEnabled(True) # 启用上一张按钮if self.current_image_idx len(self.pimage_list) - 1:self.NextBt.setEnabled(False) # 禁用下一张按钮else:self.NextBt.setEnabled(True) # 启用下一张按钮def close_application(self):关闭应用程序reply QMessageBox.question(self, 退出, 您确定要退出程序吗?, QMessageBox.Yes | QMessageBox.No, QMessageBox.No)if reply QMessageBox.Yes:QApplication.quit()if __name__ __main__:import sysapp QApplication(sys.argv)window ImageLoadWindow2()window.show()sys.exit(app.exec_())逻辑流程概述 用户选择图像文件夹和保存路径可选。点击运行按钮开始显示第一张图像。如果保存路径未选择程序会弹出提示询问用户是否继续显示图像。用户可以通过上一张LastBt和下一张NextBt按钮切换图像。当图像显示时若保存路径已选择程序会自动保存当前显示的图像。如果用户关闭程序会弹出确认退出的对话框。 实现自动播放功能 下面就是完整的设计了由于考虑到自动播放所以我在这里添加了暂停恢复键用于播放过程中的暂停。 好的这里我们还是需要理清楚我们需要做什么。首先在选择好图像文件夹路径和保存路径后如果勾选了自动播放就会禁用掉Last和Next键点击运行会弹出窗口是否进行循环播放如果选择进行循环播放则图像会显示在OutputLab上如果选择了否也会进行自动播放只是在播放完成之后可以切换到Last和Next键进行图片的切换。 在自动播放过程中如果点击了暂停键文字变为恢复再点击文字变为暂停在点击了暂停后再点击运行可以重新进行选择。 from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QMessageBox from PyQt5.QtGui import QPixmap from PyQt5.QtCore import QTimer import qimage2ndarray import cv2 import os from load_image import Ui_ImageLoadWindowclass ImageLoadWindow2(QMainWindow, Ui_ImageLoadWindow):def __init__(self):super().__init__()self.setupUi(self)self.PrepParameters()self.CallBackFunctions()def PrepParameters(self):self.PFilePath r # 初始化路径为空self.SFilePath r # 初始化保存路径为空self.PFilePathLiEd.setText(self.PFilePath)self.SFilePathLiEd.setText(self.SFilePath)self.pimage_list [] # 存储图像文件列表self.current_image_idx -1 # 用于追踪当前显示的图像索引self.current_image None # 用于存储当前显示的图像数据self.is_autoplay False # 是否启用自动播放标志self.is_loop False # 是否循环播放标志self.is_paused False # 是否暂停自动播放标志def CallBackFunctions(self):self.PFilePathBt.clicked.connect(self.SetPFilePath)self.SFilePathBt.clicked.connect(self.SetSFilePath)self.RunBt.clicked.connect(self.start_image_show) # 运行按钮开始显示图像self.LastBt.clicked.connect(self.show_last_image) # 上一张按钮self.NextBt.clicked.connect(self.show_next_image) # 下一张按钮self.ExitBt.clicked.connect(self.close_application) # 退出按钮self.AutoplaycheckBox.stateChanged.connect(self.toggle_autoplay) # 连接自动播放勾选框self.StopRecoverBt.clicked.connect(self.pause_or_resume_autoplay) # 连接暂停/恢复按钮def SetPFilePath(self):dirname QFileDialog.getExistingDirectory(self, 浏览, .)if dirname:self.PFilePathLiEd.setText(dirname)self.PFilePath dirname /self.pimage_list [f for f in os.listdir(self.PFilePath)if f.lower().endswith((.png, .jpg, .jpeg, .bmp, .gif))]self.current_image_idx -1 # 重置图像索引def SetSFilePath(self):dirname QFileDialog.getExistingDirectory(self, 浏览, .)if dirname:self.SFilePathLiEd.setText(dirname)self.SFilePath dirname /def toggle_autoplay(self, state):根据勾选状态设置是否启用自动播放self.is_autoplay state 2 # 2表示勾选状态self.StopRecoverBt.setEnabled(self.is_autoplay) # 只有启用自动播放时才启用暂停/恢复按钮def start_image_show(self):if not self.pimage_list:QMessageBox.warning(self, 警告, 没有找到图像文件, QMessageBox.Ok)return# 如果保存路径为空弹出警告窗口询问是否继续if not self.SFilePath:reply QMessageBox.question(self, 保存路径未选择, 保存路径未选择是否继续显示图像,QMessageBox.Yes | QMessageBox.No, QMessageBox.No)if reply QMessageBox.No:return # 如果用户选择 No返回不继续self.current_image_idx 0 # 从第一张图像开始显示self.show_image(self.current_image_idx)if self.is_autoplay:# 如果是自动播放模式弹出对话框确认是否循环播放reply QMessageBox.question(self, 循环播放, 是否循环播放图像,QMessageBox.Yes | QMessageBox.No, QMessageBox.No)if reply QMessageBox.Yes:self.is_loop True # 启用循环播放else:self.is_loop False # 不循环播放# 启动自动播放self.start_autoplay()else:# 启用和禁用按钮self.update_navigation_buttons()# 如果是自动播放并且已经暂停了点击运行时确保按钮文本恢复为暂停if self.is_paused:self.StopRecoverBt.setText(暂停) # 恢复为暂停按钮文本def start_autoplay(self):启动自动播放模式if self.is_paused:# 如果当前是暂停状态直接恢复定时器self.is_paused Falseself.StopRecoverBt.setText(暂停) # 修改按钮文本为 暂停self.LastBt.setEnabled(False) # 禁用上一张按钮self.NextBt.setEnabled(False) # 禁用下一张按钮# 使用QTimer定时器进行自动播放if not hasattr(self, autoplay_timer): # 如果定时器不存在则创建self.autoplay_timer QTimer(self)self.autoplay_timer.timeout.connect(self.next_image_in_autoplay)self.autoplay_timer.start(1000) # 每1秒切换一张图像def next_image_in_autoplay(self):自动播放下一张图像if self.is_paused:return # 如果已暂停不进行任何操作if self.current_image_idx len(self.pimage_list) - 1:self.current_image_idx 1self.show_image(self.current_image_idx)else:if self.is_loop:self.current_image_idx 0 # 如果是循环播放回到第一张self.show_image(self.current_image_idx)else:self.stop_autoplay() # 自动播放完成后停止并恢复按钮def stop_autoplay(self):停止自动播放if hasattr(self, autoplay_timer):self.autoplay_timer.stop()self.update_navigation_buttons() # 恢复按钮状态def pause_or_resume_autoplay(self):暂停或恢复自动播放if self.is_paused:self.is_paused Falseself.StopRecoverBt.setText(暂停) # 修改按钮文本为 暂停self.start_autoplay() # 恢复播放else:self.is_paused Trueself.StopRecoverBt.setText(恢复) # 修改按钮文本为 恢复self.autoplay_timer.stop() # 暂停定时器def show_image(self, idx):if 0 idx len(self.pimage_list):# 获取图像文件路径img_path os.path.join(self.PFilePath, self.pimage_list[idx])image cv2.imread(img_path)if image is not None:# 转换为RGB模式rgb_image cv2.cvtColor(image, cv2.COLOR_BGR2RGB)self.current_image imageqimg qimage2ndarray.array2qimage(rgb_image)pixmap QPixmap.fromImage(qimg)self.OutputLab.setPixmap(pixmap)# 如果有保存路径才进行自动保存if self.SFilePath:self.auto_save_image(self.pimage_list[idx])else:print(f无法读取图像: {img_path})def auto_save_image(self, image_filename):if self.current_image is None:returnsave_path os.path.join(self.SFilePath, image_filename)os.makedirs(self.SFilePath, exist_okTrue)cv2.imwrite(save_path, self.current_image)print(f图像已自动保存到: {save_path})def show_last_image(self):if self.current_image_idx 0:self.current_image_idx - 1self.show_image(self.current_image_idx)self.update_navigation_buttons()def show_next_image(self):if self.current_image_idx len(self.pimage_list) - 1:self.current_image_idx 1self.show_image(self.current_image_idx)self.update_navigation_buttons()def update_navigation_buttons(self):更新上一张和下一张按钮的状态if self.current_image_idx 0:self.LastBt.setEnabled(False) # 禁用上一张按钮else:self.LastBt.setEnabled(True) # 启用上一张按钮if self.current_image_idx len(self.pimage_list) - 1:self.NextBt.setEnabled(False) # 禁用下一张按钮else:self.NextBt.setEnabled(True) # 启用下一张按钮def close_application(self):关闭应用程序reply QMessageBox.question(self, 退出, 您确定要退出程序吗?, QMessageBox.Yes | QMessageBox.No, QMessageBox.No)if reply QMessageBox.Yes:QApplication.quit()if __name__ __main__:import sysapp QApplication(sys.argv)window ImageLoadWindow2()window.show()sys.exit(app.exec_())图像文件的处理 可以在注释处进行图像处理。 def show_image(self, idx):if 0 idx len(self.pimage_list):# 获取图像文件路径img_path os.path.join(self.PFilePath, self.pimage_list[idx])image cv2.imread(img_path)# image ... 图像处理if image is not None:# 转换为RGB模式rgb_image cv2.cvtColor(image, cv2.COLOR_BGR2RGB)self.current_image imageqimg qimage2ndarray.array2qimage(rgb_image)pixmap QPixmap.fromImage(qimg)self.OutputLab.setPixmap(pixmap)# 如果有保存路径才进行自动保存if self.SFilePath:self.auto_save_image(self.pimage_list[idx])else:print(f无法读取图像: {img_path}) 其他 这里记录一下使用plainTextEdit显示信息。由于内容有限所以不另外再写一篇博客了。 名字就叫plainTextEdit这里我就不修改了。 这里只需要做两个修改就好了。 在初始化的时候PrepParameters添加一个 self.plainTextEdit.clear() # 清除文本框内容 你也可以和按钮结合在一起。 还有一个是将内容显示在plainTextEdit上面 运行效果如下所示 总结 本篇展示了如何使用PyQt5和OpenCV实现一个图像浏览与视频播放应用涵盖了文件路径选择、图像/视频显示、自动播放或切换、暂停与恢复、图像保存等多种功能。本篇的代码具有较高的灵活性你只需要按照相同的命名方式就能够实现代码的移植。希望通过本篇为其他大家提供有用的参考和实现思路。 另外需要注意的一点是在循环播放的时候图像会重复的保存关于这一部分的相关逻辑我不想再修改也不怎么碍事。最后我这里不提供原来设计ui文件因为我写的已经很清楚了大家能够自己简单的设计没必要再找我要。
http://www.pierceye.com/news/677388/

相关文章:

  • 网站上传工具有什么甘南北京网站建设
  • 株洲做网站那家好wordpress调用当前页文章
  • 想学做网站报班免费做一个自己app
  • 网站链接查询经典的公司简介范文
  • 网站猜你喜欢代码专门做房产的网站
  • 网页设计与网站建设题库企业logo设计免费
  • 深圳比较有名的设计公司大连seo推广优化
  • 宁波住房和城乡建设局网站最新上市新手机
  • 重庆做网站公司学校做网站方案
  • 网站建站建设价格酷家乐软件下载电脑版
  • 关于做网站的搞笑段子仿淘宝网站
  • 免费建网站的网站搭建价格表
  • 茶山网站仿做河池公司网站开发价格
  • 珠海网站制作推广公司哪家好做网站页面怎么做
  • 丰润网站建设怎么开网店流程
  • 电子商务网站建设的参考文献硬件开发平台是什么意思
  • 杭州做网站 做小程序自助建站免费永久
  • 软件培训网站建设鹤山市网站建设公司
  • 网站的验证码是怎么做的wordpress团购插件
  • 邯郸网站设计注册贵阳网站建设天锐科技
  • 网站建设服务费税率多少WordPress文档批量发布接口
  • 云服务器网站配置网页界面设计中一般使用的分辨率是多少
  • 网站域名销售wordpress文章入口设置
  • 上海做网站较好的公司c 做网站
  • 代发货网站系统建设螺栓球网架
  • 做书的网站有哪些内容吗电商平台定制
  • 网站建设与推广长春云电脑永久免费版手机版
  • 营销型网站建设优化建站坂田建设网站
  • 大型网站方案自己做网站详细流程
  • 网站开发中为什么有两个控制层南昌网站建设技术托管