当前位置:   article > 正文

PYQT6做UI,用YOLOV8检测RTSP视频流——增加combox实现RTSP视频流的选择以及自动打开_yolov8 rtsp

yolov8 rtsp

增加combox实现RTSP视频流的选择以及自动打开

  1. import sys
  2. import cv2
  3. import imutils
  4. from PyQt6.QtCore import QThread, pyqtSignal, Qt
  5. from PyQt6.QtGui import QImage, QPixmap
  6. from PyQt6.QtWidgets import QApplication, QLabel, QMainWindow, QPushButton, QVBoxLayout, QWidget, QComboBox
  7. from ultralytics import YOLO
  8. model = YOLO("")# 你的模型地址
  9. class VideoThread(QThread):
  10. model_detection_signal = pyqtSignal(QImage)
  11. def __init__(self, rtsp_url):
  12. super().__init__()
  13. self.rtsp_url = rtsp_url
  14. self.running = False
  15. def run(self):
  16. self.running = True
  17. cap = cv2.VideoCapture(self.rtsp_url)
  18. while self.running:
  19. # 从视频流中读取一帧
  20. ret, frame = cap.read()
  21. # 如果读取失败(例如,视频结束或连接断开),则跳出循环
  22. if not ret:
  23. break
  24. # 使用imutils的resize函数调整帧的大小到640像素宽
  25. frame = imutils.resize(frame, width=640)
  26. # 使用模型预测处理帧,并将结果存储在results中
  27. results = model.predict(source=frame)
  28. # 从results中获取第一个元素并绘制它
  29. annotated_frame = results[0].plot()
  30. # 获取帧的高度、宽度和通道数
  31. height, width, channel = annotated_frame.shape
  32. # 计算每行字节数,因为QImage使用每行像素数*每像素字节数的方式来表示图像数据
  33. bytes_per_line = 3 * width
  34. # 创建QImage对象,从annotated_frame中获取数据,并设置宽度、高度、每行字节数和图像格式
  35. # rgbSwapped()方法是因为OpenCV默认使用BGR格式,而QImage使用RGB格式
  36. qimage = QImage(annotated_frame.data, width, height, bytes_per_line,
  37. QImage.Format.Format_RGB888).rgbSwapped()
  38. # 发出信号,将处理后的QImage对象发送出去,用于在GUI中显示
  39. self.model_detection_signal.emit(qimage)
  40. cap.release()
  41. def stop(self):
  42. self.running = False
  43. self.wait()
  44. class MainWindow(QMainWindow):
  45. def __init__(self):
  46. super().__init__()
  47. self.setWindowTitle("RTSP Streams with YOLOv8")
  48. self.setGeometry(100, 100, 800, 600)
  49. layout = QVBoxLayout()
  50. self.label = QLabel("Stream")
  51. self.button = QPushButton("打开")
  52. self.combobox = QComboBox()
  53. self.combobox.addItem("")#添加你的RTSP
  54. self.combobox.addItem("")#添加你的RTSP
  55. layout.addWidget(self.label)
  56. layout.addWidget(self.combobox)
  57. layout.addWidget(self.button)
  58. container = QWidget()
  59. container.setLayout(layout)
  60. self.setCentralWidget(container)
  61. self.thread = VideoThread(self.combobox.currentText())
  62. self.thread.model_detection_signal.connect(self.update_image)
  63. self.combobox.currentTextChanged.connect(self.on_combobox_changed)
  64. self.button.clicked.connect(self.start_streams)
  65. def on_combobox_changed(self, text):
  66. """
  67. # 通过改变combobox的内容从而管理线程
  68. @param text:
  69. @return:
  70. """
  71. self.thread.stop()
  72. self.thread = VideoThread(text)
  73. # 连接信号
  74. self.thread.model_detection_signal.connect(self.update_image)
  75. self.thread.start()
  76. def start_streams(self):
  77. """
  78. # 定义方法改变按钮的字样,同时打开/关闭线程
  79. @return:
  80. """
  81. if self.button.text() == "打开":
  82. self.button.setText("关闭")
  83. # 开启线程
  84. self.thread.start()
  85. else:
  86. self.button.setText("打开")
  87. # 关闭线程
  88. self.thread.stop()
  89. def update_image(self, qimage):
  90. """
  91. # 用来更新图片
  92. @param qimage: 获取信号的图片帧
  93. @return: None
  94. """
  95. # 获取标签label的尺寸
  96. size = self.label.size()
  97. # 按照标签的尺寸调整图像大小,并保持图像的宽高比
  98. scaled_image = qimage.scaled(size.width(), size.height(), Qt.AspectRatioMode.KeepAspectRatio)
  99. # 将调整大小后的QImage转换为QPixmap
  100. pixmap = QPixmap.fromImage(scaled_image)
  101. # 使用QPixmap对象设置标签label的显示内容
  102. self.label.setPixmap(pixmap)
  103. if __name__ == "__main__":
  104. app = QApplication(sys.argv)
  105. window = MainWindow()
  106. window.show()
  107. sys.exit(app.exec())

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/1015222
推荐阅读
相关标签
  

闽ICP备14008679号