Esempio n. 1
0
class VGenesTextMain(QMainWindow):
    def __init__(self):
        super(VGenesTextMain, self).__init__()
        self.setupUi()

    def setupUi(self):

        self.curFile = ''

        self.textEdit = QTextEdit()
        self.textEdit.setTextInteractionFlags(Qt.TextEditorInteraction)
        self.setCentralWidget(self.textEdit)

        #self.textEdit_legend = QTextEdit()

        #grid = QGridLayout()
        #grid.setSpacing(10)
        #grid.addWidget(self.textEdit, 1, 0)
        #grid.addWidget(self.textEdit_legend, 1, 1)

        #self.setLayout(grid)

        #vbox = QVBoxLayout()
        #vbox.addStretch(1)
        #vbox.addLayout(self.textEdit)
        #vbox.addLayout(self.textEdit_legend)
        #self.setLayout(vbox)

        self.createActions()
        self.createMenus()
        self.createToolBars()
        self.createStatusBar()

        self.readSettings()

        self.textEdit.document().contentsChanged.connect(
            self.documentWasModified)

        self.setCurrentFile('')

    def closeEvent(self, event):
        if self.maybeSave():
            self.writeSettings()
            event.accept()
        else:
            event.ignore()

    def newFile(self):
        if self.maybeSave():
            self.textEdit.clear()
            self.setCurrentFile('')

    def open(self):
        if self.maybeSave():
            fileName, _ = QFileDialog.getOpenFileName(self)
            if fileName:
                self.loadFile(fileName)

    def print_(self):
        document = self.textEdit.document()
        printer = QPrinter()

        dlg = QPrintDialog(printer, self)
        if dlg.exec_() != QDialog.Accepted:
            return

        document.print_(printer)

        self.statusBar().showMessage("Ready", 2000)

    def save(self):
        if self.curFile:
            return self.saveFile(self.curFile)

        return self.saveAs()

    def saveAs(self):
        fileName, _ = QFileDialog.getSaveFileName(self)
        if fileName:
            return self.saveFile(fileName)

        return False

    def IncreaseFont(self):
        FontIs = self.textEdit.currentFont()
        font = QFont(FontIs)

        FontSize = int(font.pointSize())
        FontFam = font.family()
        if FontSize < 36:
            FontSize += 1
        font.setPointSize(FontSize)
        font.setFamily(FontFam)

        self.textEdit.setFont(font)

    def DecreaseFont(self):
        FontIs = self.textEdit.currentFont()
        font = QFont(FontIs)

        FontSize = int(font.pointSize())
        FontFam = font.family()
        if FontSize > 6:
            FontSize -= 1
        font.setPointSize(FontSize)
        font.setFamily(FontFam)

        self.textEdit.setFont(font)

    def legend_act(self):
        pass

    def about(self):
        QMessageBox.about(
            self, "About VGenes Text Editor",
            "The <b>VGenes Text Editor</b> allows "
            "you to edit, save, and print documents "
            "generated by VGenes.")

    def documentWasModified(self):
        self.setWindowModified(self.textEdit.document().isModified())

    def createActions(self):
        self.newAct = QAction(QIcon(':/PNG-Icons/page.png'),
                              "&New",
                              self,
                              shortcut=QKeySequence.New,
                              statusTip="Create a new file",
                              triggered=self.newFile)

        self.openAct = QAction(QIcon(':/PNG-Icons/folder.png'),
                               "&Open...",
                               self,
                               shortcut=QKeySequence.Open,
                               statusTip="Open an existing file",
                               triggered=self.open)

        self.saveAct = QAction(QIcon(':/PNG-Icons/SaveIcon.png'),
                               "&Save",
                               self,
                               shortcut=QKeySequence.Save,
                               statusTip="Save the document to disk",
                               triggered=self.save)

        self.saveAsAct = QAction(
            "Save &As...",
            self,
            shortcut=QKeySequence.SaveAs,
            statusTip="Save the document under a new name",
            triggered=self.saveAs)

        self.closeAct = QAction("Close",
                                self,
                                shortcut=QKeySequence.Close,
                                statusTip="Close window",
                                triggered=self.close)

        self.exitAct = QAction("E&xit",
                               self,
                               shortcut="Ctrl+Q",
                               statusTip="Exit VGenes Text Editor",
                               triggered=self.close)

        self.cutAct = QAction(
            QIcon(':/PNG-Icons/scissor.png'),
            "Cu&t",
            self,
            shortcut=QKeySequence.Cut,
            statusTip="Cut the current selection's contents to the clipboard",
            triggered=self.textEdit.cut)

        self.IncreaseAct = QAction(QIcon(':/PNG-Icons/plus.png'),
                                   "&Increase",
                                   self,
                                   statusTip="Increase font size",
                                   triggered=self.IncreaseFont)

        self.DecreaseAct = QAction(QIcon(':/PNG-Icons/minus.png'),
                                   "&Decrease",
                                   self,
                                   statusTip="Decrease font size",
                                   triggered=self.DecreaseFont)

        self.printAct = QAction(QIcon(':/PNG-Icons/print.png'),
                                "&Print...",
                                self,
                                shortcut=QKeySequence.Print,
                                statusTip="Print the current form letter",
                                triggered=self.print_)

        self.copyAct = QAction(
            QIcon(':/PNG-Icons/pages.png'),
            "&Copy",
            self,
            shortcut=QKeySequence.Copy,
            statusTip="Copy the current selection's contents to the clipboard",
            triggered=self.textEdit.copy)

        self.pasteAct = QAction(
            QIcon(':/PNG-Icons/Paste.png'),
            "&Paste",
            self,
            shortcut=QKeySequence.Paste,
            statusTip=
            "Paste the clipboard's contents into the current selection",
            triggered=self.textEdit.paste)

        self.aboutAct = QAction("&About",
                                self,
                                statusTip="Show the application's About box",
                                triggered=self.about)

        self.Legend = QAction(QIcon(':/PNG-Icons/ScalePic.png'),
                              "&Legend",
                              self,
                              statusTip="Legend",
                              triggered=self.legend_act)

        # self.aboutQtAct = QAction("About &Qt", self,
        #         statusTip="Show the Qt library's About box",
        #         triggered=QApplication.instance().aboutQt)

        self.cutAct.setEnabled(False)
        self.copyAct.setEnabled(False)
        self.textEdit.copyAvailable.connect(self.cutAct.setEnabled)
        self.textEdit.copyAvailable.connect(self.copyAct.setEnabled)

    def createMenus(self):

        self.menubar = QMenuBar(self)
        self.menubar.setGeometry(QRect(0, 0, 1029, 22))
        self.menubar.setDefaultUp(False)
        self.menubar.setNativeMenuBar(False)
        self.menubar.setObjectName("menubar")
        self.menuFile = QMenu(self.menubar)

        self.setMenuBar(self.menubar)

        self.fileMenu = self.menuBar().addMenu("&File")
        self.fileMenu.addAction(self.newAct)
        self.fileMenu.addAction(self.openAct)
        self.fileMenu.addAction(self.closeAct)
        self.fileMenu.addAction(self.saveAct)
        self.fileMenu.addAction(self.saveAsAct)
        self.fileMenu.addAction(self.printAct)
        self.fileMenu.addSeparator()
        self.fileMenu.addAction(self.exitAct)

        self.editMenu = self.menuBar().addMenu("&Edit")
        self.editMenu.addAction(self.cutAct)
        self.editMenu.addAction(self.copyAct)
        self.editMenu.addAction(self.pasteAct)

        self.menuBar().addSeparator()

        self.helpMenu = self.menuBar().addMenu("&Help")
        self.helpMenu.addAction(self.aboutAct)
        # self.helpMenu.addAction(self.aboutQtAct)

    def createToolBars(self):
        self.fileToolBar = self.addToolBar("File")
        self.fileToolBar.addAction(self.newAct)
        self.fileToolBar.addAction(self.openAct)
        self.fileToolBar.addAction(self.closeACT)
        self.fileToolBar.addAction(self.saveAct)
        self.fileMenu.addAction(self.saveAsAct)
        self.fileToolBar.addAction(self.printAct)

        self.editToolBar = self.addToolBar("Edit")
        self.editToolBar.addAction(self.cutAct)
        self.editToolBar.addAction(self.copyAct)
        self.editToolBar.addAction(self.pasteAct)

        #self.FontSizeToolBar = self.addToolBar("FontSize")
        #self.FontSizeToolBar.addAction(self.IncreaseAct)
        #self.FontSizeToolBar.addAction(self.DecreaseAct)

        self.LegendToolBar = self.addToolBar("Legend")
        self.LegendToolBar.addAction(self.Legend)

    def createStatusBar(self):
        self.statusBar().showMessage("Ready")

    def readSettings(self):
        settings = QSettings("Trolltech", "VGenes Text Editor")
        pos = settings.value("pos", QPoint(200, 200))
        size = settings.value("size", QSize(400, 400))
        self.resize(size)
        self.move(pos)

    def writeSettings(self):
        settings = QSettings("Trolltech", "VGenes Text Editor")
        settings.setValue("pos", self.pos())
        settings.setValue("size", self.size())

    def maybeSave(self):
        if self.textEdit.document().isModified():
            ret = QMessageBox.warning(
                self, "VGenes Text Editor",
                "The document has been modified.\nDo you want to save "
                "your changes?",
                QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel)

            if ret == QMessageBox.Save:
                return self.save()

            if ret == QMessageBox.Cancel:
                return False

        return True

    def loadFile(self, fileName):
        file = QFile(fileName)
        if not file.open(QFile.ReadOnly | QFile.Text):
            QMessageBox.warning(
                self, "VGenes Text Editor",
                "Cannot read file %s:\n%s." % (fileName, file.errorString()))
            return

        inf = QTextStream(file)
        QApplication.setOverrideCursor(Qt.WaitCursor)
        self.textEdit.setPlainText(inf.readAll())
        QApplication.restoreOverrideCursor()

        self.setCurrentFile(fileName)
        self.statusBar().showMessage("File loaded", 2000)

    def saveFile(self, fileName):
        file = QFile(fileName)
        if not file.open(QFile.WriteOnly | QFile.Text):
            QMessageBox.warning(
                self, "VGenes Text Editor",
                "Cannot write file %s:\n%s." % (fileName, file.errorString()))
            return False

        outf = QTextStream(file)
        QApplication.setOverrideCursor(Qt.WaitCursor)
        outf << self.textEdit.toPlainText()
        QApplication.restoreOverrideCursor()

        self.setCurrentFile(fileName)
        self.statusBar().showMessage("File saved", 2000)
        return True

    def setCurrentFile(self, fileName):
        self.curFile = fileName
        self.textEdit.document().setModified(False)
        self.setWindowModified(False)

        if self.curFile:
            shownName = self.strippedName(self.curFile)
        else:
            shownName = 'untitled.txt'

        self.setWindowTitle("%s[*] - VGenes Text Editor" % shownName)

    def strippedName(self, fullFileName):
        return QFileInfo(fullFileName).fileName()
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        #adjusting main window
        self.resize(DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT)
        self.move(0, 0)

        #setting scaling factor = 1
        self.zoom = 1

        #initializing and registering centeral widget
        self.centeral_widget = QWidget(self)
        self.setCentralWidget(self.centeral_widget)

        #initializing frame view
        self.frame_panel = DLabel(self.centeral_widget, self)
        # position frame panel
        self.frame_panel.move(FRAME_MARGIN_LEFT, FRAME_MARGIN_TOP)

        # set initial image
        self.frame_panel.setPixmap(QPixmap("initial.png"))

        #fur testing
        self.frame_panel.content = cv2.imread("initial.png")

        # enabling custom context menu
        self.setContextMenuPolicy(Qt.CustomContextMenu)

        #initializing menubar
        self.menubar = QMenuBar(self)

        #adding menu options
        self.file_menu = QMenu(self.menubar)
        self.zoom_menu = QMenu(self.menubar)
        self.marker_menu = QMenu(self.menubar)
        self.bounding_boxes = QMenu(self.menubar)

        #registering menubar
        self.menubar.move(0, 0)
        self.menubar.setDefaultUp(False)
        self.setMenuBar(self.menubar)

        #initializing and registering statusbar
        self.statusbar = QStatusBar(self)
        self.setStatusBar(self.statusbar)

        #add permanent frame lable to statusbar
        self.statusbar.frame_lable = QLabel(self)
        self.statusbar.frame_lable.setText("")
        self.statusbar.frame_lable.resize(100, 50)
        self.statusbar.frame_lable.move(DEFAULT_WINDOW_WIDTH - 100,
                                        DEFAULT_WINDOW_HEIGHT - 37)

        # set initail status tip
        self.statusbar.setStatusTip("Please choose a video file to begin")

        self.initialize_submenus()

        #assign visual texts to window, menus and submenus
        self.setTexts()

        #initailize video path
        self.vid_path = ""
        self.vid = False

        #adding slider for quick seek
        self.slider = QSlider(self.centeral_widget)

        #setting slider geometery
        self.slider.resize(DEFAULT_WINDOW_WIDTH - SLIDER_MARGINS * 2,
                           SLIDER_HEIGHT)
        self.slider.move(
            SLIDER_MARGINS, DEFAULT_WINDOW_HEIGHT - STATUSBAR_HEIGHT -
            SLIDER_HEIGHT - SLIDER_MARGINS)

        #setting orientation
        self.slider.setOrientation(Qt.Horizontal)

        #connecting mouse event
        self.slider.valueChanged.connect(self.moveSliderToClickedPosition)
        self.slider.setDisabled(True)

        # initialize context menu
        self.initContextMenu()

        # initializing mongo client and db
        self.database_client = MongoClient()
        self.db = self.database_client.fish

        # initializing collection
        self.collection = False

    def initContextMenu(self):

        # initialize custom context menu and submenu
        self.context_menu = QMenu(self)
        self.context_sub_menu = QMenu('Class', self)

        # create a delete action
        self.delete_action = QAction('Delete', self)
        self.delete_action.triggered.connect(self.frame_panel.deleteMarker)

        # create get lable action
        self.ask_lable = QAction('Ask Lable', self)
        self.ask_lable.triggered.connect(self.frame_panel.getLable)

        # adding dictionary for reverse search
        self.classes = {}

        # initializing class group
        self.class_group = QActionGroup(self)

        # adding submenu actions

        for item in CONFIGURED_CLASSES:
            self.classes[item] = QAction(item, self)
            self.classes[item].setCheckable(True)
            self.class_group.addAction(self.classes[item])

        # connecting group to handlers and setting default class
        self.class_group.triggered.connect(self.frame_panel.toggleMarkerClass)
        self.classes[CONFIGURED_CLASSES[0]].setChecked(True)

        # add delete action to menu
        self.context_menu.addAction(self.delete_action)

        # add ask lable action to menu
        self.context_menu.addAction(self.ask_lable)

        # add class actions to submenu
        self.context_sub_menu.addActions(self.class_group.actions())

        # regester submenu to menu
        self.context_menu.addMenu(self.context_sub_menu)

    def initialize_submenus(self):

        #intializing open submenu
        self.open_submenu = QAction(self)
        self.open_submenu.setShortcut('Ctrl+F')
        self.open_submenu.setStatusTip("Open")
        self.open_submenu.triggered.connect(self.selectFile)

        # intializing export submenu
        self.export_submenu = QAction(self)
        self.export_submenu.setShortcut('Ctrl+E')
        self.export_submenu.setStatusTip("Export")
        self.export_submenu.triggered.connect(self.exportImages)
        self.export_submenu.setDisabled(True)

        # intializing export submenu
        self.init_submenu = QAction(self)
        self.init_submenu.setShortcut('Ctrl+I')
        self.init_submenu.setStatusTip("Initialize")
        self.init_submenu.triggered.connect(self.initializeWithAlgorithm)
        self.init_submenu.setDisabled(True)

        #initializing options for zoom menu
        self.p50_submenu = QAction(self)
        self.p50_submenu.setStatusTip("50%")
        self.p50_submenu.setCheckable(True)
        self.p50_submenu.val = 0.5

        self.p100_submenu = QAction(self)
        self.p100_submenu.setStatusTip("100%")
        self.p100_submenu.setCheckable(True)
        self.p100_submenu.val = 1.0

        self.p150_submenu = QAction(self)
        self.p150_submenu.setStatusTip("150%")
        self.p150_submenu.setCheckable(True)
        self.p150_submenu.val = 1.5

        self.p200_submenu = QAction(self)
        self.p200_submenu.setStatusTip("200%")
        self.p200_submenu.setCheckable(True)
        self.p200_submenu.val = 2.0

        self.zoom_group = QActionGroup(self)
        self.zoom_group.addAction(self.p50_submenu)
        self.zoom_group.addAction(self.p100_submenu)
        self.zoom_group.addAction(self.p150_submenu)
        self.zoom_group.addAction(self.p200_submenu)
        self.p100_submenu.setChecked(True)
        self.zoom_group.setDisabled(True)
        self.zoom_group.triggered.connect(self.changeZoom)

        #registering file submenus
        self.file_menu.addAction(self.open_submenu)

        # registering bounding box submenus
        self.bounding_boxes.addAction(self.export_submenu)
        self.bounding_boxes.addAction(self.init_submenu)

        #registering zoom submenus
        self.zoom_menu.addActions(self.zoom_group.actions())

        #registering menus to menubar
        self.menubar.addAction(self.file_menu.menuAction())
        self.menubar.addAction(self.zoom_menu.menuAction())
        self.menubar.addAction(self.bounding_boxes.menuAction())

    def setTexts(self):
        self.setWindowTitle("FIBVID Analyser")

        #file menu
        self.file_menu.setTitle("File")

        self.open_submenu.setText("Open")

        self.bounding_boxes.setTitle("Boxes")

        # bouding boxes menu
        self.export_submenu.setText("Export as Images")
        self.init_submenu.setText("Initialize with Model")

        #zoom menu
        self.zoom_menu.setTitle("Zoom")

        self.p50_submenu.setText("50%")
        self.p100_submenu.setText("100%")
        self.p100_submenu.setText("100%")
        self.p150_submenu.setText("150%")
        self.p200_submenu.setText("200%")

    def selectFile(self):

        # get the file browser pop-up
        path, _ = QFileDialog.getOpenFileName(self.statusbar,
                                              'Select Video File', '/home')
        self.vid_path = path
        self.initVideo()

    def exportImages(self):

        cursor_pos = self.vid.get(cv2.CAP_PROP_POS_FRAMES)

        markers = self.collection.find({})
        markers.batch_size(1000000000)

        markers = [marker for marker in markers]

        height, width = self.current_frame.shape[0:2]

        empty = np.zeros((height, width, 3), np.uint8)

        center = (int(width / 2), int(height / 2))

        i = 0

        last = 0

        for marker in markers:

            progress = int(i * 100 / len(markers))

            img = empty.copy()
            cv2.circle(img, center, 100, (255, 255, 255))
            cv2.circle(img, center, progress, (255, 255, 255), -1)

            print(progress)

            self.setFrame(img)
            cv2.waitKey(1)
            last = progress

            box = [marker["start_pos"], marker["end_pos"]]

            rbox = RBox.fromPointBoundingBox(box)

            self.vid.set(cv2.CAP_PROP_POS_FRAMES, marker["frame_no"] - 1)

            rtt, frame = self.vid.read()

            patch = rbox.extractPatchFromImage(frame, square=True)

            name = str(marker["_id"])
            name = "./exports/" + name + ".png"
            cv2.imwrite(name, patch)
            i += 1

        self.initVideo()

    def showProgress(self, progress, fps):

        height, width = self.current_frame.shape[0:2]

        empty = np.zeros((height, width, 3), np.uint8)

        center = (int(width / 2), int(height / 2))

        cv2.circle(empty, center, progress, (255, 255, 255), -1)
        empty[center[1] - 100:center[1] + 100, center[0] - 100:center[0] +
              100] = cv2.bitwise_and(empty[center[1] - 100:center[1] + 100,
                                           center[0] - 100:center[0] + 100],
                                     empty[center[1] - 100:center[1] + 100,
                                           center[0] - 100:center[0] + 100],
                                     mask=self.coin)

        cv2.circle(empty, center, 98, (255, 255, 255))

        font = cv2.FONT_HERSHEY_SIMPLEX
        cv2.putText(empty, "FPS: {}".format(fps), (10, 20), font, 0.5,
                    (255, 255, 255), 1, cv2.LINE_AA)

        self.setFrame(empty)

    def initializeWithAlgorithm(self):

        self.initVideo()
        self.analyser = RuntimeABGSC(vid_path=self.vid_path)

        # read progress image
        coin = cv2.imread("fish_coin_inv.png")
        self.coin = np.uint8(
            cv2.cvtColor(coin, cv2.COLOR_RGB2GRAY) > 150) * 255

        # empty collection
        self.collection.delete_many({})

        # frame cout
        frame_count = self.vid.get(cv2.CAP_PROP_FRAME_COUNT)
        counter = 0

        # disable scroll bar
        self.slider.setDisabled(True)

        # disable video
        self.vid = False

        markers = []

        while (self.analyser.status):

            # while video is not complete
            start = time()
            self.analyser.process(show_output=False)
            end = time()
            # increment counter
            counter += 1

            # calculate fps
            fps = int(1 / (end - start))

            # show progress in display window
            progress = int(counter * 100 / frame_count)
            self.showProgress(progress, fps)

            for box in self.analyser.final_boxes:

                start_pos = (int(box[0][0]), int(box[0][1]))
                end_pos = (int(box[1][0]), int(box[1][1]))

                # add resultant marker to markers of current frame
                marker = Marker(start_pos, end_pos, counter,
                                CONFIGURED_CLASSES[3])
                markers.append(marker.toDictionary())
                #self.frame_panel.markers.append(marker)

        # add markers to database
        self.collection.insert_many(markers)

        self.initVideo()

    def changeZoom(self):

        # get selected option's value
        zoom = self.zoom_group.checkedAction().val

        # reset frame according to new scaling
        self.resetFrame(zoom)

    def resetFrame(self, zoom):

        self.zoom = zoom
        self.frame_panel.zoom = zoom

        #resize frame panel
        self.frame_panel.resize(self.vid_height * zoom, self.vid_width * zoom)

        #resize window if dynamic scaling is enabled
        if DYNAMIC_WINDOW_SCALING:
            self.resize(
                self.vid_height * zoom + FRAME_MARGIN_LEFT +
                FRAME_MARGIN_RIGHT,
                self.vid_width * zoom + FRAME_MARGIN_TOP + FRAME_MARGIN_BOTTOM)

            # reposition slider
            self.slider.move(
                SLIDER_MARGINS,
                self.vid_width * zoom - (SLIDER_HEIGHT + SLIDER_MARGINS))

            # resize slider
            self.slider.resize(self.width() - SLIDER_MARGINS * 2,
                               SLIDER_HEIGHT)

            # reposition frame lable
            self.statusbar.frame_lable.move(self.width() - 100,
                                            self.height() - 37)

        self.currentFrame()

    def initVideo(self):

        # reset zoom
        self.zoom = 1.0

        self.vid = cv2.VideoCapture()
        # load selected video
        rtt = self.vid.open(self.vid_path)

        # clear slider
        self.slider.disconnect()

        # seek slider to start
        self.slider.setValue(0)
        self.slider.valueChanged.connect(self.moveSliderToClickedPosition)

        if rtt == False:
            if self.vid_path == "":
                self.statusbar.setStatusTip("No file selected")
            else:
                self.statusbar.setStatusTip("Error: Format not supported")

            # disalbe zoom options
            self.zoom_group.setDisabled(True)

            # clean video from memory
            self.vid = False

            # disable slider
            self.slider.setDisabled(True)

            return
        else:
            self.statusbar.setStatusTip("Ready")

            # set collection
            self.collection = self.db[self.vid_path]

        # seek to start
        self.vid.set(cv2.CAP_PROP_POS_FRAMES, 0)

        # read first frame
        rtt, frame = self.vid.read()

        # extract height and width of video
        self.vid_width, self.vid_height, self.vid_depth = np.shape(frame)
        self.vid_width *= self.zoom
        self.vid_height *= self.zoom

        self.current_frame = frame.copy()

        # resize frame view according to the video's geometery
        self.frame_panel.resize(self.vid_height, self.vid_width)

        # getting current frame number
        self.frame_no = self.vid.get(cv2.CAP_PROP_POS_FRAMES)

        # adding frame no to status tip
        self.statusbar.frame_lable.setText("Frame: {0}".format(
            "%05.0i" % int(self.frame_no)))

        # reset frame to start
        self.resetFrame(self.zoom)

        #enable zoom options
        self.zoom_group.setDisabled(False)

        #enable slider
        self.slider.setDisabled(False)

        # enable algorithmBasedInitialization
        self.init_submenu.setDisabled(False)
        self.export_submenu.setDisabled(False)

        # plot the current frame on canvas
        self.frame_panel.content = frame.copy()
        self.setImageFrame(frame)

        # seek slider to start
        self.moveSliderToPosition(0)

    def setImageFrame(self, frame):

        # load image with markers
        self.frame_panel.loadMarkers()
        self.frame_panel.reDraw()
        self.frame_panel.dragStatus = "Ended"

    def setFrame(self, frame):
        # convert raw frame to QPixmap and set it on frame_panel
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        self.frame_panel.setPixmap(
            QPixmap.fromImage(
                QImage(frame, self.vid_height * self.zoom,
                       self.vid_width * self.zoom,
                       self.vid_height * self.zoom * self.vid_depth,
                       QImage.Format_RGB888)))

    def nextFrame(self):
        # read next frame of video as Image
        rtt, frame = self.vid.read()

        if rtt:

            self.frame_panel.content = frame.copy()
            self.current_frame = frame.copy()

            # check if there is a next frame and convert cv Image to Pixmap
            frame = cv2.resize(frame,
                               None,
                               fx=self.zoom,
                               fy=self.zoom,
                               interpolation=cv2.INTER_CUBIC)

            # initializing markers on frame_panel
            self.frame_panel.markers = []

            # getting current frame number
            self.frame_no = self.vid.get(cv2.CAP_PROP_POS_FRAMES)

            # clear slider
            self.slider.disconnect()

            # seek slider to start
            self.slider.setValue(self.frame_no * 100 /
                                 self.vid.get(cv2.CAP_PROP_FRAME_COUNT))
            self.slider.valueChanged.connect(self.moveSliderToClickedPosition)

            self.setImageFrame(frame)

            #adding frame no to status tip
            self.statusbar.frame_lable.setText("Frame: {0}".format(
                "%05.0i" % int(self.frame_no)))

    def previousFrame(self):
        # set current frame number to 2 frames backward
        self.vid.set(cv2.CAP_PROP_POS_FRAMES,
                     self.vid.get(cv2.CAP_PROP_POS_FRAMES) - 2)
        # get next frame
        self.nextFrame()

    def currentFrame(self):

        self.frame_panel.content = self.current_frame.copy()

        # check if there is a next frame and convert cv Image to Pixmap
        frame = cv2.resize(self.current_frame.copy(),
                           None,
                           fx=self.zoom,
                           fy=self.zoom,
                           interpolation=cv2.INTER_CUBIC)
        self.setImageFrame(frame)

    def keyPressEvent(self, event):

        # don't do anything if no video is selected
        if self.vid == False:
            return

        # Key press event on window
        if type(event) == QKeyEvent and event.key() == Qt.Key_D:

            # navigate forward if D pressed
            self.nextFrame()
        if type(event) == QKeyEvent and event.key() == Qt.Key_A:

            # navigate backward if A pressed
            self.previousFrame()

        if type(event) == QKeyEvent and event.key() == Qt.Key_Plus:

            # zoom in
            self.resetFrame(self.zoom + 1)

        if type(event) == QKeyEvent and event.key() == Qt.Key_Minus:

            # zoom out if zoom factor is greater than 1
            if (self.zoom > 1.0):
                self.resetFrame(self.zoom - 1)

    def moveSliderToClickedPosition(self):

        # enable slider to move with mouse click

        # get click position relative to slider
        click_position = self.slider.mapFromGlobal(QCursor.pos()).x()
        self.moveSliderToPosition(click_position)

    def moveSliderToPosition(self, position):

        # set position of slider to position by setting its value
        slider_completion_ratio = position / self.slider.width()
        self.slider.setValue(slider_completion_ratio * 100)

        # seek video accordingly
        if self.vid:
            self.vid.set(
                cv2.CAP_PROP_POS_FRAMES,
                self.vid.get(cv2.CAP_PROP_FRAME_COUNT) *
                slider_completion_ratio)

            # refresh frame
            self.nextFrame()
Esempio n. 3
0
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.grid_size = GRID_SIZE

        #adjusting main window
        self.resize(TILES_WINDOW_WIDTH, TILES_WINDOW_HEIGHT)
        self.move(0, 0)
        self.setWindowTitle("Trainer")

        #initializing tiles

        self.addTiles(TILE_WIDTH, TILE_HEIGHT)

        #initializing menubar
        self.menubar = QMenuBar(self)

        #adding menu options
        self.grid_menu = QMenu(self.menubar)
        self.grid_menu.setTitle("Grid")

        self.model_menu = QMenu(self.menubar)
        self.model_menu.setTitle("Model")

        self.file_menu = QMenu(self.menubar)
        self.file_menu.setTitle("File")

        #adding file submenu options
        exit = QAction(self)
        exit.setText("Exit")
        exit.setShortcut('Alt+F4')
        exit.triggered.connect(self.exit)
        self.file_menu.addAction(exit)

        #adding grid submenu options
        g3 = QAction(self)
        g3.setText("3 X 3")
        g3.triggered.connect(self.toGrid3)
        g3.setShortcut("3")
        self.grid_menu.addAction(g3)

        g5 = QAction(self)
        g5.setText("5 X 5")
        g5.triggered.connect(self.toGrid5)
        g5.setShortcut("5")
        self.grid_menu.addAction(g5)

        g7 = QAction(self)
        g7.setText("7 X 7")
        g7.triggered.connect(self.toGrid7)
        g7.setShortcut("7")
        self.grid_menu.addAction(g7)

        g9 = QAction(self)
        g9.setText("9 X 9")
        g9.setShortcut("9")
        g9.triggered.connect(self.toGrid9)
        self.grid_menu.addAction(g9)

        #add model submenus
        re_train = QAction(self)
        re_train.setText("Retrain")
        re_train.setShortcut('Ctrl+R')
        re_train.triggered.connect(self.retrain)
        self.model_menu.addAction(re_train)

        #registering menus to menubar
        self.menubar.addAction(self.file_menu.menuAction())
        self.menubar.addAction(self.model_menu.menuAction())
        self.menubar.addAction(self.grid_menu.menuAction())

        #registering menubar
        self.menubar.move(0, 0)
        self.menubar.setDefaultUp(False)
        self.setMenuBar(self.menubar)

        #initializing and registering statusbar
        self.statusbar = QStatusBar(self)
        self.setStatusBar(self.statusbar)

    def retrain(self):
        print("retrain")
        # to be implemented

    def exit(self):
        QCoreApplication.instance().quit()

    def toGrid3(self):
        self.changeGridSize(3)

    def toGrid5(self):
        self.changeGridSize(5)

    def toGrid7(self):
        self.changeGridSize(7)

    def toGrid9(self):
        self.changeGridSize(9)

    def changeGridSize(self, size):
        #change grid size to new size
        self.grid_size = size

        #redraw frames to get new look
        self.drawFrames()

    def addTiles(self, tile_width, tile_height):

        # initializing and registering centeral widget
        self.centeral_widget = QWidget(self)
        self.setCentralWidget(self.centeral_widget)

        #initialize tiles
        self.tiles = []

        #add tiles according to grid size
        for i in range(0, self.grid_size):
            self.tiles.append([])

            for j in range(0, self.grid_size):
                tile = Tile(self.centeral_widget)
                tile.move(TILES_MARGIN_LEFT * (j + 1) + tile_width * j,
                          TILES_MARGIN_TOP * (i + 1) + tile_height * i)
                tile.resize(tile_width, tile_height)
                self.tiles[i].append(tile)

    def drawFrames(self):

        #draw images in frames

        #initial width and height
        width = TILE_WIDTH
        height = TILE_HEIGHT

        if DYNAMIC_WINDOW_SCALING:
            #if dynamic scalling is available resize tiles
            # according to current window size
            window_width = self.centeral_widget.width()
            window_height = self.centeral_widget.height()
            (width, height) = reconfig_tile_geometery(window_width,
                                                      window_height,
                                                      self.grid_size)

        #add tile views for images
        self.addTiles(width, height)

        #read test image
        img = cv2.imread("fish.jpg")

        #resize test image
        img = cv2.resize(img, (width, height))

        #set test image in all tiles
        for i in range(0, self.grid_size):
            for j in range(0, self.grid_size):

                if random.random() < 0.5:
                    self.tiles[i][j].lable = 1
                else:
                    self.tiles[i][j].lable = 0
                self.tiles[i][j].image = img
                self.tiles[i][j].drawImage()

    def resizeEvent(self, event):
        self.drawFrames()
Esempio n. 4
0
class VGenesTextMain(QMainWindow):
    def __init__(self):
        super(VGenesTextMain, self).__init__()
        self.setupUi()

    def setupUi(self):

        self.curFile = ''

        self.textEdit = QTextEdit()
        self.textEdit.setTextInteractionFlags(Qt.TextEditorInteraction)
        self.setCentralWidget(self.textEdit)

        self.createActions()
        self.createMenus()
        self.createToolBars()
        self.createStatusBar()

        self.readSettings()

        self.textEdit.document().contentsChanged.connect(self.documentWasModified)

        self.setCurrentFile('')

    def closeEvent(self, event):
        if self.maybeSave():
            self.writeSettings()
            event.accept()
        else:
            event.ignore()

    def newFile(self):
        if self.maybeSave():
            self.textEdit.clear()
            self.setCurrentFile('')

    def open(self):
        if self.maybeSave():
            fileName, _ = QFileDialog.getOpenFileName(self)
            if fileName:
                self.loadFile(fileName)

    def print_(self):
        document = self.textEdit.document()
        printer = QPrinter()

        dlg = QPrintDialog(printer, self)
        if dlg.exec_() != QDialog.Accepted:
            return

        document.print_(printer)

        self.statusBar().showMessage("Ready", 2000)

    def save(self):
        if self.curFile:
            return self.saveFile(self.curFile)

        return self.saveAs()

    def saveAs(self):
        fileName, _ = QFileDialog.getSaveFileName(self)
        if fileName:
            return self.saveFile(fileName)

        return False

    def IncreaseFont(self):
        FontIs = self.textEdit.currentFont()
        font = QFont(FontIs)

        FontSize = int(font.pointSize())
        FontFam = font.family()
        if FontSize < 36:
            FontSize += 1
        font.setPointSize(FontSize)
        font.setFamily(FontFam)

        self.textEdit.setFont(font)

    def DecreaseFont(self):
        FontIs = self.textEdit.currentFont()
        font = QFont(FontIs)

        FontSize = int(font.pointSize())
        FontFam = font.family()
        if FontSize > 6:
            FontSize -= 1
        font.setPointSize(FontSize)
        font.setFamily(FontFam)

        self.textEdit.setFont(font)

    def about(self):
        QMessageBox.about(self, "About VGenes Text Editor",
                "The <b>VGenes Text Editor</b> allows "
                "you to edit, save, and print documents "
                "generated by VGenes.")

    def documentWasModified(self):
        self.setWindowModified(self.textEdit.document().isModified())

    def createActions(self):
        self.newAct = QAction(QIcon(':/PNG-Icons/page.png'), "&New", self,
                shortcut=QKeySequence.New, statusTip="Create a new file",
                triggered=self.newFile)

        self.openAct = QAction(QIcon(':/PNG-Icons/folder.png'), "&Open...", self,
                shortcut=QKeySequence.Open, statusTip="Open an existing file",
                triggered=self.open)

        self.saveAct = QAction(QIcon(':/PNG-Icons/SaveIcon.png'), "&Save", self,
                shortcut=QKeySequence.Save,
                statusTip="Save the document to disk", triggered=self.save)

        self.saveAsAct = QAction("Save &As...", self,
                shortcut=QKeySequence.SaveAs,
                statusTip="Save the document under a new name",
                triggered=self.saveAs)

        self.closeAct = QAction("Close", self, shortcut=QKeySequence.Close,
                statusTip="Close window", triggered=self.close)

        self.exitAct = QAction("E&xit", self, shortcut="Ctrl+Q",
                statusTip="Exit VGenes Text Editor", triggered=self.close)



        self.cutAct = QAction(QIcon(':/PNG-Icons/scissor.png'), "Cu&t", self,
                shortcut=QKeySequence.Cut,
                statusTip="Cut the current selection's contents to the clipboard",
                triggered=self.textEdit.cut)

        self.IncreaseAct = QAction(QIcon(':/PNG-Icons/plus.png'), "&Increase", self,
                statusTip="Increase font size",
                triggered=self.IncreaseFont)

        self.DecreaseAct = QAction(QIcon(':/PNG-Icons/minus.png'), "&Decrease", self,
                statusTip="Decrease font size",
                triggered=self.DecreaseFont)

        self.printAct = QAction(QIcon(':/PNG-Icons/print.png'), "&Print...", self,
                shortcut=QKeySequence.Print,
                statusTip="Print the current form letter",
                triggered=self.print_)

        self.copyAct = QAction(QIcon(':/PNG-Icons/pages.png'), "&Copy", self,
                shortcut=QKeySequence.Copy,
                statusTip="Copy the current selection's contents to the clipboard",
                triggered=self.textEdit.copy)

        self.pasteAct = QAction(QIcon(':/PNG-Icons/Paste.png'), "&Paste", self,
                shortcut=QKeySequence.Paste,
                statusTip="Paste the clipboard's contents into the current selection",
                triggered=self.textEdit.paste)

        self.aboutAct = QAction("&About", self,
                statusTip="Show the application's About box",
                triggered=self.about)

        # self.aboutQtAct = QAction("About &Qt", self,
        #         statusTip="Show the Qt library's About box",
        #         triggered=QApplication.instance().aboutQt)

        self.cutAct.setEnabled(False)
        self.copyAct.setEnabled(False)
        self.textEdit.copyAvailable.connect(self.cutAct.setEnabled)
        self.textEdit.copyAvailable.connect(self.copyAct.setEnabled)

    def createMenus(self):

        self.menubar = QMenuBar(self)
        self.menubar.setGeometry(QRect(0, 0, 1029, 22))
        self.menubar.setDefaultUp(False)
        self.menubar.setNativeMenuBar(False)
        self.menubar.setObjectName("menubar")
        self.menuFile = QMenu(self.menubar)


        self.setMenuBar(self.menubar)



        self.fileMenu = self.menuBar().addMenu("&File")
        self.fileMenu.addAction(self.newAct)
        self.fileMenu.addAction(self.openAct)
        self.fileMenu.addAction(self.closeAct)
        self.fileMenu.addAction(self.saveAct)
        self.fileMenu.addAction(self.saveAsAct)
        self.fileMenu.addAction(self.printAct)
        self.fileMenu.addSeparator();
        self.fileMenu.addAction(self.exitAct)

        self.editMenu = self.menuBar().addMenu("&Edit")
        self.editMenu.addAction(self.cutAct)
        self.editMenu.addAction(self.copyAct)
        self.editMenu.addAction(self.pasteAct)

        self.menuBar().addSeparator()

        self.helpMenu = self.menuBar().addMenu("&Help")
        self.helpMenu.addAction(self.aboutAct)
        # self.helpMenu.addAction(self.aboutQtAct)

    def createToolBars(self):
        self.fileToolBar = self.addToolBar("File")
        self.fileToolBar.addAction(self.newAct)
        self.fileToolBar.addAction(self.openAct)
        self.fileToolBar.addAction(self.closeACT)
        self.fileToolBar.addAction(self.saveAct)
        self.fileMenu.addAction(self.saveAsAct)
        self.fileToolBar.addAction(self.printAct)

        self.editToolBar = self.addToolBar("Edit")
        self.editToolBar.addAction(self.cutAct)
        self.editToolBar.addAction(self.copyAct)
        self.editToolBar.addAction(self.pasteAct)

        self.FontSizeToolBar = self.addToolBar("FontSize")
        self.FontSizeToolBar.addAction(self.IncreaseAct)
        self.FontSizeToolBar.addAction(self.DecreaseAct)


    def createStatusBar(self):
        self.statusBar().showMessage("Ready")

    def readSettings(self):
        settings = QSettings("Trolltech", "VGenes Text Editor")
        pos = settings.value("pos", QPoint(200, 200))
        size = settings.value("size", QSize(400, 400))
        self.resize(size)
        self.move(pos)

    def writeSettings(self):
        settings = QSettings("Trolltech", "VGenes Text Editor")
        settings.setValue("pos", self.pos())
        settings.setValue("size", self.size())

    def maybeSave(self):
        if self.textEdit.document().isModified():
            ret = QMessageBox.warning(self, "VGenes Text Editor",
                    "The document has been modified.\nDo you want to save "
                    "your changes?",
                    QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel)

            if ret == QMessageBox.Save:
                return self.save()

            if ret == QMessageBox.Cancel:
                return False

        return True

    def loadFile(self, fileName):
        file = QFile(fileName)
        if not file.open(QFile.ReadOnly | QFile.Text):
            QMessageBox.warning(self, "VGenes Text Editor",
                    "Cannot read file %s:\n%s." % (fileName, file.errorString()))
            return

        inf = QTextStream(file)
        QApplication.setOverrideCursor(Qt.WaitCursor)
        self.textEdit.setPlainText(inf.readAll())
        QApplication.restoreOverrideCursor()

        self.setCurrentFile(fileName)
        self.statusBar().showMessage("File loaded", 2000)

    def saveFile(self, fileName):
        file = QFile(fileName)
        if not file.open(QFile.WriteOnly | QFile.Text):
            QMessageBox.warning(self, "VGenes Text Editor",
                    "Cannot write file %s:\n%s." % (fileName, file.errorString()))
            return False

        outf = QTextStream(file)
        QApplication.setOverrideCursor(Qt.WaitCursor)
        outf << self.textEdit.toPlainText()
        QApplication.restoreOverrideCursor()

        self.setCurrentFile(fileName);
        self.statusBar().showMessage("File saved", 2000)
        return True

    def setCurrentFile(self, fileName):
        self.curFile = fileName
        self.textEdit.document().setModified(False)
        self.setWindowModified(False)

        if self.curFile:
            shownName = self.strippedName(self.curFile)
        else:
            shownName = 'untitled.txt'

        self.setWindowTitle("%s[*] - VGenes Text Editor" % shownName)

    def strippedName(self, fullFileName):
        return QFileInfo(fullFileName).fileName()