PyQt5 Opencv拍照

本文介绍了一个使用Python实现的简单应用程序,该程序利用PyQt5进行GUI开发,并结合OpenCV实现双摄像头视频流的实时显示及拍照功能。程序通过多线程方式更新图像,避免了UI阻塞。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import sys
from PyQt5 import QtCore

import cv2
from PyQt5 import QtGui
from PyQt5.QtCore import QThread
from PyQt5.QtGui import QImage

from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QLabel
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QPushButton

def getCameraNum():
    """获取摄像头数量"""
    num = 0
    for i in range(0,5) :
        # 从摄像头中取得视频
        cap = cv2.VideoCapture(i)
        if cap.isOpened():
            num+=1
        cap.release()
    return num

class FrameThread(QThread):
    imgLab = None
    device = None
    paizhao = 0

    """摄像头拍照线程,摄像头拍照耗时较长容易卡住UI"""
    def __init__(self,deviceIndex,imgLab):
        QThread.__init__(self)
        self.imgLab = imgLab
        self.deviceIndex = deviceIndex

        self.device = cv2.VideoCapture(self.deviceIndex)  # 从摄像头中取得视频
        self.device.set(cv2.CAP_PROP_FRAME_WIDTH, 1600)
        self.device.set(cv2.CAP_PROP_FRAME_HEIGHT, 1200)

    def run(self):
        if self.device.isOpened():
            try:
                while True:
                    ret, frame = self.device.read()
                    height, width, bytesPerComponent = frame.shape
                    bytesPerLine = bytesPerComponent * width
                    # 变换彩色空间顺序
                    cv2.cvtColor(frame, cv2.COLOR_BGR2RGB, frame)
                    # 转为QImage对象
                    image = QImage(frame.data, width, height, bytesPerLine, QImage.Format_RGB888)
                    if self.paizhao == 1:
                        image.save("C:\\img"+str(self.deviceIndex)+".jpg")
                        self.paizhao = 0
                    pixmap = QPixmap.fromImage(image)
                    pixmap = pixmap.scaled(400, 300, QtCore.Qt.KeepAspectRatio)
                    self.imgLab.setPixmap(pixmap)
            finally:
                self.device.release()
        # if self.cap.isOpened():
        #     # 获取视频播放界面长宽
        #     width = int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH) + 0.5)
        #     height = int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT) + 0.5)
        #     # 定义编码器 创建 VideoWriter 对象
        #     while (self.cap.isOpened()):
        #         # 读取帧摄像头
        #         ret, frame = self.cap.read()
        #         image = QtGui.QImage(frame, width, height, QtGui.QImage.Format_Indexed8)
        #         pixmap = QtGui.QPixmap.fromImage(image.mirrored(False, True))
        #         # pixmap = QPixmap('C:\left.jpg')
        #         self.imgLab.setPixmap(pixmap)

    def destroyed(self, QObject=None):
        self.device.release()




class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()


    def initUI(self):
        hbox = QHBoxLayout(self)
        lb1 = QLabel(self)
        lb2 = QLabel(self)
        btn = QPushButton(self)
        btn.setText("拍照")
        btn.clicked.connect(self.paizhao)

        self.frameThread = FrameThread(0,lb1)
        self.frameThread.start()

        self.frameThread2 = FrameThread(1,lb2)
        self.frameThread2.start()

        hbox.addWidget(lb1)
        hbox.addWidget(lb2)
        hbox.addWidget(btn)
        self.setLayout(hbox)

        self.move(300, 300)
        self.setWindowTitle('像素图控件')        
        self.show()


    def paizhao(self):
        self.frameThread.paizhao = 1
        self.frameThread2.paizhao = 1

    def showDate(self, date):
        self.lb1.setText(date.toString())



if __name__ == '__main__':
    app = QApplication(sys.argv)

    ex = Example()
    sys.exit(app.exec_())

 

转载于:https://my.oschina.net/wjgood/blog/1573463

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值