相机采集显示程序

使用qtdesigner 生成GUI.PY

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'GUI.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1252, 612)
        MainWindow.setMinimumSize(QtCore.QSize(1252, 611))
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setContentsMargins(5, 5, 5, 5)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.initializeBtn = QtWidgets.QPushButton(self.centralwidget)
        self.initializeBtn.setObjectName("initializeBtn")
        self.horizontalLayout.addWidget(self.initializeBtn)
        self.openBtn = QtWidgets.QPushButton(self.centralwidget)
        self.openBtn.setObjectName("openBtn")
        self.horizontalLayout.addWidget(self.openBtn)
        self.initializeStatus = QtWidgets.QLabel(self.centralwidget)
        self.initializeStatus.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.initializeStatus.setObjectName("initializeStatus")
        self.horizontalLayout.addWidget(self.initializeStatus)
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem)
        self.closeBtn = QtWidgets.QPushButton(self.centralwidget)
        self.closeBtn.setObjectName("closeBtn")
        self.horizontalLayout.addWidget(self.closeBtn)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.label_show_camera1 = QtWidgets.QLabel(self.centralwidget)
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(22)
        self.label_show_camera1.setFont(font)
        self.label_show_camera1.setObjectName("label_show_camera1")
        self.horizontalLayout_2.addWidget(self.label_show_camera1, 0, QtCore.Qt.AlignHCenter|QtCore.Qt.AlignVCenter)
        self.label_show_camera2 = QtWidgets.QLabel(self.centralwidget)
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(22)
        self.label_show_camera2.setFont(font)
        self.label_show_camera2.setObjectName("label_show_camera2")
        self.horizontalLayout_2.addWidget(self.label_show_camera2, 0, QtCore.Qt.AlignHCenter|QtCore.Qt.AlignVCenter)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        self.verticalLayout.setStretch(0, 1)
        self.verticalLayout.setStretch(1, 15)
        self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.initializeBtn.setText(_translate("MainWindow", "初始化"))
        self.openBtn.setText(_translate("MainWindow", "采集图像"))
        self.initializeStatus.setText(_translate("MainWindow", "TextLabel"))
        self.closeBtn.setText(_translate("MainWindow", "退出程序"))
        self.label_show_camera1.setText(_translate("MainWindow", "相机1"))
        self.label_show_camera2.setText(_translate("MainWindow", "相机2"))

然后使用调用GUI.PY

"""
__project_ = 'CameraControl'
__file_name__ = 'guitest'
__author__ = 'LXS'
__time__ = '20/4/2 14:51'
__product_name = PyCharm
# Bob xu
"""

import cv2
from GUI import *  # 导入创建的GUI类
from accessImages import *
import threading
from ctypes import *

class Mywindow(QtWidgets.QMainWindow, Ui_MainWindow):
    g_bExit = False
    def __init__(self):
        super(Mywindow, self).__init__()

        self.timer_camera = QtCore.QTimer()  # 定义定时器,用于控制显示视频的帧率
        self.setupUi(self)
        self.slot_init()  # 初始化槽函数
        self.setWindowTitle("相机采集程序") #设置窗口名称

    '''初始化所有槽函数'''
    def slot_init(self):
        self.openBtn.clicked.connect(self.button_open_camera_clicked)  # 若该按键被点击,则调用button_open_camera_clicked()
        self.timer_camera.timeout.connect(self.show_camera)  # 若定时器结束,则调用show_camera()
        self.closeBtn.clicked.connect(self.close)  # 若该按键被点击,则调用close(),注意这个close是父类QtWidgets.QWidget自带的,会关闭程序
        self.initializeBtn.clicked.connect(self.initialize)
        self.initializeStatus.setText('...相机未连接...')
        self.g_bExit = False
        self.initalizeSta = 0 #初始化的状态
        self.grabStatus = 0  # 采集状态

    def initialize(self):#相机初始化

        if self.initalizeSta == 0:
             deviceList = MV_CC_DEVICE_INFO_LIST()
             tlayerType = MV_GIGE_DEVICE | MV_USB_DEVICE

             # ch:枚举设备 | en:Enum device
             ret = MvCamera.MV_CC_EnumDevices(tlayerType, deviceList)
             if ret != 0:
                 print("enum devices fail! ret[0x%x]" % ret)
                 # sys.exit()
                 # return

             if deviceList.nDeviceNum == 0:
                 print("find no device!")
                 msg = QtWidgets.QMessageBox.warning(self, 'warning', "find no device!", buttons=QtWidgets.QMessageBox.Ok)
                 # sys.exit()


             print("Find %d devices!" % deviceList.nDeviceNum)

             for i in range(0, deviceList.nDeviceNum):
                 mvcc_dev_info = cast(deviceList.pDeviceInfo[i], POINTER(MV_CC_DEVICE_INFO)).contents
                 if mvcc_dev_info.nTLayerType == MV_GIGE_DEVICE:
                     print("gige device: [%d]" % i)

                     strModeName = ""
                     for per in mvcc_dev_info.SpecialInfo.stGigEInfo.chModelName:
                         strModeName = strModeName + chr(per)
                     print("device model name: %s" % strModeName)

                     nip1 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0xff000000) >> 24)
                     nip2 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x00ff0000) >> 16)
                     nip3 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x0000ff00) >> 8)
                     nip4 = (mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x000000ff)
                     print("current ip: %d.%d.%d.%d\n" % (nip1, nip2, nip3, nip4))
                     self.initializeStatus.setText("设备ID:[%d]" % i + " 设备名称: %s" % strModeName + " 连接 ip: %d.%d.%d.%d" % (nip1, nip2, nip3, nip4))
                 elif mvcc_dev_info.nTLayerType == MV_USB_DEVICE:
                     print("\nu3v device: [%d]" % i)
                     strModeName = ""
                     for per in mvcc_dev_info.SpecialInfo.stUsb3VInfo.chModelName:
                         if per == 0:
                             break
                         strModeName = strModeName + chr(per)
                     print("device model name: %s" % strModeName)

                     strSerialNumber = ""
                     for per in mvcc_dev_info.SpecialInfo.stUsb3VInfo.chSerialNumber:
                         if per == 0:
                             break
                         strSerialNumber = strSerialNumber + chr(per)
                     print("user serial number: %s" % strSerialNumber)

             # nConnectionNum = input("please input the number of the device to connect:")
             self.nConnectionNum = 0

             if int(self.nConnectionNum) >= deviceList.nDeviceNum:
                 print("intput error!")
                 # sys.exit()

             # ch:创建相机实例 | en:Creat Camera Object
             self.cam = MvCamera()

             # ch:选择设备并创建句柄 | en:Select device and create handle
             stDeviceList = cast(deviceList.pDeviceInfo[int(self.nConnectionNum)], POINTER(MV_CC_DEVICE_INFO)).contents

             ret = self.cam.MV_CC_CreateHandle(stDeviceList)
             if ret != 0:
                 print("create handle fail! ret[0x%x]" % ret)
                 # sys.exit()


             # ch:打开设备 | en:Open device
             ret = self.cam.MV_CC_OpenDevice(MV_ACCESS_Exclusive, 0)
             if ret != 0:
                 print("open device fail! ret[0x%x]" % ret)
                 # sys.exit()

             # ch:探测网络最佳包大小(只对GigE相机有效) | en:Detection network optimal package size(It only works for the GigE camera)
             if stDeviceList.nTLayerType == MV_GIGE_DEVICE:
                 nPacketSize = self.cam.MV_CC_GetOptimalPacketSize()
                 if int(nPacketSize) > 0:
                     ret = self.cam.MV_CC_SetIntValue("GevSCPSPacketSize", nPacketSize)
                     if ret != 0:
                         print("Warning: Set Packet Size fail! ret[0x%x]" % ret)
                 else:
                     print("Warning: Get Packet Size fail! ret[0x%x]" % nPacketSize)

             # ch:设置触发模式为off | en:Set trigger mode as off
             ret = self.cam.MV_CC_SetEnumValue("TriggerMode", MV_TRIGGER_MODE_OFF)
             if ret != 0:
                 print("set trigger mode fail! ret[0x%x]" % ret)
                 # sys.exit()

             # ch:获取数据包大小 | en:Get payload size
             stParam = MVCC_INTVALUE()
             memset(byref(stParam), 0, sizeof(MVCC_INTVALUE))

             ret = self.cam.MV_CC_GetIntValue("PayloadSize", stParam)
             if ret != 0:
                 print("get payload size fail! ret[0x%x]" % ret)
                 # sys.exit()

             self.nPayloadSize = stParam.nCurValue
             self.initalizeSta = 1 # 修改初始化状态
             print('1')
        else:
            print('已经初始化')
            pass

    def work_thread(self,cam=0, pData=0, nDataSize=0):
        stFrameInfo = MV_FRAME_OUT_INFO_EX()
        memset(byref(stFrameInfo), 0, sizeof(stFrameInfo))
        while True:
            ret = cam.MV_CC_GetOneFrameTimeout(pData, nDataSize, stFrameInfo, 1000)
            if ret == 0:
                print("get one frame: Width[%d], Height[%d], nFrameNum[%d]" % (
                    stFrameInfo.nWidth, stFrameInfo.nHeight, stFrameInfo.nFrameNum))
            else:
                print("no data[0x%x]" % ret)
            if self.g_bExit == True:
                break

    def stopB(self): #停止取流、关闭设备、销毁句柄

        if self.grabStatus == 0:
            print('已经停止采集')
            return
        else:
            self.g_bExit = True
            self.hThreadHandle.join()
            self.timer_camera.stop()

            # ch:停止取流 | en:Stop grab image
            ret = self.cam.MV_CC_StopGrabbing()
            if ret != 0:
                print("stop grabbing fail! ret[0x%x]" % ret)
                del self.data_buf
                # sys.exit()
                return

                # ch:关闭设备 | Close device
            ret = self.cam.MV_CC_CloseDevice()
            if ret != 0:
                print("close deivce fail! ret[0x%x]" % ret)
                del self.data_buf
                # sys.exit()
                return

                # ch:销毁句柄 | Destroy handle
            ret = self.cam.MV_CC_DestroyHandle()
            if ret != 0:
                print("destroy handle fail! ret[0x%x]" % ret)
                del self.data_buf
                # sys.exit()
                return
            del self.data_buf
            self.initalizeSta = 0  # 初始化的状态
            self.grabStatus = 0  # 采集状态

    def button_open_camera_clicked(self):
        print('开始\停止采集图像')
        flag = self.initalizeSta
        flag2 = self.grabStatus
        if self.timer_camera.isActive() == False:  # 若定时器未启动
            if flag != 0 and flag2 == 0:  # flag表示open()成不成功
                # ch:开始取流 | en:Start grab image
                ret = self.cam.MV_CC_StartGrabbing()
                if ret != 0:
                    print("start grabbing fail! ret[0x%x]" % ret)
                    # msg = QtWidgets.QMessageBox.warning(self, 'warning', "请检查相机于电脑是否连接正确",buttons=QtWidgets.QMessageBox.Ok)
                    return
                self.data_buf = (c_ubyte * self.nPayloadSize)()
                try:
                    self.hThreadHandle = threading.Thread(target=self.work_thread,
                                                          args=(self.cam, byref(self.data_buf), self.nPayloadSize))
                    self.hThreadHandle.start()
                except:
                    print("error: unable to start thread")
                self.grabStatus = 1
                self.timer_camera.start(30)  # 定时器开始计时30ms,结果是每过30ms从摄像头中取一帧显示
                self.openBtn.setText('关闭相机')
            elif flag == 0:
                msg = QtWidgets.QMessageBox.warning(self, 'warning', "请检查相机于电脑是否连接正确",buttons=QtWidgets.QMessageBox.Ok)
                return

        else:
            if flag2 != 0:
                self.timer_camera.stop()  # 关闭定时器
                self.g_bExit = True
                self.hThreadHandle.join()
                self.stopB() # 停止取流、关闭设备、销毁句柄
                self.label_show_camera1.clear()  # 清空视频显示区域
                self.label_show_camera2.clear()  # 清空视频显示区域
                self.openBtn.setText('打开相机')

                self.initializeStatus.setText('...相机未连接...')
                self.g_bExit = False

    def show_camera(self):
        self.image = self.data_buf  # 从数据流中读取

        img = np.asarray(self.image)
        Img = img.reshape(2048, 2448)  # 注意此位置的转换顺序

        show = cv2.resize(Img, (640, 480))  # 把读到的帧的大小重新设置为 640x480
        showImage = QtGui.QImage(show.data, show.shape[1], show.shape[0],
                                 QtGui.QImage.Format_Indexed8)  # 把读取到的视频数据变成QImage形式
        self.label_show_camera1.setPixmap(QtGui.QPixmap.fromImage(showImage))  # 往显示视频的Label里 显示QImage
        self.label_show_camera2.setPixmap(QtGui.QPixmap.fromImage(showImage))  # 往显示视频的Label里 显示QImage

    def closeWindow(self):
            flag = self.nPayloadSize
            if flag == None :  # flag表示open()成不成功
                print('1')
                app.exec_()

            else:
                self.timer_camera.stop()  # 关闭定时器
                # self.cap.release()  # 释放视频流

                self.g_bExit = True
                self.hThreadHandle.join()

                # ch:停止取流 | en:Stop grab image
                ret = self.cam.MV_CC_StopGrabbing()
                if ret != 0:
                    print("stop grabbing fail! ret[0x%x]" % ret)
                    del self.data_buf
                    # sys.exit()

                # ch:关闭设备 | Close device
                ret = self.cam.MV_CC_CloseDevice()
                if ret != 0:
                    print("close deivce fail! ret[0x%x]" % ret)
                    del self.data_buf
                    # sys.exit()

                # ch:销毁句柄 | Destroy handle
                ret = self.cam.MV_CC_DestroyHandle()
                if ret != 0:
                    print("destroy handle fail! ret[0x%x]" % ret)
                    del self.data_buf
                    # sys.exit()
                self.grabStatus = 0
                app.exec_()

    def closeEvent(self, event):
        """
        重写closeEvent方法,实现dialog窗体关闭时执行一些代码
        :param event: close()触发的事件
        :return: None
        """
        reply = QtWidgets.QMessageBox.question(self,
                                               '本程序',
                                               "是否要退出程序?",
                                               QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No,
                                               QtWidgets.QMessageBox.No)
        if reply == QtWidgets.QMessageBox.Yes:
            flag = self.nConnectionNum
            if flag != 0 :  # flag表示是否连接相机
                app.exec_()

            elif self.grabStatus ==1: # 表示是否采集图像
                self.timer_camera.stop()  # 关闭定时器

                self.g_bExit = True
                self.hThreadHandle.join()

                # ch:停止取流 | en:Stop grab image
                ret = self.cam.MV_CC_StopGrabbing()
                if ret != 0:
                    print("stop grabbing fail! ret[0x%x]" % ret)
                    del self.data_buf
                    sys.exit()
                else:

                    # ch:关闭设备 | Close device
                    ret = self.cam.MV_CC_CloseDevice()
                    if ret != 0:
                        print("close deivce fail! ret[0x%x]" % ret)
                        del self.data_buf
                        sys.exit()

                    # ch:销毁句柄 | Destroy handle
                    ret = self.cam.MV_CC_DestroyHandle()
                    if ret != 0:
                        print("destroy handle fail! ret[0x%x]" % ret)
                        del self.data_buf
                        sys.exit()
                event.accept()
                sys.exit(0)
        else:
            event.ignore()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = Mywindow()
    window.show()
    sys.exit(app.exec_())

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值