# -*- coding: utf-8 -*-
from dvp import * #将对应操作系统的dvp.pyd或dvp.so放入python安装目录下的Lib目录或者工程目录
import PyQt5
import sys
import cv2
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtCore import QThread, pyqtSignal#多线程
from PyQt5.QtCore import Qt#缩放
from UI import Ui_MainWindow
class MyWindow(QMainWindow, Ui_MainWindow):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setupUi(self)
#按钮事件信号槽
self.Open.clicked.connect(self.OpenCamera)
#采集线程
self.mythread = MyThread() # 实例化自己建立的任务线程类
self.mythread.signal.connect(self.image_callback) #设置任务线程发射信号触发的函数
def OpenCamera(self):
global camera
cameraInfo = Refresh()#刷新并获取相机列表
camera = Camera(int(0))#以索引号的方式打开相机
camera.Start()#启动视频流
self.mythread.start() # 启动任务线程
return None
#=======================多线程回调
def image_callback(self,image): # 这里的image就是任务线程传回的图像数据,类型必须是已经定义好的数据类型
self.label.setPixmap(QPixmap.fromImage(image))
return None
#多线程类
class MyThread(QThread): # 建立一个任务线程类
signal = pyqtSignal(QImage) #设置触发信号传递的参数数据类型,传递信号必须事先定义好数据类型
def __init__(self):
super(MyThread, self).__init__()
def run(self): # 在启动线程后任务从这个函数里面开始执行
global camera
while 1:
frame_t = camera.GetFrame(3000)#从相机采集图像数据,超时时间为3000毫秒
frame, buffer = frame_t#帧数据,帧地址
mat = QImage(buffer,frame.iWidth, frame.iHeight, QImage.Format_Indexed8)#转为QImage类型
mat=mat.scaled(mat.width() * 0.5, mat.height() * 0.5,Qt.IgnoreAspectRatio, Qt.SmoothTransformation)#缩放图像,SmoothTransformation平滑缩放,FastTransformation快速缩放
self.signal.emit(QImage(mat)) #任务线程发射信号,图像数据作为参数传递给主线程
if __name__ == "__main__":
app = QApplication(sys.argv)
mainWindow = MyWindow()
mainWindow.show()
sys.exit(app.exec_())