普通网友 2024-04-01 20:31 采纳率: 18.2%
浏览 7

yolo的一个ui界面中做一个摄像头检测的功能

在yolo的一个主界面中做一个摄像头检测的功能,該怎末做

#ui界面
from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(698, 403)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.input = QtWidgets.QLabel(self.centralwidget)
        self.input.setGeometry(QtCore.QRect(10, 20, 331, 281))
        self.input.setScaledContents(True)
        self.input.setAlignment(QtCore.Qt.AlignCenter)
        self.input.setObjectName("input")
        self.output = QtWidgets.QLabel(self.centralwidget)
        self.output.setGeometry(QtCore.QRect(360, 20, 331, 281))
        self.output.setScaledContents(True)
        self.output.setAlignment(QtCore.Qt.AlignCenter)
        self.output.setObjectName("output")
        self.line = QtWidgets.QFrame(self.centralwidget)
        self.line.setGeometry(QtCore.QRect(340, 10, 16, 301))
        self.line.setFrameShape(QtWidgets.QFrame.VLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.images = QtWidgets.QPushButton(self.centralwidget)
        self.images.setEnabled(True)
        self.images.setGeometry(QtCore.QRect(20, 340, 201, 41))
        self.images.setObjectName("images")
        self.videos = QtWidgets.QPushButton(self.centralwidget)
        self.videos.setEnabled(True)
        self.videos.setGeometry(QtCore.QRect(250, 340, 201, 41))
        self.videos.setObjectName("videos")
        self.camera = QtWidgets.QPushButton(self.centralwidget)
        self.camera.setEnabled(True)
        self.camera.setGeometry(QtCore.QRect(480, 340, 201, 41))
        self.camera.setObjectName("camera")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.input.setText(_translate("MainWindow", "显示原始图片"))
        self.output.setText(_translate("MainWindow", "检测结果"))
        self.images.setText(_translate("MainWindow", "图片检测"))
        self.videos.setText(_translate("MainWindow", "视频检测"))
        self.camera.setText(_translate("MainWindow", "摄像头检测"))
import cv2
import sys
from PyQt5 import QtCore
from PyQt5.QtWidgets import QMainWindow,QApplication,QFileDialog
from PyQt5.QtGui import QPixmap, QImage
from PyQt5.QtCore import QTimer
from 交通头盔规范检测 import Ui_MainWindow
import torch

def convert2QImage(img):
    height, width, channel = img.shape
    return QImage(img, width, height, width * channel, QImage.Format_RGB888)

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        self.model = torch.hub.load("./", "custom", path="runs/train/exp9/weights/best.pt", source="local")
        self.timer = QTimer()
        self.timer.setInterval(100)  # 设置间隔为 100 毫秒,即 0.1 秒
        self.video = None
        self.bind_slots()
    def images_pred(self, file_path):
        results = self.model(file_path)
        image = results.render()[0]
        return convert2QImage(image)

    def open_image(self):
        print("点击了检测图片!")
        file_path = QFileDialog.getOpenFileName(None, "Open Image", r"E:\yolov5-master\VOCdevkit\images\train", filter="*.jpg;*.png;*.jpeg")
        if file_path[0]:
            file_path=file_path[0]
            qimage=self.images_pred(file_path)
            self.input.setPixmap(QPixmap(file_path))
            self.output.setPixmap(QPixmap.fromImage(qimage))


    def video_pred(self):
        ret, frame = self.video.read()
        if not ret:
            self.timer.stop()
        else:
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            self.input.setPixmap(QPixmap.fromImage(convert2QImage(frame)))
            results = self.model(frame)
            image = results.render()[0]
            self.output.setPixmap(QPixmap.fromImage(convert2QImage(image)))


    def open_video(self):
        print("点击了检测视频!")
        self.timer.stop()
        file_path = QFileDialog.getOpenFileName(None, r"C:\Users\32147\Desktop\03.mp4", filter="*.mp4")
        if file_path[0]:
            file_path = file_path[0]
            self.video = cv2.VideoCapture(file_path)
            self.timer.start()



    def bind_slots(self):
        self.images.clicked.connect(self.open_image)
        self.videos.clicked.connect(self.open_video)
        self.timer.timeout.connect(self.video_pred)



if __name__=="__main__":
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
# 使用 QtCore.Qt.AA_EnableHighDpiScaling 常量设置了应用程序的属性,告诉 Qt 应用程序启用高DPI缩放。
    app= QApplication(sys.argv)
    window=MainWindow()
    window.show()
    app.exec()

  • 写回答

3条回答 默认 最新

  • 码农阿豪 Java领域优质创作者 2024-04-01 20:31
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    要实现摄像头检测功能,需要完成以下步骤:
    1. 导入相关库 需要导入cv2、sys、PyQt5等库。其中,cv2用于视频捕获和图像处理;sys用于退出程序;PyQt5用于界面显示和操作。
    2. 创建主窗口类 需要继承QMainWindow类,实现界面布局和交互功能。
    3. 实现摄像头检测功能 首先,需要定义一个名为detect()的方法,用于对视频或图像进行识别和检测。在该方法中,可以使用cv2中相关的方法对视频或图像进行处理和检测,并将检测结果以图像的形式显示到界面上。 其次,需要在界面上添加一个名为camera的按钮,用于启动或停止视频的捕获和检测。当点击该按钮时,需要根据按钮的状态来设置视频流的捕获或停止,并调用detect()方法进行检测和显示。 最后,需要在mainwindow类的初始化方法中添加camera按钮的点击事件,以实现上述功能。 下面是示例代码:
    import cv2
    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtWidgets import QMainWindow, QApplication
    from PyQt5.QtGui import QPixmap, QImage
    from PyQt5.QtCore import QTimer
    import torch
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(698, 403)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            self.input = QtWidgets.QLabel(self.centralwidget)
            self.input.setGeometry(QtCore.QRect(10, 20, 331, 281))
            self.input.setScaledContents(True)
            self.input.setAlignment(QtCore.Qt.AlignCenter)
            self.input.setObjectName("input")
            self.output = QtWidgets.QLabel(self.centralwidget)
            self.output.setGeometry(QtCore.QRect(360, 20, 331, 281))
            self.output.setScaledContents(True)
            self.output.setAlignment(QtCore.Qt.AlignCenter)
            self.output.setObjectName("output")
            self.line = QtWidgets.QFrame(self.centralwidget)
            self.line.setGeometry(QtCore.QRect(340, 10, 16, 301))
            self.line.setFrameShape(QtWidgets.QFrame.VLine)
            self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
            self.line.setObjectName("line")
            self.images = QtWidgets.QPushButton(self.centralwidget)
            self.images.setEnabled(True)
            self.images.setGeometry(QtCore.QRect(20, 340, 201, 41))
            self.images.setObjectName("images")
            self.videos = QtWidgets.QPushButton(self.centralwidget)
            self.videos.setEnabled(True)
            self.videos.setGeometry(QtCore.QRect(250, 340, 201, 41))
            self.videos.setObjectName("videos")
            self.camera = QtWidgets.QPushButton(self.centralwidget)
            self.camera.setEnabled(True)
            self.camera.setGeometry(QtCore.QRect(480, 340, 201, 41))
            self.camera.setObjectName("camera")
            MainWindow.setCentralWidget(self.centralwidget)
            self.statusbar = QtWidgets.QStatusBar(MainWindow)
            self.statusbar.setObjectName("statusbar")
            MainWindow.setStatusBar(self.statusbar)
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
            self.input.setText(_translate("MainWindow", "显示原始图片"))
            self.output.setText(_translate("MainWindow", "检测结果"))
            self.images.setText(_translate("MainWindow", "图片检测"))
            self.videos.setText(_translate("MainWindow", "视频检测"))
            self.camera.setText(_translate("MainWindow", "摄像头检测"))
    def convert2QImage(img):
        height, width, channel = img.shape
        return QImage(img, width, height, width * channel, QImage.Format_RGB888)
    class MainWindow(QMainWindow, Ui_MainWindow):
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
            self.setupUi(self)
            self.camera_state = 0
            self.camera_timer = QTimer(self)
            self.camera_timer.timeout.connect(self.detect)
            self.camera.clicked.connect(self.camera_detect)
        def detect(self):
            if self.camera_state == 1:
                ret, frame = self.cap.read()
                if not ret:
                    self.camera_timer.stop()
                    self.cap.release()
                    cv2.destroyAllWindows()
                    self.camera_state = 0
                    self.camera.setText("摄像头检测")
                    return
                # 在此处添加识别和检测的代码
                # 并将结果以图像形式显示在output中
                img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
                qimg = convert2QImage(img)
                self.input.setPixmap(QPixmap.fromImage(qimg))
            else:
                return
        def camera_detect(self):
            if self.camera_state == 1:
                self.camera_state = 0
                self.camera_timer.stop()
                self.cap.release()
                cv2.destroyAllWindows()
                self.camera.setText("摄像头检测")
            else:
                self.camera_state = 1
                self.cap = cv2.VideoCapture(0)
                self.camera_timer.start(30)
                self.camera.setText("停止检测")
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        window = MainWindow()
        window.show()
        sys.exit(app.exec_())
    

    在上述代码中,detect()方法中的检测代码还未实现,需要根据具体的识别和检测算法进行编写。此外,还可以考虑添加其他功能,如调整摄像头分辨率、画面的缩放、界面布局等。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月1日

悬赏问题

  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器