首页 > 解决方案 > 在pyqt上流式传输opencv视频时它可以工作,但是为什么在使用dlib编写代码时它不起作用?

问题描述

class Thread(QThread):
    imageUpdate = pyqtSignal(QImage)
    def run(self):
        #self.ThreadActive = True
        self.cap = cv2.VideoCapture('D:/Human_Pose_Estimation/test.mp4')
        self.detector = dlib.get_frontal_face_detector()
        self.sp = dlib.shape_predictor('models/shape_predictor_68_face_landmarks.dat')
        self.facerec = dlib.face_recognition_model_v1('models/dlib_face_recognition_resnet_model_v1.dat')
        self.descs = np.load('img/descs.npy',allow_pickle=True)[()] # ,allow_pickle=True
        while self.cap.isOpened():
            ret, img = self.cap.read()
            img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
            img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
            dets = self.detector(img, 1)
            for k, d in enumerate(dets):
                shape = self.sp(img, d)
                face_descriptor = self.facerec.compute_face_descriptor(img, shape)

                last_found = {'name': 'unknown', 'dist': 0.6, 'color': (0,0,255)}

                for name, saved_desc in self.descs.items():
                    dist = np.linalg.norm([face_descriptor] - saved_desc, axis=1)

                    if dist < last_found['dist']:
                        last_found = {'name': name, 'dist': dist, 'color': (0,255,0)}

                
        cv2.rectangle(img, pt1=(d.left(), d.top()), pt2=(d.right(), d.bottom()), color=last_found['color'], thickness=2)
        cv2.putText(img, last_found['name'], org=(d.left(), d.top()), fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=1, color=last_found['color'], thickness=2)

class Ui_Form(object):
    def setupUi(self, Form):
          [...]
        self.Thread = Thread()
        self.Thread.start()
        self.Thread.imageUpdate.connect(self.imageUpdateslot)
        def imageUpdateslot(self, image):
        self.label.setPixmap(QPixmap.fromImage(image))

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

在pyqt上流式传输opencv视频时它可以工作,但是为什么在使用dlib编写代码时它不起作用? The above code does not show errors,但只操作主设置Ui,不操作opencv webcam和dlib。我应该怎么办?

标签: pythonopencvpyqtpyqt5dlib

解决方案


推荐阅读