pyQT5摄像头打开

# opencv
self.cap = cv2.VideoCapture(0)
# 图像捕获
self.isExternalCameraUsed = False
# # 打开摄像头按钮
self.openCameraButton.toggled.connect(self.startWebcam)
self.openCameraButton.setCheckable(True)

# 定时器
self.timer = QTimer(self)
self.timer.timeout.connect(self.updateFrame)

编写startWebcam函数,打开摄像头

def startWebcam(self, status):
    if status:
        print('打开摄像头了')

        print(self.cap.isOpened())
        self.timer.start(5)
        if not self.cap.isOpened():
            camID = 1 if self.isExternalCameraUsed else 0 + cv2.CAP_DSHOW
            self.cap.open(camID)
            self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 680)
            self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 540)
            ret, frame = self.cap.read()  # 获取摄像头调用结果

            if not ret:
                # logging.error('无法调用电脑摄像头{}'.format(camID))
                # self.logQueue.put('Error:初始化摄像头失败')
                print('无法调用电脑摄像头{}'.format(camID))
                print('Error:初始化摄像头失败')
                self.cap.release()
                self.openCameraButton.setIcon(QIcon('./icons/error.png'))
                self.openCameraButton.setChecked(False)
            else:
                self.timer.start(5)
                # self.enableFaceDetectButton.setEnabled(True)
                self.openCameraButton.setIcon(QIcon('./icons/success.png'))
                self.openCameraButton.setText('关闭摄像头')

然后定时器刷新updateframe函数更新frame

def updateFrame(self):
    ret, frame = self.cap.read()
    # frame = cv2.flip(frame, 1)  # 水平翻转图片
    print('调用frame函数')
    if ret:
        # self.displayImage(frame)  # ?两次输出?

        if self.isFaceDetectEnabled:  # 人脸检测
            # detected_frame = self.detectFace(frame)
            # self.displayImage(detected_frame)
            self.displayImage(frame)
        else:
            self.displayImage(frame)

然后图片展示的摄像展示区域更新为视频流

# 显示图像
def displayImage(self, img):
    # BGR -> RGB
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    # default:The image is stored using 8-bit indexes into a colormap, for example:a gray image
    # img = cv2.flip(img, 1)
    qformat = QImage.Format_Indexed8

    if len(img.shape) == 3:  # rows[0], cols[1], channels[2]
        if img.shape[2] == 4:
            # The image is stored using a 32-bit byte-ordered RGBA format (8-8-8-8)
            # A: alpha channel不透明度参数。如果一个像素的alpha通道数值为0%,那它就是完全透明的
            qformat = QImage.Format_RGBA8888
        else:
            qformat = QImage.Format_RGB888

最后展示效果:

点击关闭按钮后:

就又恢复原样了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值