コード例 #1
0
class GUPPY(QWidget):
    '''GUPPY class for allied vision Camera
    '''
    def __init__(self, cam='camDefault', confVisu=None):

        super(GUPPY, self).__init__()
        p = pathlib.Path(__file__)
        #print (p)
        self.conf = QtCore.QSettings(str(p.parent / 'confCCD.ini'),
                                     QtCore.QSettings.IniFormat)
        sepa = os.sep
        self.icon = str(p.parent) + sepa + 'icons' + sepa
        self.setWindowIcon(QIcon(self.icon + 'LOA.png'))
        self.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
        self.iconPlay = self.icon + 'Play.svg'
        self.iconStop = self.icon + 'Stop.svg'
        self.iconPlay = pathlib.Path(self.iconPlay)
        self.iconPlay = pathlib.PurePosixPath(self.iconPlay)
        self.iconStop = pathlib.Path(self.iconStop)
        self.iconStop = pathlib.PurePosixPath(self.iconStop)
        self.confVisu = confVisu
        self.nbcam = cam
        self.initCam()
        self.setup()
        self.itrig = 0
        self.actionButton()
        self.camIsRunnig = False

    def initCam(self):
        '''initialisation of cam parameter 
        '''

        if self.nbcam == 'camDefault':
            try:
                self.cam0 = Vimba().camera(cameraIds[0])
                self.ccdName = 'CAM0'
                self.camID = cameraIds[0]
                self.isConnected = True
            except:
                self.isConnected = False
                self.ccdName = 'no camera'
        else:
            self.camID = self.conf.value(self.nbcam +
                                         "/camID")  ## read cam serial number
            try:
                self.cam0 = Vimba().camera(self.camID)
                self.ccdName = self.conf.value(self.nbcam + "/nameCDD")
                self.isConnected = True
            except:  # if it doesn't work we take the first one
                try:
                    self.nbcam = 'camDefault'
                    self.cam0 = Vimba().camera(cameraIds[0])
                    self.ccdName = 'CAM0'
                    self.camID = cameraIds[0]
                    self.isConnected = True
                except:
                    print('not ccd connected')
                    self.isConnected = False
                    self.ccdName = 'no camera'

        self.setWindowTitle(self.ccdName + '       v.' + version)
        if self.isConnected == True:
            print(self.ccdName, 'is connected @:', self.camID)
            self.cam0.open()
            ## init cam parameter##
            self.LineTrigger = str(
                self.conf.value(self.nbcam + "/LineTrigger")
            )  # line2 for Mako Line 1 for guppy (not tested)
            self.cam0.feature('ExposureTime').value = float(
                self.conf.value(self.nbcam + "/shutter")) * 1000
            self.cam0.feature('Gain').value = int(
                self.conf.value(self.nbcam + "/gain"))
            self.cam0.feature('TriggerMode').value = 'Off'
            self.cam0.feature('TriggerActivation').value = 'RisingEdge'
            #self.cam0.feature('TriggerSelector').value='FrameStart'
            self.cam0.feature('TriggerSource').value = 'Software'

    def setup(self):
        """ user interface definition: 
        """

        cameraWidget = QWidget()

        vbox1 = QVBoxLayout()
        vbox1 = QVBoxLayout()

        self.camName = QLabel(self.ccdName, self)
        self.camName.setAlignment(Qt.AlignCenter)

        self.camName.setStyleSheet('font :bold  14pt;color: white')
        vbox1.addWidget(self.camName)

        hbox1 = QHBoxLayout()  # horizontal layout pour run et stop
        self.runButton = QPushButton(self)
        self.runButton.setMaximumWidth(60)
        self.runButton.setMinimumHeight(60)
        self.runButton.setStyleSheet(
            "QPushButton:!pressed{border-image: url(%s);background-color: rgb(0, 0, 0,0) ;border-color: green;}"
            "QPushButton:pressed{image: url(%s);background-color: rgb(0, 0, 0,0) ;border-color: rgb(0, 0, 0)}"
            % (self.iconPlay, self.iconPlay))
        self.runButtonSave = QPushButton('5 img')
        self.runButtonSave.setMaximumWidth(60)
        self.runButtonSave.setMinimumHeight(60)

        self.stopButton = QPushButton(self)

        self.stopButton.setMaximumWidth(60)
        self.stopButton.setMinimumHeight(60)
        self.stopButton.setStyleSheet(
            "QPushButton:!pressed{border-image: url(%s);background-color: gray ;border-color: rgb(0, 0, 0,0);}"
            "QPushButton:pressed{image: url(%s);background-color: gray ;border-color: rgb(0, 0, 0)}"
            % (self.iconStop, self.iconStop))
        self.stopButton.setEnabled(False)

        hbox1.addWidget(self.runButton)
        hbox1.addWidget(self.runButtonSave)
        hbox1.addWidget(self.stopButton)

        vbox1.addLayout(hbox1)

        self.trigg = QComboBox()
        self.trigg.setMaximumWidth(60)
        self.trigg.addItem('OFF')
        self.trigg.addItem('ON')
        self.labelTrigger = QLabel('Trigger')
        self.labelTrigger.setMaximumWidth(60)
        self.itrig = self.trigg.currentIndex()
        hbox2 = QHBoxLayout()
        hbox2.addWidget(self.labelTrigger)
        hbox2.addWidget(self.trigg)
        vbox1.addLayout(hbox2)

        self.labelExp = QLabel('Exposure (ms)')
        self.labelExp.setMaximumWidth(120)
        self.labelExp.setAlignment(Qt.AlignCenter)
        vbox1.addWidget(self.labelExp)
        self.hSliderShutter = QSlider(Qt.Horizontal)
        self.hSliderShutter.setMinimum(1)
        self.hSliderShutter.setMaximum(1000)
        if self.isConnected == True:
            self.hSliderShutter.setValue(
                int(self.cam0.feature('ExposureTime').value) / 1000)
        self.hSliderShutter.setMaximumWidth(80)
        self.shutterBox = QSpinBox()
        self.shutterBox.setMinimum(1)
        self.shutterBox.setMaximum(1000)
        self.shutterBox.setMaximumWidth(60)
        if self.isConnected == True:
            self.shutterBox.setValue(
                int(self.cam0.feature('ExposureTime').value) / 1000)
        hboxShutter = QHBoxLayout()
        hboxShutter.addWidget(self.hSliderShutter)
        hboxShutter.addWidget(self.shutterBox)
        vbox1.addLayout(hboxShutter)

        self.labelGain = QLabel('Gain')
        self.labelGain.setMaximumWidth(120)
        self.labelGain.setAlignment(Qt.AlignCenter)
        vbox1.addWidget(self.labelGain)
        hboxGain = QHBoxLayout()
        self.hSliderGain = QSlider(Qt.Horizontal)
        self.hSliderGain.setMaximumWidth(80)
        if self.isConnected == True:
            self.hSliderGain.setMinimum(self.cam0.feature('Gain').range[0])
            self.hSliderGain.setMaximum(self.cam0.feature('Gain').range[1])
            self.hSliderGain.setValue(int(self.cam0.feature('Gain').value))
        self.gainBox = QSpinBox()
        if self.isConnected == True:
            self.gainBox.setMinimum(self.cam0.feature('Gain').range[0])
            self.gainBox.setMaximum(self.cam0.feature('Gain').range[1])
        self.gainBox.setMaximumWidth(60)
        if self.isConnected == True:
            self.gainBox.setValue(int(self.cam0.feature('Gain').value))
        hboxGain.addWidget(self.hSliderGain)
        hboxGain.addWidget(self.gainBox)
        vbox1.addLayout(hboxGain)

        self.TrigSoft = QPushButton('Trig Soft', self)
        self.TrigSoft.setMaximumWidth(100)
        vbox1.addWidget(self.TrigSoft)

        vbox1.addStretch(1)
        cameraWidget.setLayout(vbox1)
        cameraWidget.setMinimumSize(150, 200)
        cameraWidget.setMaximumSize(200, 900)
        hMainLayout = QHBoxLayout()
        hMainLayout.addWidget(cameraWidget)

        self.visualisation = SEE(
            confpath=self.confVisu
        )  ## Widget for visualisation and tools  self.confVisu permet d'avoir plusieurs camera et donc plusieurs fichier ini de visualisation

        vbox2 = QVBoxLayout()
        vbox2.addWidget(self.visualisation)
        hMainLayout.addLayout(vbox2)

        self.setLayout(hMainLayout)

    def actionButton(self):
        '''action when button are pressed
        '''
        self.runButton.clicked.connect(self.acquireMultiImage)
        self.runButtonSave.clicked.connect(self.acquireMultiImageSave)
        self.stopButton.clicked.connect(self.stopAcq)
        self.shutterBox.editingFinished.connect(self.shutter)
        self.hSliderShutter.sliderReleased.connect(self.mSliderShutter)

        self.gainBox.editingFinished.connect(self.gain)
        self.hSliderGain.sliderReleased.connect(self.mSliderGain)
        self.trigg.currentIndexChanged.connect(self.trigA)

        self.TrigSoft.clicked.connect(self.softTrigger)

    def softTrigger(self):
        '''to have a sofware trigger
        '''
        print('trig soft')
        self.cam0.feature('TriggerSource').value = 'Software'
        self.cam0.run_feature_command('TriggerSoftware')
        if self.itrig == 1:
            self.cam0.feature('TriggerSource').value = self.LineTrigger

    def shutter(self):
        '''set exposure time 
        '''
        sh = self.shutterBox.value()  #
        self.hSliderShutter.setValue(sh)  # set value of slider
        time.sleep(0.1)
        if self.isConnected == True:
            self.cam0.feature('ExposureTime').value = float(
                sh * 1000)  # Set shutter CCD in microseconde
        self.conf.setValue(self.nbcam + "/shutter", float(sh))
        self.conf.sync()

    def mSliderShutter(self):  # for shutter slider
        sh = self.hSliderShutter.value()
        self.shutterBox.setValue(sh)  #
        time.sleep(0.1)
        self.cam0.feature('ExposureTime').value = float(
            sh * 1000)  # Set shutter CCD in microseconde
        self.conf.setValue(self.nbcam + "/shutter", float(sh))

    def gain(self):
        '''set gain
        '''
        g = self.gainBox.value()  #
        self.hSliderGain.setValue(g)  # set slider value
        time.sleep(0.1)
        self.cam0.feature('Gain').value = g

        print("gain ", self.cam0.feature('Gain').value)
        self.conf.setValue(self.nbcam + "/gain", float(g))
        self.conf.sync()

    def mSliderGain(self):
        g = self.hSliderGain.value()
        self.gainBox.setValue(g)  # set valeur de la box
        time.sleep(0.1)
        self.cam0.feature('Gain').value = g
        print("gain ", self.cam0.feature('Gain').value)
        self.conf.setValue(self.nbcam + "/gain", float(g))
        self.conf.sync()

    def trigA(self):
        '''to select trigger mode
        '''
        self.itrig = self.trigg.currentIndex()
        if self.itrig == 1:
            self.cam0.feature('TriggerMode').value = 'On'
            self.cam0.feature('TriggerSource').value = self.LineTrigger
        else:
            self.cam0.feature('TriggerMode').value = 'Off'

    def acquireMultiImage(self):
        ''' start the acquisition thread
        '''
        self.nbImage = 0
        self.runButton.setEnabled(False)
        self.runButton.setStyleSheet(
            "QPushButton:!pressed{border-image: url(%s);background-color: gray ;border-color: rgb(0, 0, 0,0);}"
            "QPushButton:pressed{image: url(%s);background-color: gray ;border-color: rgb(0, 0, 0)}"
            % (self.iconPlay, self.iconPlay))

        self.stopButton.setEnabled(True)
        self.stopButton.setStyleSheet(
            "QPushButton:!pressed{border-image: url(%s);background-color: rgb(0, 0, 0,0) ;border-color: rgb(0, 0, 0,0);}"
            "QPushButton:pressed{image: url(%s);background-color: rgb(0, 0, 0,0) ;border-color: rgb(0, 0, 0)}"
            % (self.iconStop, self.iconStop))

        self.trigg.setEnabled(False)
        self.threadRunAcq = ThreadRunAcq(self)
        self.threadRunAcq.newDataRun.connect(self.Display)
        self.threadRunAcq.start()
        self.camIsRunnig = True

    def acquireMultiImageSave(self):
        ''' start the acquisition thread
        '''
        self.nbImage = 5
        self.runButton.setEnabled(False)
        self.runButton.setStyleSheet(
            "QPushButton:!pressed{border-image: url(%s);background-color: gray ;border-color: rgb(0, 0, 0,0);}"
            "QPushButton:pressed{image: url(%s);background-color: gray ;border-color: rgb(0, 0, 0)}"
            % (self.iconPlay, self.iconPlay))

        self.stopButton.setEnabled(True)
        self.stopButton.setStyleSheet(
            "QPushButton:!pressed{border-image: url(%s);background-color: rgb(0, 0, 0,0) ;border-color: rgb(0, 0, 0,0);}"
            "QPushButton:pressed{image: url(%s);background-color: rgb(0, 0, 0,0) ;border-color: rgb(0, 0, 0)}"
            % (self.iconStop, self.iconStop))

        self.trigg.setEnabled(False)
        self.threadRunAcq = ThreadRunAcq(self)
        self.threadRunAcq.newDataRun.connect(self.Display)
        self.threadRunAcq.start()
        self.camIsRunnig = True

    def stopAcq(self):
        '''Stop     acquisition
        '''
        print('stop')
        if self.camIsRunnig == True:
            self.threadRunAcq.stopThreadRunAcq()
            self.camIsRunnig = False

        self.runButton.setEnabled(True)
        self.runButton.setStyleSheet(
            "QPushButton:!pressed{border-image: url(%s);background-color: rgb(0, 0, 0,0) ;border-color: rgb(0, 0, 0,0);}"
            "QPushButton:pressed{image: url(%s);background-color: rgb(0, 0, 0,0) ;border-color: rgb(0, 0, 0)}"
            % (self.iconPlay, self.iconPlay))
        self.stopButton.setEnabled(False)
        self.stopButton.setStyleSheet(
            "QPushButton:!pressed{border-image: url(%s);background-color: gray ;border-color: rgb(0, 0, 0,0);}"
            "QPushButton:pressed{image: url(%s);background-color: gray ;border-color: rgb(0, 0, 0)}"
            % (self.iconStop, self.iconStop))

        self.trigg.setEnabled(True)

    def Display(self, data):
        '''Display data with Visu module
        '''
        self.data = data
        self.visualisation.newDataReceived(
            self.data)  # send data to visualisation widget

    def closeEvent(self, event):
        ''' closing window event (cross button)
        '''
        print(' close')
        self.stopAcq()
        time.sleep(0.1)
        if self.isConnected == True:
            self.cam0.close()
コード例 #2
0
class GUPPY(QWidget):

    newData = QtCore.pyqtSignal(object)
    endAcq = QtCore.pyqtSignal(bool)

    def __init__(self, cam='camDefault', **kwds):

        super(GUPPY, self).__init__()

        self.nbcam = cam
        self.itrig = 'off'
        if "conf" in kwds:
            self.conf = kwds["conf"]
        else:
            self.conf = QtCore.QSettings('confCamera.ini',
                                         QtCore.QSettings.IniFormat)
        self.camParameter = dict()
        self.camIsRunnig = False
        self.nbShot = 1
        self.items = cameraIds

    def openMenuCam(self):
        '''create a message box to choose a camera
        '''
        items = cameraIds
        item, ok = QInputDialog.getItem(self,
                                        "Select Guppy camera",
                                        "List of avaible camera",
                                        items,
                                        0,
                                        False,
                                        flags=QtCore.Qt.WindowStaysOnTopHint)

        if ok and item:
            items = list(items)
            index = items.index(item)
            self.cam0 = Vimba().camera(cameraIds[index])
            self.isConnected = True
            self.nbcam = 'camDefault'
            self.camID = cameraIds[index]
        if self.isConnected == True:
            self.setCamParameter()
        return self.isConnected

    def openFirstCam(self):
        try:
            self.cam0 = Vimba().camera(cameraIds[0])
            self.camID = cameraIds[0]
            self.isConnected = True
            self.nbcam = 'camDefault'
        except:
            self.isConnected = False
            self.ccdName = 'no camera'
        if self.isConnected == True:
            self.setCamParameter()
        return self.isConnected

    def openCamByID(self, camID):
        ''' read cam serial number
        '''
        self.camID = camID
        print(self.camID, 'icff')
        try:
            self.cam0 = Vimba().camera(self.camID)

            self.isConnected = True
            print(self.camID, 'ceee')
        except:  # if id number doesn't work we take the first one
            try:
                print('Id not valid open the fisrt camera')
                self.cam0 = Vimba().camera(cameraIds[0])
                self.camID = cameraIds[0]
                self.isConnected = True
            except:
                print('not ccd connected')
                self.isConnected = False
                self.ccdName = 'no camera'
        if self.isConnected == True:

            self.setCamParameter()

    def setCamParameter(self):
        """Open camera
        
        
        Set initial parameters
    
        """

        print('connected @:', self.camID)
        self.cam0.open()

        # for feature_name in self.cam0.feature_names():
        #     feature = self.cam0.feature(feature_name)
        #     print(feature_name)
        #     print(" ")
        #     print(" ")
        ## init cam parameter##

        self.LineTrigger = str(self.conf.value(
            self.nbcam +
            "/LineTrigger"))  # line2 for Mako Line 1 for guppy (not tested)

        self.cam0.feature('TriggerMode').value = 'Off'
        self.cam0.feature('TriggerActivation').value = 'RisingEdge'
        #self.cam0.feature('TriggerSelector').value='FrameStart'
        self.cam0.feature('TriggerSource').value = 'Software'
        self.camParameter["trigger"] = self.cam0.feature('TriggerMode').value
        self.cam0.feature('ExposureAuto').value = 'Off'
        self.cam0.feature('GainAuto').value = 'Off'

        self.cam0.feature('Height').value = self.cam0.feature(
            'HeightMax').value
        self.cam0.feature('Height').value = self.cam0.feature(
            'HeightMax').value
        self.cam0.feature('Width').value = self.cam0.feature('WidthMax').value
        self.cam0.feature('Width').value = self.cam0.feature('WidthMax').value

        self.camParameter["expMax"] = float(
            self.cam0.feature('ExposureTime').range[1]) / 1000
        self.camParameter["expMin"] = float(
            self.cam0.feature('ExposureTime').range[0]) / 1000
        #if exposure time save in the ini file is not in the range we put the minimum
        if self.camParameter["expMin"] <= int(
                self.conf.value(self.nbcam +
                                "/shutter")) <= self.camParameter["expMax"]:
            self.cam0.feature('ExposureTime').value = float(
                self.conf.value(self.nbcam + "/shutter")) * 1000
        else:
            self.cam0.feature('ExposureTime').value = float(
                self.camParameter["expMin"])

        self.camParameter["exposureTime"] = int(
            self.cam0.feature('ExposureTime').value) / 1000

        self.camParameter["gainMax"] = self.cam0.feature('Gain').range[1]
        self.camParameter["gainMin"] = self.cam0.feature('Gain').range[0]
        if self.camParameter["gainMin"] <= int(
                self.conf.value(self.nbcam +
                                "/gain")) <= self.camParameter["gainMax"]:
            self.cam0.feature('Gain').value = int(
                self.conf.value(self.nbcam + "/gain"))
        else:
            print('gain error: gain set to minimum value')
            self.cam0.feature('Gain').value = int(self.camParameter["gainMin"])

        self.camParameter["gain"] = self.cam0.feature('Gain').value

        self.threadRunAcq = ThreadRunAcq(self)
        self.threadRunAcq.newDataRun.connect(self.newImageReceived)

        self.threadOneAcq = ThreadOneAcq(self)
        self.threadOneAcq.newDataRun.connect(
            self.newImageReceived)  #,QtCore.Qt.DirectConnection)
        self.threadOneAcq.newStateCam.connect(self.stateCam)

    def setExposure(self, sh):
        ''' 
            set exposure time in ms
        '''
        self.cam0.feature('ExposureTime').value = float(
            sh * 1000)  # in gyppy ccd exposure time is microsecond
        self.camParameter["exposureTime"] = int(
            self.cam0.feature('ExposureTime').value) / 1000
        print("exposure time is set to",
              self.cam0.feature('ExposureTime').value, ' micro s')

    def setGain(self, g):
        ''' 
            set gain 
        '''
        self.cam0.feature(
            'Gain').value = g  # in gyppy ccd exposure time is microsecond
        print("Gain is set to", self.cam0.feature('Gain').value)
        self.camParameter["gain"] = self.cam0.feature('Gain').value

    def softTrigger(self):
        '''to have a sofware trigger
        '''
        print('trig soft')
        self.cam0.feature('TriggerSource').value = 'Software'
        self.cam0.run_feature_command('TriggerSoftware')

    def setTrigger(self, trig='off'):
        '''
            set trigger mode on/off
        '''

        if trig == 'on':
            self.cam0.feature('TriggerMode').value = 'On'
            self.cam0.feature('TriggerSource').value = self.LineTrigger
            self.itrig = 'on'
        else:
            self.cam0.feature('TriggerMode').value = 'Off'
            self.cam0.feature('TriggerSource').value = self.LineTrigger
            self.itrig = 'off'

        self.camParameter["trigger"] = self.cam0.feature('TriggerMode').value

    def startAcq(self):
        self.camIsRunnig = True
        self.threadRunAcq.newRun()  # to set stopRunAcq=False
        self.threadRunAcq.start()

    def startOneAcq(self, nbShot):
        self.nbShot = nbShot
        self.camIsRunnig = True
        self.threadOneAcq.newRun()  # to set stopRunAcq=False
        self.threadOneAcq.start()

    def stopAcq(self):

        self.threadRunAcq.stopThreadRunAcq()
        self.threadOneAcq.stopThreadOneAcq()
        self.camIsRunnig = False

    def newImageReceived(self, data):

        self.data = data
        self.newData.emit(self.data)

    def stateCam(self, state):
        self.camIsRunnig = state

    def closeCamera(self):
        self.cam0.close()

    def endAcquisition(self):
        self.endAcq.emit(True)