получение значения из списка с учетом индекса из поля со списком в pyqt5 - PullRequest
1 голос
/ 09 июля 2020

Я создал приложение на pyqt5, которое принимает ввод из поля со списком. я могу получить индекс выделенного текста в поле со списком. Я хочу использовать этот индекс, чтобы получить значение из другого списка и использовать это значение в opencv VideoCapture. Я пробовал это:

        self.pushButton.clicked.connect(self.start_webcam)
        self.pushButton_2.clicked.connect(self.stop_webcam)
        self.face_Enabled=False
        try:
            df1 = pd.read_csv("names.csv")
            area = df1["names"].to_list()
            urls = df1["urls"].to_list()
            self.comboBox.addItems(area)
        except:
            pass

        
    def start_webcam(self):
        try:
            i = self.comboBox.currentIndex()
            a = '"{}"'.format(urls[i-1])
            self.capture=cv2.VideoCapture(a)
            self.capture.set(cv2.CAP_PROP_FRAME_HEIGHT,480)
            self.capture.set(cv2.CAP_PROP_FRAME_WIDTH, 640)

когда я печатаю i, я получаю индекс. но opencv, похоже, не получает ссылку. Как я могу это сделать?

Вот мой полный код:

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(1500, 617)
        self.processedImgLabel = QtWidgets.QLabel(Dialog)
        self.processedImgLabel.setGeometry(QtCore.QRect(50, 70, 1420, 520))
        self.processedImgLabel.setFrameShape(QtWidgets.QFrame.Box)
        self.processedImgLabel.setText("")
        self.processedImgLabel.setObjectName("processedImgLabel")
        self.widget = QtWidgets.QWidget(Dialog)
        self.widget.setGeometry(QtCore.QRect(50, 10, 1291, 25))
        self.widget.setObjectName("widget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.startButton = QtWidgets.QPushButton(self.widget)
        self.startButton.setObjectName("startButton")
        self.horizontalLayout.addWidget(self.startButton)
        self.stopButton = QtWidgets.QPushButton(self.widget)
        self.stopButton.setObjectName("stopButton")
        self.comboBox = QtWidgets.QComboBox(Dialog)
        self.comboBox.setObjectName("comboBox")
        self.comboBox.addItem("")
        self.horizontalLayout.addWidget(self.stopButton)
        self.horizontalLayout.addWidget(self.comboBox)

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

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "App"))
        self.startButton.setText(_translate("Dialog", "Start"))
        self.stopButton.setText(_translate("Dialog", "Stop"))
        self.comboBox.setItemText(0, _translate("Dialog", "Camera Name"))


class FaceDetection(QDialog, Ui_Dialog):
    def __init__(self):
        super(FaceDetection,self).__init__()
        self.setupUi(self)
        self.processedImage=None
        self.startButton.clicked.connect(self.start_webcam)
        self.stopButton.clicked.connect(self.stop_webcam)
        self.face_Enabled=False
        df1 = pd.read_csv("names.csv")
        area = df1["names"].to_list()
        urls = df1["urls"].to_list()
        self.comboBox.addItems(area)

    def start_webcam(self):
        try:
            i = self.comboBox.currentIndex()
            a = '"{}"'.format(urls[i-1])
            self.capture=cv2.VideoCapture(a)
            self.capture.set(cv2.CAP_PROP_FRAME_HEIGHT,480)
            self.capture.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
        except:
            self.capture=cv2.VideoCapture(0)

        self.timer=QTimer(self)
        self.timer.timeout.connect(self.update_frame)
        self.timer.start(5)

    def update_frame(self):
        ret,self.image=self.capture.read()
        if not ret:
            print("Nope")
        self.image=cv2.flip(self.image,1)
        detected_image=self.detect_face(self.image)
        self.displayImage(detected_image,1)

    def stop_webcam(self):
        self.timer.stop()

    def displayImage(self,img,window=1):
        qformat=QImage.Format_Indexed8
        if len(img.shape)==3:
            if img.shape[2]==4:
                qformat=QImage.Format_RGBA8888
            else:
                qformat=QImage.Format_RGB888

        outImage=QImage(img,img.shape[1],img.shape[0],img.strides[0],qformat)
        #BGR>>RGB
        outImage=outImage.rgbSwapped()

        if window==1:
            self.processedImgLabel.setPixmap(QPixmap.fromImage(outImage))
            self.processedImgLabel.setScaledContents(True)

if __name__=='__main__':
    app=QApplication(sys.argv)
    window=FaceDetection()
    window.setWindowTitle('Title')
    window.show()
    sys.exit(app.exec_())

а вот имена.csv

names   urls
garadge  rtsp://username:password@IP:port/1

1 Ответ

2 голосов
/ 09 июля 2020

Вместо создания двух списков вы можете добавить информацию об URL-адресах как userData:

class FaceDetection(QDialog, Ui_Dialog):
    def __init__(self):
        super(FaceDetection,self).__init__()
        self.setupUi(self)
        self.processedImage=None
        self.startButton.clicked.connect(self.start_webcam)
        self.stopButton.clicked.connect(self.stop_webcam)
        self.face_Enabled=False
        df1 = pd.read_csv("names.csv")
        <b>for name, url in zip(df1.names, df1.urls):
            self.comboBox.addItem(name, url)</b>

    def start_webcam(self):
        try:
            <b>url = self.comboBox.currentData()
            self.capture=cv2.VideoCapture(url)</b>
            self.capture.set(cv2.CAP_PROP_FRAME_HEIGHT,480)
            self.capture.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
        except:
            self.capture=cv2.VideoCapture(0)

        self.timer=QTimer(self)
        self.timer.timeout.connect(self.update_frame)
        self.timer.start(5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...