• pyqt5将yolo识别视频保存


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 StargazerJR 2024-04-17 16:59 采纳率: 0% 浏览 1 首页/ 编程语言 / pyqt5将yolo识别视频保存 qt pyqt如何在label的界面中添加yolo的显示线程进度,同时完成显示视频保存功能 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    3条回答 默认 最新

    • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-17 16:59
      关注

      引自免费微信小程序:皆我百晓生

      要在PyQt5应用中实现YOLO对象检测并在Label上实时显示,以及保存视频的功能,你需要遵循以下几个步骤:

      1. 安装必要的库:首先确保已经安装了opencv-python, pyqt5, 和 torch
      2. 导入所需的模块:
      3. 实现YOLO模型加载和推理函数。
      4. 创建PyQt5应用程序并设置UI布局。
      5. 在主窗口中添加一个QVideoWidget用于播放视频,并在Label上显示检测结果。
      6. 为YOLO推理创建一个单独的线程。
      7. 添加保存视频的逻辑。

      以下是详细的代码示例:

      # Step 1: Install necessary libraries
      !pip install opencv-python pyqt5 torchvision torch
      
      # Step 2: Import required modules
      import cv2
      from PyQt5.QtCore import QTimer, QThread, Qt, pyqtSignal
      from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QPushButton
      import numpy as np
      import torch
      from PIL import Image
      from models.yolov3 import YOLOv3
      
      # Step 3: Load and preprocess YOLO model
      class YOLOInference:
          def __init__(self):
              self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
              self.model = YOLOv3()
              self.model.load_darknet_weights('path/to/yolov3.weights')
              self.model.eval()
      
          def predict(self, frame):
              # Perform inference on the frame
              ...
      
      # Step 4: Create PyQt5 application and UI layout
      class MainWindow(QMainWindow):
          def __init__(self):
              super(MainWindow, self).__init__()
              self.setWindowTitle("YOLO Video Detection & Save")
      
              self.video_widget = QVideoWidget()
              self.label = QLabel()
              self.save_button = QPushButton("Save Video")
      
              layout = QVBoxLayout()
              layout.addWidget(self.video_widget)
              layout.addWidget(self.label)
              layout.addWidget(self.save_button)
      
              central_widget = QWidget()
              central_widget.setLayout(layout)
              self.setCentralWidget(central_widget)
      
              self.save_button.clicked.connect(self.save_video)
      
              # Initialize YOLO inference thread
              self.inference_thread = InferenceThread(YOLOInference())
              self.inference_thread.result_signal.connect(self.update_label)
      
          def update_label(self, image_with_boxes):
              qimage = self.convert_to_qimage(image_with_boxes)
              pixmap = QPixmap.fromImage(qimage)
              self.label.setPixmap(pixmap)
      
          def convert_to_qimage(self, image):
              return QImage(image.data, image.shape[1], image.shape[0], QImage.Format_RGB888).rgbSwapped()
      
          def save_video(self):
              # Add your video saving logic here
              ...
      
      # Step 5: Inference Thread
      class InferenceThread(QThread):
          result_signal = pyqtSignal(np.ndarray)
      
          def __init__(self, yolo_inference):
              super(InferenceThread, self).__init__()
              self.yolo_inference = yolo_inference
              self.running = True
      
          def run(self):
              while self.running:
                  # Get a new frame from the video source
                  ...
                  # Perform inference
                  frame_with_boxes = self.yolo_inference.predict(frame)
                  # Emit the signal with the result
                  self.result_signal.emit(frame_with_boxes)
      
          def stop(self):
              self.running = False
      
      if __name__ == "__main__":
          app = QApplication([])
          window = MainWindow()
          window.show()
          sys.exit(app.exec_())
      

      在这个示例中,我给出了一个基本的框架,你需要根据实际的YOLOv3模型结构和数据预处理方式来完善predict方法。此外,你需要从视频源获取帧(可以是文件、摄像头等),并将这些帧传递给YOLO推理线程。在save_video函数中,你需要实现视频的保存逻辑,可以使用OpenCV的VideoWriter类来实现。

      注意,这个例子没有包含完整的代码,因为YOLOv3的具体实现、视频源的读取和视频的保存都需要额外的代码。你需要自行补充这些部分,或者参考相关的教程来完成整个项目。如果你有具体的问题,例如如何加载YOLOv3模型、如何从视频中读取帧或者如何使用VideoWriter,可以在提问时提供更详细的需求,我会尽力提供相应的代码片段。

      展开全部

      评论 编辑记录
    • Kwan的解忧杂货铺 Java领域优质创作者 2024-04-17 16:59
      关注

      下午好🌅🌅🌅
      本答案参考ChatGPT-3.5

      要在PyQt5的label界面中显示yolo的线程进度,并完成视频保存功能,你可以按照以下步骤进行操作:

      1. 创建一个PyQt5窗口应用程序,并设置主窗口。
      2. 在主窗口中创建一个label控件,用于显示yolo检测的视频。
      3. 在主窗口中创建一个进度条(QProgressBar)控件,用于显示yolo线程的进度。
      4. 在主窗口中创建一个按钮(Button)控件,并绑定一个槽函数。
      5. 槽函数中启动一个线程(可以使用QThread),用于运行yolo的视频检测操作。在线程中,使用OpenCV来读取视频帧,并调用yolo进行识别。
      6. 在检测线程中,可以通过信号(Signal)来发送当前检测进度的百分比,并在主窗口中更新进度条的值。
      7. 在检测线程中,如果检测到目标,则可以在视频帧上标注出目标位置,并在label控件中显示标注后的视频帧。
      8. 在槽函数中,启动线程后,禁用按钮,直到线程完成检测。当线程完成检测后,启用按钮,并保存识别后的视频。

      下面是一个示例代码,用于演示如何实现以上步骤。

      import sys
      from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QProgressBar, QPushButton
      from PyQt5.QtCore import Qt, QThread, pyqtSignal
      import cv2
      import numpy as np
      
      # YOLO识别线程
      class YOLOThread(QThread):
          progress_updated = pyqtSignal(int)
      
          def __init__(self, video_path):
              super().__init__()
              self.video_path = video_path
      
          def run(self):
              cap = cv2.VideoCapture(self.video_path)
              total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
      
              for frame_idx in range(total_frames):
                  ret, frame = cap.read()
      
                  # 进行yolo目标检测
                  # ...
      
                  # 更新进度条,发送信号
                  progress = int((frame_idx + 1) * 100 / total_frames)
                  self.progress_updated.emit(progress)
      
                  # 在视频帧上标注目标位置
                  # ...
      
                  # 在label控件中显示标注后的视频帧
                  # ...
      
                  # 显示视频帧
                  cv2.imshow("YOLO Video", frame)
                  cv2.waitKey(1)
      
              # 检测完成后,保存视频
              # ...
      
              cv2.destroyAllWindows()
      
      # 主窗口
      class MainWindow(QMainWindow):
          def __init__(self):
              super().__init__()
      
              # 设置窗口标题和尺寸
              self.setWindowTitle("YOLO Video Detection")
              self.setGeometry(100, 100, 800, 600)
      
              # 创建label控件
              self.label = QLabel(self)
              self.label.setAlignment(Qt.AlignCenter)
              self.label.setGeometry(50, 50, 700, 400)
      
              # 创建进度条控件
              self.progress_bar = QProgressBar(self)
              self.progress_bar.setGeometry(50, 500, 700, 30)
      
              # 创建按钮
              self.button = QPushButton("Start", self)
              self.button.setGeometry(350, 550, 100, 30)
              self.button.clicked.connect(self.start_yolo_thread)
      
          def start_yolo_thread(self):
              video_path = "your_video_path.mp4"
      
              # 禁用按钮
              self.button.setEnabled(False)
      
              # 创建并启动yolo线程
              self.yolo_thread = YOLOThread(video_path)
              self.yolo_thread.progress_updated.connect(self.update_progress)
              self.yolo_thread.finished.connect(self.yolo_thread_finished)
              self.yolo_thread.start()
      
          def update_progress(self, progress):
              # 更新进度条
              self.progress_bar.setValue(progress)
      
          def yolo_thread_finished(self):
              # 启用按钮
              self.button.setEnabled(True)
      
              # 保存识别后的视频
              # ...
      
      if __name__ == "__main__":
          app = QApplication(sys.argv)
          main_window = MainWindow()
          main_window.show()
          sys.exit(app.exec_())
      

      以上代码中,你需要根据实际情况完善YOLO的视频检测和结果保存部分的代码。在YOLOThread类的run方法中,你可以使用YOLO库来进行目标检测,可以根据需要对检测到的目标进行标注和绘制。然后在MainWindow类中的yolo_thread_finished方法中,你可以添加保存视频的相关代码。

      展开全部

      评论
    • CSDN-Ada助手 CSDN-AI 官方账号 2024-04-17 18:02
      关注

      【相关推荐】



      • 给你找了一篇非常好的博客,你可以看看是否有帮助,链接:pyqt5 利用label实时显示时间
      • 除此之外, 这篇博客: PyQt界面设计心得总结2021.12.1中的 (7)label控件加载图片 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
                self.label.setPixmap(QPixmap(str(self.img))) 
        

      如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    Vue封装组件并发布到npm仓库
    DiffuSEEG:一种基于stable diffusion 的SEEG数据补全方法
    Linux 将 /home 目录与 / 根目录磁盘合并
    python脚本分享:xml文件批量修改
    Hadoop伪分布式搭建步骤
    Linux内存管理(二十三):slub 分配器之kmem_cache_create
    QT DAY4
    C Primer Plus(6) 中文版 第6章 C控制语句:循环 6.13 关键概念 6.14 本章小结
    嵌入式Linux驱动开发5---volatile变量
    这个学习Python的神仙网站,后悔没早点发现
  • 原文地址:https://ask.csdn.net/questions/8090105