从列表中获取值,该列表从pyqt5中的combobox给出索引

时间:2020-07-09 13:44:30

标签: python python-3.x pyqt pyqt5

我在pyqt5中创建了一个应用,该应用从combobox接收输入。我可以在组合框中获取所选文本的索引。我想使用该索引从另一个列表中获取值,并在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 个答案:

答案 0 :(得分:2)

您可以将url信息添加为userData,而不是创建2个列表:

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")
        for name, url in zip(df1.names, df1.urls):
            self.comboBox.addItem(name, url)

    def start_webcam(self):
        try:
            url = self.comboBox.currentData()
            self.capture=cv2.VideoCapture(url)
            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)