PyQt5 Opencv拍照

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

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值