예제 #1
0
    def __init__(self, parent=None):
        """
        Constructor
        """
        super(LtMainWindow, self).__init__(parent)
        self.setProjectName()
        self.setObjectName("ltMainWindow")
        # ==== Creating core functional units ====
        self.cvProcessor = CvProcessor(self)
        # ==== Creating GUI ====
        # status = self.statusBar()
        # status.setSizeGripEnabled(False)
        # ---- Creating main video widget ----
        self.cvGraphics = CvGraphics(self)
        self.cvGraphics.setAlignment(QtCore.Qt.AlignCenter)
        self.cvGraphics.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
        self.cvGraphics.setObjectName("cvGraphics")
        self.setCentralWidget(self.cvGraphics)
        self.cvProcessor.signalNextFrame.connect(self.cvGraphics.putImage)
        self.cvProcessor.signalClearFrame.connect(self.cvGraphics.setNullImage)
        self.cvProcessor.project.signalProjectOpened.connect(self.setProjectName)
        self.cvProcessor.project.signalProjectClosed.connect(self.setProjectName)

        # ---- Creating dock panel for video player ----
        videoDockPanel = QtGui.QDockWidget("Video Control", self)
        videoDockPanel.setObjectName("videoDockWidget")
        videoDockPanel.setAllowedAreas(QtCore.Qt.BottomDockWidgetArea)
        videoDockPanel.setFeatures(QtGui.QDockWidget.DockWidgetMovable | QtGui.QDockWidget.DockWidgetFloatable)
        self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, videoDockPanel)
        self.videoWidget = VideoWidget(self.cvProcessor.cvPlayer)
        videoDockPanel.setWidget(self.videoWidget)

        # ---- Creating dock panel for project ----
        projectDockPanel = QtGui.QDockWidget("Project", self)  # Created and set caption
        projectDockPanel.setObjectName("projectDockWidget")
        projectDockPanel.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea)
        projectDockPanel.setFeatures(QtGui.QDockWidget.DockWidgetMovable | QtGui.QDockWidget.DockWidgetFloatable)
        self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, projectDockPanel)
        self.projectWidget = ProjectWidget(self.cvProcessor.project)
        projectDockPanel.setWidget(self.projectWidget)

        # ---- Creating dock panel for chambers ----
        chambersDockPanel = QtGui.QDockWidget("Chambers", self)  # Created and set caption
        chambersDockPanel.setObjectName("chambersDockWidget")
        chambersDockPanel.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea)
        chambersDockPanel.setFeatures(QtGui.QDockWidget.DockWidgetMovable | QtGui.QDockWidget.DockWidgetFloatable)
        self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, chambersDockPanel)
        self.chambersWidget = ChambersWidget()
        # self.chambersWidget.analysisMethod.stateChanged.connect(self.cvProcessor.setAnalysisMethod)
        chambersDockPanel.setWidget(self.chambersWidget)
        # ---- chambersWidget ----
        self.chambersWidget.signalScaleSelect.connect(self.cvGraphics.selectScale)
        self.chambersWidget.signalChamberSelect.connect(self.cvGraphics.selectChamber)

        self.cvGraphics.signalChamberSetted.connect(self.chambersWidget.chamberSetted)
        self.cvGraphics.signalScaleSetted.connect(self.chambersWidget.scaleSetted)

        self.chambersWidget.signalChamberSelected.connect(self.cvGraphics.selectChamberGui)

        self.cvGraphics.signalChamberSelected.connect(self.chambersWidget.selectChamber)

        self.cvProcessor.project.signalChamberAdded.connect(self.chambersWidget.addChamber)
        self.cvProcessor.project.signalChamberAdded.connect(self.cvGraphics.addChamberGui)
        self.cvProcessor.project.signalChamberDeleted.connect(self.chambersWidget.removeChamber)
        self.cvProcessor.project.signalChamberDeleted.connect(self.cvGraphics.delChamberGui)

        self.cvProcessor.project.signalChambersMangerChanged.connect(self.chambersWidget.setChambersManager)
        self.cvProcessor.project.signalChambersMangerChanged.connect(self.cvGraphics.delScaleGui)

        # ---- Creating dock panel for image processing ----
        cvProcessorDockPanel = QtGui.QDockWidget("Image processor", self)  # Created and set caption
        cvProcessorDockPanel.setObjectName("chambersDockWidget")
        cvProcessorDockPanel.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea | QtCore.Qt.RightDockWidgetArea)
        cvProcessorDockPanel.setFeatures(QtGui.QDockWidget.DockWidgetMovable | QtGui.QDockWidget.DockWidgetFloatable)
        self.addDockWidget(QtCore.Qt.RightDockWidgetArea, cvProcessorDockPanel)
        self.cvProcessorWidget = CvProcessorWidget(self.cvProcessor)
        cvProcessorDockPanel.setWidget(self.cvProcessorWidget)

        # ---- Creating dock panel for image processing ----
        cvPreProcessorDockPanel = QtGui.QDockWidget("Preprocessor", self)  # Created and set caption
        cvPreProcessorDockPanel.setObjectName("PreDockWidget")
        cvPreProcessorDockPanel.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea | QtCore.Qt.RightDockWidgetArea)
        cvPreProcessorDockPanel.setFeatures(QtGui.QDockWidget.DockWidgetMovable | QtGui.QDockWidget.DockWidgetFloatable)
        self.addDockWidget(QtCore.Qt.RightDockWidgetArea, cvPreProcessorDockPanel)
        self.cvPreProcessorWidget = PreprocessorWidget(self.cvProcessor.preprocessor)
        cvPreProcessorDockPanel.setWidget(self.cvPreProcessorWidget)

        # ---- Creating dock panel for trajectory Widget
        cvTrajectoryDockPanel = QtGui.QDockWidget("Trajectory", self)  # Created and set caption
        cvTrajectoryDockPanel.setObjectName("TrajectoryDockWidget")
        cvTrajectoryDockPanel.setAllowedAreas(QtCore.Qt.RightDockWidgetArea)
        cvTrajectoryDockPanel.setFeatures(QtGui.QDockWidget.DockWidgetMovable | QtGui.QDockWidget.DockWidgetFloatable)
        self.addDockWidget(QtCore.Qt.RightDockWidgetArea, cvTrajectoryDockPanel)
        self.trajectoryWidget = TrajectoryWidget(self.cvProcessor.project.trajectoryAnalysis)
        cvTrajectoryDockPanel.setWidget(self.trajectoryWidget)

        self.presetsWidget = PresetsWidget(self)
        # ==== Creating menu ====

        projectMenu = self.menuBar().addMenu("&Project")
        setPresetAction = createAction(self, "Set preset...", "", "", "")
        projectMenu.addAction(setPresetAction)
        setPresetAction.triggered.connect(self.presetDialogDisplay)
        self.presetsWidget.signalSetPreset.connect(self.cvProcessorWidget.setPreset)
        self.presetsWidget.signalSetPreset.connect(self.trajectoryWidget.setPreset)

        self.quitAction = createAction(self, "Exit...", QtGui.QKeySequence.Quit, "application-exit", "Exit program")
        addActions(projectMenu, self.projectWidget.actions)
        projectMenu.addSeparator()
        projectMenu.addAction(self.quitAction)
        """
        projectToolbar = self.addToolBar("Project")
        projectToolbar.setObjectName("projectToolBar")
        addActions(projectToolbar, (self.quitAction,))
        """
        videoMenu = self.menuBar().addMenu("&Video")
        addActions(videoMenu, self.videoWidget.actions)
        chamberMenu = self.menuBar().addMenu("&Chamber")
        # addActions(chamberMenu, self.chambersWidget.actions)
        trajectoryMenu = self.menuBar().addMenu("&Trajectory")
        # addActions(trajectoryMenu, self.trajectoryWidget.actions)

        helpMenu = self.menuBar().addMenu("&Help")
        helpAboutAction = createAction(self, "&About LocoTrack", "", "help-about", "")
        helpAboutAction.triggered.connect(self.helpAbout)
        helpHelpAction = createAction(self, "&Help", QtGui.QKeySequence.HelpContents, "help-contents")
        helpHelpAction.triggered.connect(self.helpHelp)
        addActions(helpMenu, (helpAboutAction, helpHelpAction))
        # ---- cvProcessorWidget ----
        self.cvProcessorWidget.showProcessedChechBox.stateChanged.connect(self.cvProcessor.setShowProcessed)
        self.cvProcessorWidget.showContourChechBox.stateChanged.connect(self.cvProcessor.setShowContour)
        self.cvProcessorWidget.thresholdSlider.valueChanged.connect(self.cvProcessor.setTreshold)
        self.cvProcessorWidget.ellipseCropCheckBox.stateChanged.connect(self.cvProcessor.setEllipseCrop)

        # ---- Main menu ----
        # Project menu
        self.quitAction.triggered.connect(self.close)
        # Restore window settings
        settings = QtCore.QSettings()
        self.restoreGeometry(settings.value("ltMainWindow/Geometry").toByteArray())
        self.restoreState(settings.value("ltMainWindow/State").toByteArray())
        preset, isInt = settings.value("ltMainWindow/Preset").toInt()
        self.trajectoryWidget.analyseDialog.lastDirectory = settings.value(
            "ltTrajectoryWidget/lastDirectory"
        ).toString()
        self.projectWidget.lastDirectory = settings.value("ltProjectWidget/lastDirectory").toString()

        print "load preset", preset
        self.presetsWidget.setPreset(preset)
예제 #2
0
 def __init__(self, player, parent=None):
     '''
     player is an cvPlayer object to construct all signals
     '''
     super(VideoWidget, self).__init__(parent)
     self.player = player
     
     player.videoSourceOpened.connect(self.videoSourceOpen)
     player.videoSourceClosed.connect(self.videoSourceClose)
     player.nextFrame.connect(self.nextFrame)
     self.signalCaptureFromFile.connect(player.captureFromFile)
     self.signalCaptureFromCam.connect(player.captureFromCam)
     # Actions
     self.actionPlay = createAction(self,"&Play", "", 
                               "media-playback-start", "", True)
     self.actionPlay.toggled.connect(player.play)
     player.playing.connect(self.actionPlay.setChecked)
     self.actionRun =  createAction(self,"&Run", "", 
                               "fork", "", True)
     self.actionRun.toggled.connect(player.runTrough)
     player.running.connect(self.actionRun.setChecked)
     
     self.actionSeekToBegin= createAction(self,"To &begin", "", 
                              "media-skip-backward", "")
     self.actionSeekToBegin.triggered.connect(player.seekToBegin)
     self.actionSeekToEnd= createAction(self,"&To end", "", 
                              "media-skip-forward", "")
     self.actionSeekToEnd.triggered.connect(player.seekToEnd)
     self.actionRew = createAction(self,"&Rewind", "", 
                              "media-seek-backward", "")
     self.actionRew.triggered.connect(player.seekRew)
     self.actionFwd = createAction(self,"&Forward", "", 
                              "media-seek-forward", "")
     
     self.actionFwd.triggered.connect(player.seekFwd)
     self.actions = (self.actionPlay,self.actionRun,None,
                          self.actionRew, self.actionFwd,
                          self.actionSeekToBegin,self.actionSeekToEnd)
     
     # Video slider and position label
     layout1 = QtGui.QHBoxLayout()
     self.setLeftButton = QtGui.QPushButton('Set Left')
     layout1.addWidget(self.setLeftButton)
     self.setLeftButton.clicked.connect(player.setCurrentToLeftBorder)
     self.startFrameSpinBox = QtGui.QSpinBox()
     player.leftBorderSetted.connect(self.startFrameSpinBox.setValue)
     layout1.addWidget(self.startFrameSpinBox)
     self.startFrameSpinBox.valueChanged.connect(player.setLeftBorder)
     self.videoSlider = QtGui.QSlider(QtCore.Qt.Horizontal)
     layout1.addWidget(self.videoSlider)
     self.timeLabel = QtGui.QLabel('0')
     layout1.addWidget(self.timeLabel)
     self.endFrameSpinBox = QtGui.QSpinBox()
     layout1.addWidget(self.endFrameSpinBox)
     self.endFrameSpinBox.valueChanged.connect(player.setRightBorder)
     self.videoSlider.valueChanged.connect(self.videoSliderMove)  
     self.videoSlider.sliderMoved.connect(player.seek)
     self.setRightButton = QtGui.QPushButton('Set Right')
     layout1.addWidget(self.setRightButton)
     self.setRightButton.clicked.connect(player.setCurrentToRightBorder)
     player.rightBorderSetted.connect(self.endFrameSpinBox.setValue)
     #     
     layout2 = QtGui.QHBoxLayout()
     seekToBeginButton = ActionButton(self.actionSeekToBegin)
     layout2.addWidget(seekToBeginButton)
     rewButton = ActionButton(self.actionRew)
     layout2.addWidget(rewButton)
     playButton = ActionButton(self.actionPlay)
     layout2.addWidget(playButton)
     fwdButton = ActionButton(self.actionFwd)
     layout2.addWidget(fwdButton)
     seekToEndButton = ActionButton(self.actionSeekToEnd)
     layout2.addWidget(seekToEndButton)
     runTroughButton = ActionButton(self.actionRun)
     layout2.addWidget(runTroughButton)
     # Speed
     self.speedLabel = QtGui.QLabel('Speed:')
     layout2.addWidget(self.speedLabel)
     self.speedSpinBox = QtGui.QDoubleSpinBox()
     layout2.addWidget(self.speedSpinBox)
     self.speedLabel.setBuddy(self.speedSpinBox)
     self.speedSpinBox.valueChanged.connect(player.setSpeed)
     self.speedSpinBox.setMinimum(0.2)
     self.speedSpinBox.setMaximum(2.0)
     self.speedSpinBox.setValue(1.0) 
     resetBordersButton = QtGui.QPushButton('Reset borders')
     resetBordersButton.clicked.connect(player.resetBorders)
     layout2.addWidget(resetBordersButton)
     layout2.addStretch()
     
     # Main Layout
     layout = QtGui.QVBoxLayout()
     layout.addLayout(layout1)
     layout.addLayout(layout2)
     self.setLayout(layout)
     # Creating sets to enable/disable GUI elements
     self.playSet = set([self.videoSlider, self.actionPlay,
                        self.actionRew, self.actionFwd, self.actionRun, self.actionSeekToBegin,
                        self.actionSeekToEnd])
     self.setGuiEnabled(False)
예제 #3
0
 def __init__(self, project, parent=None):
     '''
     Constructor
     '''
     super(ProjectWidget, self).__init__(parent)
     self.project = project 
     self.lastDirectory = '.'
     self.videoList = QtGui.QTreeWidget()
     self.videoList.setColumnCount(1)
     self.videoList.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
     
     layout1 = QtGui.QVBoxLayout()
     layout1.addWidget(self.videoList)
     self.setLayout(layout1)
     self.actionOpenProject = createAction(self,"&Open...", "",
                                    "project-open", "Open project")
     self.actionOpenProject.triggered.connect(self.openProject)
     self.actionSaveProject = createAction(self,"&Save", "",
                                    "document-save", "Save project")
     self.actionSaveProject.triggered.connect(self.saveProject)
     self.actionSaveProjectAs = createAction(self,"Save &as...", "",
                                    "document-save-as", "Save project as")
     self.actionSaveProjectAs.triggered.connect(self.saveProjectAs)
     self.actionCloseProject = createAction(self,"&Close", "",
                                    "project-development-close", "Close project")
     self.actionCloseProject.triggered.connect(self.closeProject)
     self.actionAddVideo = createAction(self,"&Add video...", "",
                                    "document-open", "Add video file to project")
     self.actionAddVideo.triggered.connect(self.addVideo)
     self.actionCaptureVideo = createAction(self,"&Capture video...", "",
                                       "camera-web", "")
     #self.actionCaptureVideo.triggered.connect(self.captureVideo)
     self.actionRemoveVideo = createAction(self,"Remove video", "",
                                       "dialog-close", "")
     self.actionRemoveVideo.triggered.connect(self.removeVideo)
     
     
     self.actionAnalyseProject = createAction(self, "&Analyse project", "",
                                    "", "Analyse whole files in project and make statistics")
     self.actionAnalyseProject.triggered.connect(self.analyseProject)
     
     self.actions = (self.actionOpenProject,self.actionSaveProject,self.actionSaveProjectAs,self.actionCloseProject,None,
                     self.actionAddVideo,self.actionRemoveVideo,None,self.actionAnalyseProject)
     
     
     self.videoList.setHeaderLabel('Video Files')
     self.videoItems = {}
     
     self.project.signalVideoAdded.connect(self.videoAdded)
     self.project.signalVideoRemoved.connect(self.videoRemoved)
     #self.project.signalProjectUpdated.connect(self.updateProject)
     self.project.signalVideoSelected.connect(self.selectVideo)
     self.videoList.itemClicked.connect(self.changeItem)
     
     # Open and capture video buttons
     layout2=QtGui.QHBoxLayout()
     videoAddButton = ActionButton(self.actionAddVideo)
     layout2.addWidget(videoAddButton)
     #videoCaptureButton = ActionButton(self.actionCaptureVideo)
     #layout2.addWidget(videoCaptureButton)
     videoRemoveButton = ActionButton(self.actionRemoveVideo)
     layout2.addWidget(videoRemoveButton)
     layout1.addLayout(layout2)
예제 #4
0
    def __init__(self, parent=None):
        '''
        Constructor
        '''
        super(ChambersWidget, self).__init__(parent)
        self.chambersManager = None
        # self.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
        # Creating GUI elements
        layout = QtGui.QGridLayout()
        #chambersLabel = QtGui.QLabel('Chambers')
        #chambersLabel.setBuddy(self.chambersList)
        #layout.addWidget(chambersLabel, 0, 0, 1, 2)
        # list of chambers
        self.chamberWidgets = {} #
        self.selectedChamber = None 
        self.chambersList = QtGui.QTableWidget()
        self.chambersList.horizontalHeader().setResizeMode(QtGui.QHeaderView.ResizeToContents);
        self.chambersList.setColumnCount(2)
        self.chambersList.setHorizontalHeaderLabels(['Sample name', 'Threshold'])
        self.chambersList.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
        header = self.chambersList.verticalHeader()
        header.setClickable(True)
        header.sectionClicked.connect(self.chamberSelectionChanged)
        layout.addWidget(self.chambersList, 1, 0, 1, 2)
        
        # Actions
        self.actionSetChamber = createAction(self, "Set chamber", "",
                                       "distribute-horizontal-center", "", True)
        self.actionSetChamber.toggled.connect(self.setChamber)
        self.actionClearChamber = createAction(self, "Clear chamber", "",
                                  "process-stop", "")
        self.actionSetScale = createAction(self, "Set scale", "",
                                  "measure", "", True)
        self.actionSetScale.toggled.connect(self.setScale)
        self.actionRecordTrajectory = createAction(self, "&Record trajectory", "",
                                 "media-record", "", True)
        self.actionRecordTrajectory.toggled.connect(self.setRecordTrajectory)
        self.actions = (self.actionSetChamber, self.actionClearChamber, None,
                        self.actionSetScale, None,
                        self.actionRecordTrajectory)
        # Sample name label and edit
        sampleNameLabel = QtGui.QLabel('Sample name:')
        self.sampleNameEdit = QtGui.QLineEdit()
        sampleNameLabel.setBuddy(self.sampleNameEdit)
        
        layout.addWidget(sampleNameLabel, 2, 0)
        layout.addWidget(self.sampleNameEdit, 2, 1)
        # Add chamber button    
        self.setChamberButton = ActionButton(self.actionSetChamber)
        layout.addWidget(self.setChamberButton, 3, 0)
        # Clear chamber button
        self.clearChamberButton = ActionButton(self.actionClearChamber)
        layout.addWidget(self.clearChamberButton, 3, 1)
        self.clearChamberButton.clicked.connect(self.chamberClear)
        # Set scale button
        self.scaleButton = ActionButton(self.actionSetScale)
        layout.addWidget(self.scaleButton, 4, 0)      

        self.recordTrajectoryButton = ActionButton(self.actionRecordTrajectory)
        layout.addWidget(self.recordTrajectoryButton, 5, 0)
        '''
        self.saveTrajectoryButton = ActionButton(self.actionSaveTrajectory)
        layout.addWidget(self.saveTrajectoryButton, 5, 1)
        '''
        self.setLayout(layout)
        self.setEnabledActions()