Ejemplo n.º 1
0
class ImageHandlerApp(QMainWindow, Ui_ImageViewer):
    def __init__(self):
        # Explaining super is out of the scope of this article
        # So please google it if you're not familar with it
        # Simple reason why we use it here is that it allows us to
        # access variables, methods etc in the design.py file
        super().__init__()
        self.setupUi(self)  # This is defined in design.py file automatically

        fh = logging.FileHandler('log.log')  # create File Logger
        ch = logging.StreamHandler()  # create Stream Logger
        gh = GuiLogger(self.textBrowser_Logging)  # create GUI Logger
        formatter = logging.Formatter(
            '[%(asctime)s][%(levelname)s] %(message)s')
        fh.setFormatter(formatter)
        ch.setFormatter(formatter)
        gh.setFormatter(formatter)
        logging.getLogger().addHandler(fh)
        logging.getLogger().addHandler(ch)
        logging.getLogger().addHandler(gh)
        logging.getLogger().setLevel(logging.DEBUG)

        self.model = QStandardItemModel(self.listView_listImages)
        self.currentImage = None

        self.listView_listImages.doubleClicked.connect(self.on_item_changed)
        self.actionDetect_Seeds.triggered["bool"].connect(self.detectSeeds)
        self.actionClassify_Seeds.triggered["bool"].connect(self.classifySeeds)
        self.pushButton_addImages.clicked["bool"].connect(self.addImages)
        self.pushButton_removeImage.clicked["bool"].connect(
            self.removeCurrentImage)
        self.pushButton_addFolder.clicked["bool"].connect(self.addFolder)
        self.pushButton_removeAllImages.clicked["bool"].connect(
            self.removeAllImages)

    def openImage(self, trigger=False, fileName=None):
        try:
            if fileName is None:
                fileName, _ = QFileDialog.getOpenFileName(
                    self, "Open Image", "", "Image Files (*.png *.jpg *.bmp)")
            if fileName is None or fileName is "":
                return

            self.currentImage = Image(path=fileName)
            self.showImage(self.currentImage)
        except:
            error = str(sys.exc_info()[0])
            function = str(inspect.stack()[0][3])
            logging.error(f"Exception caught on {function}: {error}")

        return

    def addImage(self, trigger=False, fileName=None):
        try:
            if fileName is None:
                fileName, _ = QFileDialog.getOpenFileName(
                    self, "Open Image", "", "Image Files (*.png *.jpg *.bmp)")
            if fileName is None or fileName is "":
                return

            self.model.appendRow(Image(path=fileName))
            self.listView_listImages.setModel(self.model)
        except:
            error = str(sys.exc_info()[0])
            function = str(inspect.stack()[0][3])
            logging.error(f"Exception caught on {function}: {error}")

        return

    def addImages(self, trigger=False, fileNames=None):
        try:
            if fileNames is None:
                fileNames, _ = QFileDialog.getOpenFileNames(
                    self, "Open Image", "", "Image Files (*.png *.jpg *.bmp)")
            if fileNames is []:
                return

            for fileName in fileNames:
                self.addImage(fileName=fileName)
        except:
            error = str(sys.exc_info()[0])
            function = str(inspect.stack()[0][3])
            logging.error(f"Exception caught on {function}: {error}")

        return

    def addFolder(self, trigger=False, folder=None):
        try:
            if folder is None:
                folder = QFileDialog.getExistingDirectory(
                    self, "Select Folder", "")
            if folder is "":
                return
            valid_images = [".jpg", ".gif", ".png", ".tga"]
            for f in os.listdir(folder):
                ext = os.path.splitext(f)[1]
                if ext.lower() not in valid_images:
                    continue

                self.addImage(fileName=os.path.join(folder, f))
        except:
            error = str(sys.exc_info()[0])
            function = str(inspect.stack()[0][3])
            logging.error(f"Exception caught on {function}: {error}")

        return

    def removeCurrentImage(self, trigger=False):
        try:
            # for item in model.findItems('something'):
            if (self.currentImage is None):
                logging.error("Select an image to remove.")
                return
            self.model.removeRow(self.currentImage.row())
            self.listView_listImages.setModel(self.model)
            self.showImage()
        except:
            error = str(sys.exc_info()[0])
            function = str(inspect.stack()[0][3])
            logging.error(f"Exception caught on {function}: {error}")

    def removeAllImages(self, trigger=False):
        try:
            print(self.model.rowCount())
            self.model.removeRows(0, self.model.rowCount())
            self.listView_listImages.setModel(self.model)
            self.showImage()
        except:
            error = str(sys.exc_info()[0])
            function = str(inspect.stack()[0][3])
            logging.error(f"Exception caught on {function}: {error}")

    def on_item_changed(self, index):
        try:
            print("on_item_changed")
            self.currentImage = self.model.itemFromIndex(index)
            self.showImage(self.currentImage)
        except:
            error = str(sys.exc_info()[0])
            function = str(inspect.stack()[0][3])
            logging.error(f"Exception caught on {function}: {error}")

        return

    def detectSeeds(self):
        try:
            if (self.currentImage is None):
                logging.error("Select an image first.")
                return
            resultimage, good_cnt = detectSeeds(self.currentImage.CV)
            self.showImage(Image(cv_img=resultimage))
        except:
            error = str(sys.exc_info()[0])
            function = str(inspect.stack()[0][3])
            logging.error(f"Exception caught on {function}: {error}")

        return

    def classifySeeds(self):
        try:
            if (self.currentImage is None):
                logging.error("Select an image first.")
                return
            resultimage = classifySeeds(self.currentImage.CV)
            self.showImage(Image(cv_img=resultimage))
        except:
            error = str(sys.exc_info()[0])
            function = str(inspect.stack()[0][3])
            logging.error(f"Exception caught on {function}: {error}")

        return

    def showImage(self, Image=None):
        try:
            if Image is None:
                self.currentImage = None
                self.label.setText("Image")
                return

            pixmap01 = QPixmap.fromImage(Image.QT)
            pixmap_image = QPixmap(pixmap01)
            self.label.setPixmap(pixmap_image)
            self.label.setAlignment(QtCore.Qt.AlignCenter)
            self.label.setScaledContents(True)
            self.label.setMinimumSize(100, 100)
        except:
            error = str(sys.exc_info()[0])
            function = str(inspect.stack()[0][3])
            logging.error(f"Exception caught on {function}: {error}")

        return