예제 #1
0
class ImageMediaView(MediaView):
    def __init__(self, media, parent):
        super(ImageMediaView, self).__init__(media, parent)
        self.widget = QLabel(parent)
        self.widget.setGeometry(media['geometry'])
        self.img = QImage()
        self.set_default_widget_prop()

    @Slot()
    def play(self):
        self.finished = 0
        path = '%s/%s' % (self.save_dir, self.options['uri'])
        rect = self.widget.geometry()
        self.img.load(path)
        self.img = self.img.scaled(rect.width(), rect.height(),
                                   Qt.IgnoreAspectRatio,
                                   Qt.SmoothTransformation)
        self.widget.setPixmap(QPixmap.fromImage(self.img))
        self.widget.show()
        self.widget.raise_()
        if float(self.duration) > 0:
            self.play_timer.setInterval(int(float(self.duration) * 1000))
            self.play_timer.start()
        self.started_signal.emit()

    @Slot()
    def stop(self, delete_widget=False):
        #---- kong ----
        if not self.widget:
            return False
        del self.img
        self.img = QImage()
        #----
        super(ImageMediaView, self).stop(delete_widget)
        return True
예제 #2
0
파일: view.py 프로젝트: nitrotm/2dtagger
    def run(self):
        image = QImage()
        image.load(str(self.filename))

        mask = QImage(image.size(), QImage.Format_RGB32)
        mask.fill(Qt.black)

        maskfile = self.filename.parent / (self.filename.stem + ".mask")
        if maskfile.exists():
            bitmap = QImage(str(maskfile))
            if bitmap.size() != image.size():
                raise Exception("Mask %s doesn't match image size" % maskfile)
            mask.fill(QColor.fromRgbF(1.0, 0.0, 1.0))
            p = QPainter(mask)
            p.setCompositionMode(QPainter.CompositionMode_Multiply)
            p.drawImage(mask.rect(), bitmap)
            p.end()

        self.view.imagefile = self.filename
        self.view.image = image
        self.view.mask = mask
        self.view.maskfile = maskfile

        self.view.path = list()
        self.view.changed = False
        self.view.update()
예제 #3
0
파일: lightmap.py 프로젝트: SanPen/QtMap
    def handle_network_data(self, reply: QNetworkReply):
        """
        This function is called automatically by a QNetworkAccessManager object (self._manager)
        :param reply: QNetworkReply instance
        :return: Nothing
        """
        img = QImage()

        tp = Point(reply.request().attribute(QNetworkRequest.User))

        url = reply.url()

        if not reply.error():  # if there was no url error...
            if img.load(reply, None):  # if the image loading went well...
                self._tile_pixmaps[tp] = QPixmap.fromImage(
                    img)  # store the image in the tiles dictionary

        reply.deleteLater()

        self.updated.emit(self.tile_rectangle(tp))

        # purge unused tiles
        bound = self._tiles_rectangle.adjusted(-2, -2, 2, 2)
        for tp in list(self._tile_pixmaps.keys()):
            if not bound.contains(tp):
                del self._tile_pixmaps[tp]
        self.download()
    def openImage(self, fileName):
        loadedImage = QImage()
        if not loadedImage.load(fileName):
            return False

        newSize = loadedImage.size().expandedTo(self.size())
        self.resizeImage(loadedImage, newSize)
        self.image = loadedImage
        self.modified = False
        self.update()
        return True
예제 #5
0
    def saveYoloFormat(self,
                       filename,
                       shapes,
                       imagePath,
                       imageData,
                       classList,
                       lineColor=None,
                       fillColor=None,
                       databaseSrc=None):
        imgFolderPath = os.path.dirname(imagePath)
        imgFolderName = os.path.split(imgFolderPath)[-1]
        imgFileName = os.path.basename(imagePath)
        #imgFileNameWithoutExt = os.path.splitext(imgFileName)[0]
        # Read from file path because self.imageData might be empty if saving to
        # Pascal format
        image = QImage()
        image.load(imagePath)
        imageShape = [
            image.height(),
            image.width(), 1 if image.isGrayscale() else 3
        ]
        writer = YOLOWriter(imgFolderName,
                            imgFileName,
                            imageShape,
                            localImgPath=imagePath)
        writer.verified = self.verified

        for shape in shapes:
            points = shape['points']
            label = shape['label']
            # Add Chris
            difficult = int(shape['difficult'])
            bndbox = LabelFile.convertPoints2BndBox(points)
            writer.addBndBox(bndbox[0], bndbox[1], bndbox[2], bndbox[3], label,
                             difficult)

        writer.save(targetFile=filename, classList=classList)
        return
예제 #6
0
    def handleNetworkData(self, reply):
        img = QImage()
        tp = Point(reply.request().attribute(QNetworkRequest.User))
        url = reply.url()
        if not reply.error():
            if img.load(reply, None):
                self._tilePixmaps[tp] = QPixmap.fromImage(img)
        reply.deleteLater()
        self.updated.emit(self.tileRect(tp))

        # purge unused tiles
        bound = self._tilesRect.adjusted(-2, -2, 2, 2)
        for tp in list(self._tilePixmaps.keys()):
            if not bound.contains(tp):
                del self._tilePixmaps[tp]
        self.download()
예제 #7
0
    def readImage(self, filename, sbimage):
        image = QImage()
        if (image.load(filename.getString())):
            # Keep in 8-bits mode if that was what we read
            if (image.depth() == 8 and image.isGrayscale()):
                c = 1
            else:
                # FIXME: consider if we should detect allGrayscale() and alpha (c = 2)
                c = 3
                if image.hasAlphaChannel():
                    c = 4
                    image.convertToFormat(QImage.Format_ARGB32)
                else:
                    image.convertToFormat(QImage.Format_RGB32)

                # FIXME 20080508 jkg: implement when pivy is ready
                #sbimage.setValue(SbVec2s(image.width(), image.height()), c, None)

                return True
        return False
예제 #8
0
class GalleryMiniature(QDialog):
    def __init__(self, pid=0, filename=0):
        super().__init__()
        #self.resize(800,600)
        self.pid = pid
        #print(filename)
        self.filename = filename
        layout = QHBoxLayout()
        self.baseLabel = MovableLabel()
        self.baseLabel.setFrameShape(QFrame.StyledPanel)
        self.baseLabel.setAlignment(Qt.AlignCenter)
        self.baseLabel.getRectCoords.connect(self.getRectCoordsSlot)
        self.miniLabel = QLabel()
        self.miniLabel.setAlignment(Qt.AlignCenter)
        self.base_image = QImage()
        self.mini_image = QImage()
        self.base_image_scaled = 0
        #self.filename = 0
        self.pix = 0
        self.currentIndex = 0
        self.real_size = 0

        layout.addWidget(self.baseLabel)
        layout.addWidget(self.miniLabel)

        def openMenu(position):
            menu = QMenu()
            openAction = menu.addAction('Открыть')
            saveAction = menu.addAction('Сохранить')
            menu.addSeparator()
            nextAction = menu.addAction('Следующий')
            menu.addSeparator()
            quitAction = menu.addAction('Выход')
            action = menu.exec_(self.mapToGlobal(position))

            if action == openAction:
                fileName = QFileDialog.getOpenFileName(
                    self, "Изображение", "photos",
                    "Фото (*.png *.jpg *.bmp *.JPG)")
                if len(fileName) > 1:
                    self.filename = fileName[0]
                    self.show_images()

            if action == saveAction:
                if self.filename:
                    print('os.path.basename(self.filename)')
                    path = os.path.basename(self.filename)
                    root_ext = os.path.splitext(path)
                    print(root_ext)
                    if self.pid:
                        root_ext = [str(pid) + '_001']
                    minifile = os.path.join(
                        os.path.join('photos', 'miniatures'),
                        root_ext[0] + '.png')
                    if self.pix:
                        self.pix.save(minifile, "PNG")
                        print(minifile)

            if action == nextAction:
                if self.base_image:
                    self.get_face_image()

            if action == quitAction:
                self.close()

        self.setContextMenuPolicy(Qt.CustomContextMenu)
        self.customContextMenuRequested.connect(openMenu)

        self.setLayout(layout)

        if self.filename:
            self.show_images()
        else:
            screen = QGuiApplication.primaryScreen()
            screenSize = screen.availableSize()
            sy = int((screenSize.height() - 20) / 4)
            sx = int((screenSize.width() - 20) / 4)
            self.setGeometry(sx, sy, int(screenSize.width() / 4),
                             int(screenSize.height() / 4))

    def show_images(self):
        #print(self.filename)
        self.base_image.load(self.filename)
        self.real_size = (self.base_image.width(), self.base_image.height())
        screen = QGuiApplication.primaryScreen()
        screenSize = screen.availableSize()
        sy = int((screenSize.height() - 20) / 2)
        sx = int((screenSize.width() - 20) / 2)
        if not self.base_image_scaled:
            self.base_image_scaled = self.base_image.scaled(
                sx, sy, Qt.KeepAspectRatio)
            self.setGeometry(sx - int(self.base_image_scaled.width()),
                             sy - int(self.base_image_scaled.height() / 2),
                             self.base_image_scaled.width() * 2,
                             self.base_image_scaled.height())
        else:
            self.base_image_scaled = self.base_image.scaled(
                int(self.base_image_scaled.width()),
                int(self.base_image_scaled.height()), Qt.KeepAspectRatio)
            self.setGeometry(sx - int(self.base_image_scaled.width()),
                             sy - int(self.base_image_scaled.height() / 2),
                             self.base_image_scaled.width() * 2,
                             self.base_image_scaled.height())
        self.baseLabel.setPixmap(QPixmap.fromImage(self.base_image_scaled))
        #self.miniLabel.setPixmap(QPixmap.fromImage(self.base_image))
        self.get_face_image()

    def getRectCoordsSlot(self, coords):
        print(coords)
        if self.base_image:
            self.get_face_image(coords)

    def get_round_miniature(self, image):
        size = (300, 300)
        img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        im = Image.fromarray(img)
        #im = image #Image.open(image.png)
        im = crop(im, size)
        im.putalpha(prepare_mask(size, 4))
        #im.save(filename)
        qim = ImageQt(im)
        self.pix = QPixmap.fromImage(qim)
        self.miniLabel.setPixmap(self.pix)
        #self.miniature = QImage(filename)

    def get_face_image(self, coords=0):
        with open(self.filename, 'rb') as f:
            chunk = f.read()
            chunk_arr = np.frombuffer(chunk, dtype=np.uint8)
        image = cv2.imdecode(chunk_arr, cv2.IMREAD_COLOR)
        if coords == 0:
            print(self.filename)

            #image = cv2.imread(self.filename)
            # !!!!!!!!!!!! Обязательно указать правильный путь к файлу !!!!!!!!!!!!
            # !!!!!!!!!!!! Путь до xml есть в https://github.com/opencv/opencv/tree/master/data/haarcascades !!!!!!!!!!!!
            face_cascade = cv2.CascadeClassifier(
                os.path.join('xml', 'haarcascade_frontalface_default.xml'))
            # !!!!!!!!!!!! Необходимо настроить параметры так как находит не все лица !!!!!!!!!!!!
            faces_coord = face_cascade.detectMultiScale(image,
                                                        scaleFactor=1.2,
                                                        minNeighbors=5,
                                                        minSize=(110, 110))

            if (len(faces_coord) > 0):
                for i, face in enumerate(faces_coord):
                    (x, y, w, h) = face
                    height, width, channels = image.shape
                    s = int(min(width * 0.1, height * 0.1))
                    if y - s >= 0:
                        y = y - s
                        h = h + s
                    if x - s >= 0:
                        x = x - s
                        w = w + s
                    h = h + s if y + h + s < height else h
                    w = w + s if x + w + s < width else w
                    if i == self.currentIndex:
                        crop_image = image[y:y + h, x:x + w]
                        #cv2.imshow("Face", crop_image)
                        self.get_round_miniature(crop_image)
                        break
                    #cv2.waitKey(0)
                #crop_image.save()
            self.currentIndex = 0 if self.currentIndex + 1 >= len(
                faces_coord) else self.currentIndex + 1
        else:
            if self.real_size:
                #image = cv2.imread(self.filename)
                #x_scale =  self.base_image.width() /  self.base_image_scaled.width()
                #y_scale = self.base_image.height() / self.base_image_scaled.height()
                x_scale = self.base_image.width(
                ) * self.base_image_scaled.width() / (
                    self.base_image_scaled.width() * self.baseLabel.width())
                y_scale = self.base_image.height(
                ) * self.base_image_scaled.height() / (
                    self.base_image_scaled.height() * self.baseLabel.height())
                print(
                    (int(coords[0][1] * y_scale), int(coords[1][1] * y_scale),
                     int(coords[0][0] * x_scale), int(coords[1][0] * x_scale)))
                crop_image = image[int(coords[0][1] *
                                       y_scale):int(coords[1][1] * y_scale),
                                   int(coords[0][0] *
                                       x_scale):int(coords[1][0] * x_scale)]
                self.get_round_miniature(crop_image)
예제 #9
0
class MyGui(QWidget):
    def __init__(self):
        super(MyGui, self).__init__()
        dw = QDesktopWidget()
        self.setFixedSize(dw.width() * 1, dw.height() * 0.9)
        self.setWindowTitle("Neuro Soph - Image Registration")
        self.height = 700
        self.width = 420

        btn_selectMV = QPushButton("Select Moving Image")

        # btn_selectMV.setText("Select Moving Image")
        btn_selectMV.clicked.connect(self.selectMovingImage)

        # elf.btn_selectT = QToolButton(self)
        btn_selectT = QPushButton("Select Fixed Image")
        # btn_selectT.setText("Select Fixed Image")
        btn_selectT.clicked.connect(self.selectFixedImage)
        self.filenameFixed = ''  #''/Users/aminoo/Documents/Work/ImageRegistration/templates/Template_P01.png'
        self.filenameMoving = ''  #/Users/aminoo/Documents/Work/ImageRegistration/Data/Small_053/Page1/P01_Images/P01_00013_E__IM001.png'
        ###images
        self.coderun = False
        self.x = -1
        self.y = -1

        TextF = QLabel('Fixed Image')
        TextM = QLabel('Moving Image')
        TextR = QLabel('Result Image')
        self.fixedImageLB = QLabel()
        self.fixedImageLB.setScaledContents(False)
        self.fixedImageLB.setAlignment(Qt.AlignTop | Qt.AlignLeft)
        #self.fixedImageLB.ad

        self.movingImageLB = QLabel()
        self.movingImageLB.setScaledContents(False)

        self.resultLB = QLabel()
        self.resultLB.setScaledContents(False)
        self.resultQI = QImage()
        self.fixedImageQI = QImage()
        self.movingImageQI = QImage()
        self.scrollf = QScrollArea()
        self.scrollf.setWidget(self.fixedImageLB)
        self.scrollf.setVisible(True)
        self.scrollf.setWidgetResizable(True)
        self.scrollf.setFixedHeight(self.height)
        self.scrollf.setFixedWidth(self.width)

        self.scrollr = QScrollArea()
        self.scrollr.setWidget(self.resultLB)
        self.scrollr.setVisible(True)
        self.scrollr.setWidgetResizable(True)
        self.scrollr.setFixedHeight(self.height)
        self.scrollr.setFixedWidth(self.width)

        self.scrollm = QScrollArea()
        self.scrollm.setWidget(self.movingImageLB)
        self.scrollm.setVisible(True)
        self.scrollm.setWidgetResizable(True)
        self.scrollm.setFixedHeight(self.height)
        self.scrollm.setFixedWidth(self.width)

        self.PAGE_DPI = 150

        #Right Click
        self.setContextMenuPolicy(Qt.ActionsContextMenu)

        self.addMenuActions()
        # self.init_page()
        ####
        self.textscore_AKA = QLabel()
        self.textscore_SIF = QLabel()
        button1 = QPushButton("AKAZE")
        button3 = QPushButton("RegisterAgain")
        button2 = QPushButton("SIFT")
        # button4 = QPushButton("Four")
        # button5 = QPushButton("Five")

        button1.clicked.connect(self.AKAZERegistration)
        button3.clicked.connect(self.try_registeragain)
        button2.clicked.connect(self.SIFTRegistration)
        mainhbox = QHBoxLayout()

        lFvbox = QVBoxLayout()
        lFvbox.addWidget(TextF)
        lFvbox.addWidget(self.scrollf)

        lMvbox = QVBoxLayout()
        lMvbox.addWidget(TextM)
        lMvbox.addWidget(self.scrollm)

        lRvbox = QVBoxLayout()
        lRvbox.addWidget(TextR)
        lRvbox.addWidget(self.scrollr)

        imagehbox = QHBoxLayout()
        imagehbox.addLayout(lFvbox)
        imagehbox.addLayout(lMvbox)
        imagehbox.addLayout(lRvbox)

        layout = QVBoxLayout()
        layout.addStretch(1)
        layout.addWidget(self.textscore_AKA)
        layout.addWidget(self.textscore_SIF)
        layout.addWidget(button1)
        layout.addWidget(button2)
        layout.addWidget(button3)

        # layout.addWidget(button4)
        # layout.addWidget(button5)

        # mainhbox.addWidget(RightClickMenuButton("Test Btn"))
        mainhbox.addLayout(layout)
        mainhbox.addLayout(imagehbox)

        hbox = QHBoxLayout()
        hbox.addStretch(1)
        hbox.addWidget(btn_selectT)
        hbox.addWidget(btn_selectMV)

        mainvbox = QVBoxLayout()
        mainvbox.addStretch(1)
        mainvbox.addLayout(mainhbox)
        mainvbox.addLayout(hbox)

        self.setLayout(mainvbox)

        self.show()

    def addMenuActions(self):
        menu = QMenu(self)
        delete = QAction(self)
        delete.setText("Remove")
        delete.triggered.connect(self.removeFeature)

        insert = QAction(self)
        insert.setText("Insert")
        insert.triggered.connect(self.insertFeature)

        cancel = QAction(self)
        cancel.setText("Cancel")
        cancel.triggered.connect(self.cancel)
        self.addAction(delete)
        self.addAction(insert)
        self.addAction(cancel)

    def removeFeature(self):

        if (self.x != -1 and self.y != -1):
            print(self.x, self.y)

            p1 = QPoint()
            p1.setX(self.x)  # point.pt[0]
            p1.setY(self.y)  # point.pt[1]

            self.selectedF = False

            if self.x <= self.scrollf.x(
            ) + self.width and self.x >= self.scrollf.x(
            ) and self.y <= self.scrollf.y(
            ) + self.height and self.y >= self.scrollf.y():

                rv = self.mapToGlobal(p1)
                self.newp = self.fixedImageLB.mapFromGlobal(rv)
                print("selected ", self.newp.x(), self.newp.y())
                print('firstkeyf ', len(self.keypoints[0]))
                cv2.circle(self.imgff,
                           (int(self.newp.x()), int(self.newp.y())), 5,
                           (0, 0, 0), -1)

                height, width, channel = self.imgff.shape
                bytesPerLine = 3 * width
                qImg = QImage(self.imgff, width, height, bytesPerLine,
                              QImage.Format_RGB888)
                self.fixedImageQI = qImg
                pixMapf = QPixmap.fromImage(self.fixedImageQI)
                self.fixedImageLB.setPixmap(pixMapf)
                newk = []
                for point in self.keypoints[0]:
                    if (int(point.pt[0]) <= int(self.newp.x()) + 2
                            and int(point.pt[0]) >= int(self.newp.x()) - 2):
                        if (int(point.pt[1]) <= int(self.newp.y()) + 2 and
                                int(point.pt[1]) >= int(self.newp.y()) - 2):
                            print('yes')
                            self.selectedF = True
                        else:
                            newk.append(point)
                    else:
                        newk.append(point)
                if self.selectedF:
                    self.keypoints[0] = newk
            elif self.x <= self.scrollm.x(
            ) + self.width and self.x >= self.scrollm.x(
            ) and self.y <= self.scrollm.y(
            ) + self.height and self.y >= self.scrollm.y():
                self.selectedM = False
                rvm = self.mapToGlobal(p1)
                self.newpm = self.movingImageLB.mapFromGlobal(rvm)
                print("selected ", self.newpm.x(), self.newpm.y())
                print('firstkeym ', len(self.keypointsM))
                cv2.circle(self.imgmm,
                           (int(self.newpm.x()), int(self.newpm.y())), 5,
                           (0, 0, 0), -1)

                height, width, channel = self.imgmm.shape
                bytesPerLine = 3 * width
                qImg = QImage(self.imgmm, width, height, bytesPerLine,
                              QImage.Format_RGB888)
                self.movingImageQI = qImg
                pixMapm = QPixmap.fromImage(self.movingImageQI)
                self.movingImageLB.setPixmap(pixMapm)
                newmk = []
                for pointm in self.keypointsM:
                    if (int(pointm.pt[0]) <= int(self.newpm.x()) + 2
                            and int(pointm.pt[0]) >= int(self.newpm.x()) - 2):
                        if (int(pointm.pt[1]) <= int(self.newpm.y()) + 2 and
                                int(pointm.pt[1]) >= int(self.newpm.y()) - 2):
                            print('yes')  # remove this point
                            self.selectedM = True
                        else:
                            newmk.append(pointm)
                    else:
                        newmk.append(pointm)
                if self.selectedM:
                    self.keypointsM = newmk
                print('keym', len(self.keypointsM), len(self.descriptorsM))

    def insertFeature(self):
        if (self.x != -1 and self.y != -1):
            print(self.x, self.y)
            p1 = QPoint()
            p1.setX(self.x)
            p1.setY(self.y)

            if self.x <= self.scrollf.x(
            ) + self.width and self.x >= self.scrollf.x(
            ) and self.y <= self.scrollf.y(
            ) + self.height and self.y >= self.scrollf.y():
                rv = self.mapToGlobal(p1)
                self.newp = self.fixedImageLB.mapFromGlobal(rv)
                print("selected ", self.newp.x(), self.newp.y())
                print('firstkeyf ', len(self.keypoints[0]))
                cv2.circle(self.imgff,
                           (int(self.newp.x()), int(self.newp.y())), 5,
                           (0, 0, 0), -1)

                height, width, channel = self.imgff.shape
                bytesPerLine = 3 * width
                qImg = QImage(self.imgff, width, height, bytesPerLine,
                              QImage.Format_RGB888)
                self.fixedImageQI = qImg
                pixMapf = QPixmap.fromImage(self.fixedImageQI)
                self.fixedImageLB.setPixmap(pixMapf)
                newpf = QPoint()
                newpf.setX(self.newp.x())
                newpf.setY(self.newp.y())
                # newifk=[]
                # for pointm in self.keypoints[0]:
                #     newifk.append(pointm)
                # newifk.append(newpf)
                self.keypoints[0].append(
                    cv2.KeyPoint(self.newp.x(), self.newp.y(), 5, _class_id=0))

            elif self.x <= self.scrollm.x(
            ) + self.width and self.x >= self.scrollm.x(
            ) and self.y <= self.scrollm.y(
            ) + self.height and self.y >= self.scrollm.y():
                rvm = self.mapToGlobal(p1)
                self.newpm = self.movingImageLB.mapFromGlobal(rvm)
                print("selected ", self.newpm.x(), self.newpm.y())
                print('firstkeym ', len(self.keypointsM))
                cv2.circle(self.imgmm,
                           (int(self.newpm.x()), int(self.newpm.y())), 5,
                           (0, 0, 0), -1)

                height, width, channel = self.imgmm.shape
                bytesPerLine = 3 * width
                qImg = QImage(self.imgmm, width, height, bytesPerLine,
                              QImage.Format_RGB888)
                self.movingImageQI = qImg
                pixMapm = QPixmap.fromImage(self.movingImageQI)
                self.movingImageLB.setPixmap(pixMapm)

                # newpm = QPoint()
                # newpm.setX(self.newpm.x())
                # newpm.setY(self.newpm.y())

                self.keypointsM.append(
                    cv2.KeyPoint(self.newpm.x(),
                                 self.newpm.y(),
                                 5,
                                 _class_id=0))
                print('s')

    def cancel(self):
        pass

    # def addMenuActions(self):
    #     delete = QAction(self)
    #     delete.setText("remove")
    #     delete.triggered.connect(self.removeButton)
    #     self.addAction(delete)
    #
    # def removeButton(self):
    #     self.deleteLater()
    def mousePressEvent(self, QMouseEvent):
        # print mouse position
        self.x = QMouseEvent.x()
        self.y = QMouseEvent.y()

        # print(self.x,self.y)

    def init_page(self):

        self.fixedImageQI.load(
            self.filenameFixed
        )  #'/Users/aminoo/Neurosoph/Images/init_image.png')
        self.imf = cv2.imread(self.filenameFixed, flags=0)

        self.movingImageQI.load(
            self.filenameMoving
        )  #'/Users/aminoo/Neurosoph/Images/init_image.png')

        pixMapF = QPixmap.fromImage(self.fixedImageQI)
        pixMapM = QPixmap.fromImage(self.movingImageQI)

        # self.resultLB.setPixmap(pixMapR)
        # self.resultLB.setMask(pixMapR.mask())
        self.fixedImageLB.setPixmap(pixMapF)
        self.fixedImageLB.setMask(pixMapF.mask())
        self.movingImageLB.setPixmap(pixMapM)
        self.movingImageLB.setMask(pixMapM.mask())

    def AKAZERegistration(self):

        self.method = 'AKAZE'
        self.registration()

    def SIFTRegistration(self):
        self.method = 'SIFT'
        self.registration()

    def registration(self):
        self.coderun = True  # To right click is activated
        self.load_templates()

        # print("Finished loading template (blank form) images")
        self.register_image()
        # print("Registration score: {0}".format(reg_score))

    def initLabelImages(self):
        pass

    def initButtonImages(self):
        btn_selectMV = QPushButton("Select Fixed Image")
        btn_selectMV.clicked.connect(self.select_image)
        btn_selectT = QPushButton("Select Fixed Image")
        #btn_selectT.setText("Select Fixed Image")
        btn_selectT.clicked.connect(self.select_image)

        hbox = QHBoxLayout()
        #hbox.addStretch(1)
        hbox.addWidget(btn_selectMV)
        hbox.addWidget(btn_selectT)

        vbox = QVBoxLayout()
        vbox.addStretch(1)
        vbox.addLayout(hbox)

        self.setLayout(vbox)

        #file dialog

    def selectFixedImage(self):
        file_dialog = QFileDialog(self)
        # the name filters must be a list
        file_dialog.selectNameFilter("Images (*.png *.jpg)")
        file_dialog.setDirectory(
            '/Users/aminoo/Documents/Work/ImageRegistration/templates')
        # show the dialog
        self.filenameFixed, _ = file_dialog.getOpenFileName(self)
        # self.filenameFixed = '/Users/aminoo/Documents/Work/ImageRegistration/templates/Template_P01.png'
        if (self.filenameFixed != ""):
            # Read an image from file and creates an ARGB32 string representing the image

            im = cv2.imread(self.filenameFixed,
                            flags=0)  # read in image in grayscale
            im = cv2.resize(im,
                            dsize=(637, 825),
                            interpolation=cv2.INTER_LINEAR)
            if len(im.shape) == 2:
                im = cv2.applyColorMap(im, cv2.COLORMAP_BONE)
                # im = cv2.resize(im, (512, 512), cv2.INTER_AREA)
            height, width, channel = im.shape
            bytesPerLine = 3 * width
            qImg = QImage(im, width, height, bytesPerLine,
                          QImage.Format_RGB888)
            self.fixedImageQI = qImg
            self.fixedImageQI.scaledToWidth(width)
            self.fixedImageQI.scaledToHeight(height)
            pixMapf = QPixmap.fromImage(self.fixedImageQI)
            #
            # pixMapM = QPixmap.fromImage(self.movingImageQI)
            self.fixedImageLB.setPixmap(pixMapf)
            # self.movingImageLB.setMask(pixMapM.mask())

    def selectMovingImage(self):
        file_dialog = QFileDialog(self)
        # the name filters must be a list
        file_dialog.selectNameFilter("Images (*.png *.jpg)")
        file_dialog.setDirectory(
            '/Users/aminoo/Documents/Work/ImageRegistration/Data/Small_053/Page1/P01_Images'
        )
        self.filenameMoving, _ = file_dialog.getOpenFileName(self)
        if (self.filenameMoving != ""):
            # Read an image from file and creates an ARGB32 string representing the image
            im = cv2.imread(self.filenameMoving,
                            flags=0)  # read in image in grayscale
            im = cv2.resize(im,
                            dsize=(637, 825),
                            interpolation=cv2.INTER_LINEAR)
            if len(im.shape) == 2:
                im = cv2.applyColorMap(im, cv2.COLORMAP_BONE)
            height, width, channel = im.shape
            bytesPerLine = 3 * width
            qImg = QImage(im, width, height, bytesPerLine,
                          QImage.Format_RGB888)
            self.movingImageQI = qImg
            self.movingImageQI.scaledToWidth(width)
            self.movingImageQI.scaledToHeight(height)
            pixMapm = QPixmap.fromImage(self.movingImageQI)
            self.movingImageLB.setPixmap(pixMapm)

    # function to load templates borrowed from Specto backend
    def load_templates(
            self):  # os.path.join("..", "templates"), PAGE_DPI=150):
        """Function to load the form template images."""
        # TEMPLATE IMAGES SHOULD BE PROCESSED IN THE SAME MANNER AS FORM PAGE IMAGES!! (e.g. thresholding, inverting)
        self.templates = []  # store images in list
        self.keypoints = []
        self.descriptors = []

        #for file in sorted(os.listdir(TEMPLATES_DIR)):
        im = cv2.imread(self.filenameFixed,
                        flags=0)  # read in image in grayscale
        im = cv2.resize(
            im, (0, 0),
            fx=self.PAGE_DPI / 300,
            fy=self.PAGE_DPI / 300,
            interpolation=cv2.INTER_LINEAR)  # rescale to working DPI

        im = np.invert(im)  # invert the image
        #img = cv2.resize(im, dsize=(450, 700), interpolation=cv2.INTER_LINEAR)

        [kp1, des1, im1] = imReg.get_keypoints(im,
                                               downsample_factor=int(
                                                   2 * self.PAGE_DPI / 300),
                                               method=self.method)

        self.templates.append(im)
        self.keypoints.append(kp1)
        self.descriptors.append(des1)
        self.imf = im1

    # want to be able to visualize aligned images - how about making the template the red channel and the aligned form the green?
    def combine_images(template, form, pixel_thresh=127, debug_out=False):
        # generate an RGB image of the same shape as template

        t_shape = template.shape
        f_shape = form.shape
        minH = min(t_shape[0], f_shape[0])
        minW = min(t_shape[1], f_shape[1])

        result = np.ones(
            (minH, minW, 3),
            np.uint8) * 255  # init to [255,255,255] everywhere = white image

        result[:minH, :minW, 1] = 255 - 255 * (
            template[:minH, :minW] < pixel_thresh)  # red channel: template
        result[:minH, :minW, 0] = 255 - 255 * (
            form[:minH, :minW] < pixel_thresh)  # blue channel: form
        result[:minH, :minW, 2] = 255 - 255 * (
            form[:minH, :minW] < pixel_thresh)  # yellow channel: form

        result = np.uint8(result)
        return (result)

    # pulled registration lines from specto_backend
    def register_image(self):
        pagenum = 1  #TODO read template name
        n = pagenum - 1  # assume input page numbers are 1 to 6

        # load image to be registered, and apply some smoothing/deskewing
        # (following lines copied from Specto's Page class)
        im = cv2.imread(self.filenameMoving, flags=0)
        im = cv2.GaussianBlur(im, (3, 3), 0)
        im = cv2.fastNlMeansDenoising(im,
                                      h=10,
                                      templateWindowSize=7,
                                      searchWindowSize=11)
        im = np.invert(im)  # invert the images so that 0 means white

        #im = deskew(im, crop=True)#TODO has problem

        im = cv2.resize(im,
                        dsize=self.templates[n].shape[:2][::-1],
                        interpolation=cv2.INTER_LINEAR)

        if self.method == 'SIFT':
            homography, self.immov, points1, points2, self.keypointsM, self.descriptorsM = imReg.registration_SIFT(
                0,
                im,
                self.templates[n],
                min_match_count=4,
                downsample_factor=int(2 * self.PAGE_DPI / 300),
                kp2=self.keypoints[n],
                des2=self.descriptors[n],
                kp1=None,
                des1=None)
        elif self.method == 'AKAZE':
            homography, self.immov, points1, points2, self.keypointsM, self.descriptorsM = imReg.registration_AKAZE(
                0,
                im,
                self.templates[n],
                downsample_factor=int(2 * self.PAGE_DPI / 300),
                kp2=self.keypoints[n],
                des2=self.descriptors[n],
                kp1=None,
                des1=None)

        reg_im = imReg.apply_registration(
            im, homography)  # apply homography to image
        reg_r = imReg.reg_measure(
            reg_im, self.templates[n])  # measure quality of registration
        if self.method == 'AKAZE':
            self.textscore_AKA.setText(str(reg_r))
        elif self.method == 'SIFT':
            self.textscore_SIF.setText(str(reg_r))

        self.repaint()

        #Show keypoints
        img = np.invert(self.immov)
        img = cv2.drawKeypoints(img, self.keypointsM, np.array([]),
                                (0, 0, 255))
        img = cv2.drawKeypoints(img, points1, np.array([]), (255, 0, 0))
        self.imgmm = img
        #img = cv2.resize(img, dsize=(450, 700), interpolation=cv2.INTER_LINEAR)
        height, width, channel = img.shape
        bytesPerLine = 3 * width
        qImg = QImage(img, width, height, bytesPerLine, QImage.Format_RGB888)
        self.movingImageQI = qImg
        self.movingImageQI.scaledToWidth(width)
        self.movingImageQI.scaledToHeight(height)
        self.pixMapm = QPixmap.fromImage(self.movingImageQI)

        self.movingImageLB.setPixmap(self.pixMapm)
        self.movingImageLB.setMask(self.pixMapm.mask())

        imgf = np.invert(self.imf)
        imgf = cv2.drawKeypoints(imgf, self.keypoints[n], np.array([]),
                                 (0, 0, 255))
        imgf = cv2.drawKeypoints(imgf, points2, np.array([]), (255, 0, 0))
        #imgf = cv2.resize(imgf, dsize=(self.immov.shape[0],self.immov.shape[1]), interpolation=cv2.INTER_LINEAR)
        self.imgff = imgf
        height, width, channel = imgf.shape
        bytesPerLine = 3 * width
        qImgf = QImage(imgf, width, height, bytesPerLine, QImage.Format_RGB888)
        self.fixedImageQI = qImgf
        self.fixedImageQI.scaledToWidth(width)
        self.fixedImageQI.scaledToHeight(height)
        self.pixMapf = QPixmap.fromImage(self.fixedImageQI)

        self.fixedImageLB.setPixmap(self.pixMapf)

        # if (show_registration):
        INV_TEMPLATES = [
        ]  # for quicker display, invert the templates now to get black and white to display properly
        for temp in self.templates:
            INV_TEMPLATES.append(np.invert(temp))
        # alignment_vis = combine_images(INV_TEMPLATES[n], np.invert(reg_im))
        # generate an RGB image of the same shape as template
        pixel_thresh = 127
        template = INV_TEMPLATES[n]
        form = np.invert(reg_im)
        t_shape = template.shape
        f_shape = form.shape
        minH = min(t_shape[0], f_shape[0])
        minW = min(t_shape[1], f_shape[1])

        result = np.ones(
            (minH, minW, 3),
            np.uint8) * 255  # init to [255,255,255] everywhere = white image

        result[:minH, :minW, 1] = 255 - 255 * (
            template[:minH, :minW] < pixel_thresh)  # red channel: template
        result[:minH, :minW, 0] = 255 - 255 * (
            form[:minH, :minW] < pixel_thresh)  # blue channel: form
        result[:minH, :minW, 2] = 255 - 255 * (
            form[:minH, :minW] < pixel_thresh)  # yellow channel: form

        alignment_vis = np.uint8(result)

        alignment_vis = cv2.resize(alignment_vis,
                                   dsize=(450, 700),
                                   interpolation=cv2.INTER_LINEAR)

        height, width, channel = alignment_vis.shape
        bytesPerLine = 3 * width
        qImg = QImage(alignment_vis.data, width, height, bytesPerLine,
                      QImage.Format_RGB888)
        self.resultQI = qImg
        pixMapR = QPixmap.fromImage(self.resultQI)
        self.resultLB.setPixmap(pixMapR)
        self.resultLB.setMask(pixMapR.mask())

    def try_registeragain(self):
        pagenum = 1  # TODO read template name
        n = pagenum - 1  # assume input page numbers are 1 to 6

        # load image to be registered, and apply some smoothing/deskewing
        # (following lines copied from Specto's Page class)
        im = cv2.imread(self.filenameMoving, flags=0)
        im = cv2.GaussianBlur(im, (3, 3), 0)
        im = cv2.fastNlMeansDenoising(im,
                                      h=10,
                                      templateWindowSize=7,
                                      searchWindowSize=11)
        im = np.invert(im)  # invert the images so that 0 means white

        # im = deskew(im, crop=True)#TODO has problem

        im = cv2.resize(im,
                        dsize=self.templates[n].shape[:2][::-1],
                        interpolation=cv2.INTER_LINEAR)
        if self.method == 'AKAZE':
            homography, self.immov, points1, points2, self.keypointsM, self.descriptorsM = imReg.registration_AKAZE(
                1,
                im,
                self.templates[n],
                downsample_factor=int(2 * self.PAGE_DPI / 300),
                kp2=self.keypoints[n],
                des2=self.descriptors[n],
                kp1=self.keypointsM,
                des1=self.descriptorsM)
        elif self.method == 'SIFT':
            homography, self.immov, points1, points2, self.keypointsM, self.descriptorsM = imReg.registration_SIFT(
                1,
                im,
                self.templates[n],
                min_match_count=4,
                downsample_factor=int(2 * self.PAGE_DPI / 300),
                kp2=self.keypoints[n],
                des2=self.descriptors[n],
                kp1=self.keypointsM,
                des1=self.descriptorsM)
        reg_im = imReg.apply_registration(
            im, homography)  # apply homography to image
        reg_r = imReg.reg_measure(
            reg_im, self.templates[n])  # measure quality of registration
        if self.method == 'AKAZE':
            self.textscore_AKA.setText(str(reg_r))
        elif self.method == 'SIFT':
            self.textscore_SIF.setText(str(reg_r))
        self.repaint()

        # Show keypoints
        img = np.invert(self.immov)
        img = cv2.drawKeypoints(img, self.keypointsM, np.array([]),
                                (0, 0, 255))
        img = cv2.drawKeypoints(img, points1, np.array([]), (255, 0, 0))
        self.imgmm = img

        height, width, channel = img.shape
        bytesPerLine = 3 * width
        qImg = QImage(img, width, height, bytesPerLine, QImage.Format_RGB888)
        self.movingImageQI = qImg
        self.movingImageQI.scaledToWidth(width)
        self.movingImageQI.scaledToHeight(height)
        self.pixMapm = QPixmap.fromImage(self.movingImageQI)

        self.movingImageLB.setPixmap(self.pixMapm)
        self.movingImageLB.setMask(self.pixMapm.mask())

        imgf = np.invert(self.imf)
        imgf = cv2.drawKeypoints(imgf, self.keypoints[n], np.array([]),
                                 (0, 0, 255))
        imgf = cv2.drawKeypoints(imgf, points2, np.array([]), (255, 0, 0))
        # imgf = cv2.resize(imgf, dsize=(self.immov.shape[0],self.immov.shape[1]), interpolation=cv2.INTER_LINEAR)
        self.imgff = imgf
        height, width, channel = imgf.shape
        bytesPerLine = 3 * width
        qImgf = QImage(imgf, width, height, bytesPerLine, QImage.Format_RGB888)
        self.fixedImageQI = qImgf
        self.fixedImageQI.scaledToWidth(width)
        self.fixedImageQI.scaledToHeight(height)
        self.pixMapf = QPixmap.fromImage(self.fixedImageQI)

        self.fixedImageLB.setPixmap(self.pixMapf)
        # self.scrolf.setWidget(self.fixedImageLB)
        # self.scrolf.setVisible(True)
        # self.scrolf.setWidgetResizable(True)
        # self.scrolf.setFixedHeight(700)
        # self.scrolf.setFixedWidth(450)
        # self.fixedImageLB.setMask(pixMapf.mask())

        # if (show_registration):
        INV_TEMPLATES = [
        ]  # for quicker display, invert the templates now to get black and white to display properly
        for temp in self.templates:
            INV_TEMPLATES.append(np.invert(temp))
        # alignment_vis = combine_images(INV_TEMPLATES[n], np.invert(reg_im))
        # generate an RGB image of the same shape as template
        pixel_thresh = 127
        template = INV_TEMPLATES[n]
        form = np.invert(reg_im)
        t_shape = template.shape
        f_shape = form.shape
        minH = min(t_shape[0], f_shape[0])
        minW = min(t_shape[1], f_shape[1])

        result = np.ones(
            (minH, minW, 3),
            np.uint8) * 255  # init to [255,255,255] everywhere = white image

        result[:minH, :minW, 1] = 255 - 255 * (
            template[:minH, :minW] < pixel_thresh)  # red channel: template
        result[:minH, :minW, 0] = 255 - 255 * (
            form[:minH, :minW] < pixel_thresh)  # blue channel: form
        result[:minH, :minW, 2] = 255 - 255 * (
            form[:minH, :minW] < pixel_thresh)  # yellow channel: form

        alignment_vis = np.uint8(result)

        alignment_vis = cv2.resize(alignment_vis,
                                   dsize=(450, 700),
                                   interpolation=cv2.INTER_LINEAR)

        height, width, channel = alignment_vis.shape
        bytesPerLine = 3 * width
        qImg = QImage(alignment_vis.data, width, height, bytesPerLine,
                      QImage.Format_RGB888)
        self.resultQI = qImg
        pixMapR = QPixmap.fromImage(self.resultQI)
        self.resultLB.setPixmap(pixMapR)
        self.resultLB.setMask(pixMapR.mask())
예제 #10
0
    for x in range(im.width()):
        for y in range(im.height()):
            if x % 2 == 0:
                im.setPixel(x, y, QColor('white').rgb())
            else:
                im.setPixel(x, y, QColor('black').rgb())
            # im.setPixel(x, y, QColor(255, x*2.56, y*2.56, 255).rgb())
    im.save('test.png')


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = IconEditor()
    img = QImage()
    if img.load("./mouse.png"):
        print('Image loaded successfully')
        window.setIconImage(img)
    else:
        print('Failed to load mouse.png image')
    # window.show()

    scrollArea = QScrollArea()
    scrollArea.setWidget(window)
    scrollArea.viewport().setBackgroundRole(QPalette.Dark)
    scrollArea.viewport().setAutoFillBackground(True)
    scrollArea.setWindowTitle("Icon Editor")
    scrollArea.show()
    # testImage()
    sys.exit(app.exec_())