프로젝트

일반

사용자정보

통계
| 개정판:

hytos / DTI_PID / DTI_PID / TrainingEditorDialog.py @ d45df999

이력 | 보기 | 이력해설 | 다운로드 (7.14 KB)

1
import sys
2
import os
3
from PyQt5.QtCore import *
4
from PyQt5.QtGui import *
5
from PyQt5.QtWidgets import *
6
from AppDocData import AppDocData, Source
7
import TrainingEditor_UI
8
import QtImageViewer
9
from GraphicsBoundingBoxItem import QGraphicsBoundingBoxItem
10
from TrainingBoxItem import QTrainingBoxItem
11
import cv2
12
from PIL import Image
13
import AreaZoomCommand
14
import PlaceLineCommand
15

    
16

    
17

    
18
class QTrainingEditorDialog(QDialog):
19
    def __init__(self, parent):
20
        self.spinBoxFlag = False
21
        QDialog.__init__(self, parent)
22

    
23
        appDocData = AppDocData.instance()
24
        project = appDocData.getCurrentProject()
25

    
26
        self.ui = TrainingEditor_UI.Ui_TrainingEditorDialog()
27
        self.ui.setupUi(self)
28

    
29
        self.graphicsViewTrainingDrawing = QtImageViewer.QtImageViewer(self)
30
        self.graphicsViewTrainingDrawing.setParent(self.ui.centralWidget)
31
        self.graphicsViewTrainingDrawing.useDefaultCommand()
32
        self.ui.verticalLayoutTrainingDrawing.addWidget(self.graphicsViewTrainingDrawing)
33

    
34
        self.graphicsViewZoomDrawing = QGraphicsView(self)
35
        self.graphicsViewZoomDrawing.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
36
        self.graphicsViewZoomDrawing.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
37
        self.graphicsViewZoomDrawing.setParent(self.ui.leftSideWidget)
38
        self.ui.horizontalLayoutZoomDrawing.addWidget(self.graphicsViewZoomDrawing)
39
        
40
        
41
        # 학습 이미지 읽어서 메인 뷰에 그림, 사이드 뷰에 추가
42
        try:
43
            trainingImgPath = os.path.join(project.getTrainingFilePath(), 'seed.seedF.exp0.tif')
44
            cvImg = cv2.cvtColor(cv2.imread(trainingImgPath), cv2.COLOR_BGR2GRAY)
45
            blur = cv2.GaussianBlur(cvImg, (5,5),0)
46
            cvImg = cv2.threshold(cvImg, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]
47
            bytesPerLine = cvImg.shape[1]
48
            image = QImage(cvImg.data, cvImg.shape[1], cvImg.shape[0], bytesPerLine, QImage.Format_Indexed8)
49

    
50
            #img = cv2.imread(trainingImgPath)
51
            #image = QImage(img.data, img.shape[1], img.shape[0], img.shape[1], QImage.Format_Indexed8)
52

    
53
            self.graphicsViewTrainingDrawing.setImage(image)
54

    
55
            # 사이드 뷰
56
            if type(image) is QPixmap:
57
                pixmap = image
58
            elif type(image) is QImage:
59
                pixmap = QPixmap.fromImage(image)
60
            scene = QGraphicsScene()
61
            self.graphicsViewZoomDrawing.setScene(scene)
62
            self._pixmapHandle = self.graphicsViewZoomDrawing.scene().addPixmap(pixmap)
63
            rect = QGraphicsRectItem(0, 0, 0, 0)
64
            pen = QPen(Qt.SolidLine)
65
            pen.setColor(Qt.green)
66
            pen.setWidthF(1)
67
            pen.setJoinStyle(Qt.MiterJoin)
68
            rect.setPen(pen)
69
            self.graphicsViewZoomDrawing.scene().addItem(rect)
70

    
71
        except Exception as ex:
72
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
73

    
74
        # 박스 읽어서 메인 뷰에 그림
75
        try:
76
            trainingBoxPath = os.path.join(project.getTrainingFilePath(), 'seed.seedF.exp0.box')
77
            fBox = open(trainingBoxPath, 'r', encoding='utf8')
78
            SBox = fBox.read()
79
            fBox.close()
80
            boxList = []
81
            boxList = SBox.split('\n')
82

    
83
            for box in boxList:
84
                boxComponent = box.split(' ')
85
                singleBox = QTrainingBoxItem(int(boxComponent[1]), cvImg.shape[0] - int(boxComponent[4]), int(boxComponent[3]) - int(boxComponent[1]), int(boxComponent[4]) - int(boxComponent[2]))
86
                singleBox.loc = [int(boxComponent[1]), cvImg.shape[0] - int(boxComponent[2])]
87
                singleBox.size = [int(boxComponent[3]) - int(boxComponent[1]), int(boxComponent[2]) - int(boxComponent[4])]
88
                singleBox.angle = 0
89
                #singleBox.setPlainText(boxComponent[0])
90
                singleBox.transfer.onRemoved.connect(self.itemRemoved)
91
                singleBox.addTextItemToScene(self.ui, self.graphicsViewTrainingDrawing, self.graphicsViewZoomDrawing, self.spinBoxFlag)
92
            
93
        except Exception as ex:
94
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
95

    
96
        #'''test'''
97
        #item = QGraphicsBoundingBoxItem(0, 0, 30, 30)
98
        #item.isSymbol = True
99
        #item.angle = 0
100
        #item.setPen(QPen(Qt.red, 1, Qt.SolidLine))
101
        #self.graphicsViewTrainingDrawing.scene.addItem(item)
102

    
103
        self.removedItems = []
104

    
105
        self.ui.pushButtonZoom.clicked.connect(self.onAreaZoom)
106
        self.ui.spinBoxLeft.valueChanged.connect(self.spinBoxChangedEvent)
107
        self.ui.spinBoxTop.valueChanged.connect(self.spinBoxChangedEvent)
108
        self.ui.spinBoxWidth.valueChanged.connect(self.spinBoxChangedEvent)
109
        self.ui.spinBoxHeight.valueChanged.connect(self.spinBoxChangedEvent)
110

    
111
    def spinBoxChangedEvent(self, event):
112
        items = self.graphicsViewTrainingDrawing.scene.selectedItems()
113
        if(len(items) is not 1) or self.spinBoxFlag:
114
            return
115
        
116
        spinBoxName = self.sender().objectName()
117
        rect = items[0].rect()
118
        bound = self.graphicsViewZoomDrawing.scene().items()[0]
119

    
120
        if spinBoxName == 'spinBoxLeft':
121
            spinBoxValue = self.ui.spinBoxLeft.value()
122
            items[0].setRect(QRectF(spinBoxValue, rect.y(), rect.width(), rect.height()))
123
        elif spinBoxName == 'spinBoxTop':
124
            spinBoxValue = self.ui.spinBoxTop.value()
125
            items[0].setRect(QRectF(rect.x(), spinBoxValue, rect.width(), rect.height()))
126
        elif spinBoxName == 'spinBoxWidth':
127
            spinBoxValue = self.ui.spinBoxWidth.value()
128
            items[0].setRect(QRectF(rect.x(),  rect.y(), spinBoxValue, rect.height()))
129
        elif spinBoxName == 'spinBoxHeight':
130
            spinBoxValue = self.ui.spinBoxHeight.value()
131
            items[0].setRect(QRectF(rect.x(), rect.y(), rect.width(), spinBoxValue))
132
        
133
        rect = items[0].rect()        
134
        bound.setRect(rect)
135
        rectSide = QRectF(rect.x() -3, rect.y() -3, rect.width() +6,  rect.height() +6)
136
        self.graphicsViewZoomDrawing.fitInView(rectSide)
137
        self.graphicsViewTrainingDrawing.scene.update()
138
    
139
    def onAreaZoom(self, action):
140
        if self.ui.pushButtonZoom.isChecked():
141
            cmd = AreaZoomCommand.AreaZoomCommand(self.graphicsViewTrainingDrawing)
142
            cmd.onRejected.connect(self.onCommandRejected)
143
            self.graphicsViewTrainingDrawing.command = cmd
144

    
145
    def onCommandRejected(self, cmd):
146
        try:
147
            if type(cmd) is AreaZoomCommand.AreaZoomCommand:
148
                self.ui.pushButtonZoom.setChecked(False)
149
        finally:
150
            self.graphicsViewTrainingDrawing.useDefaultCommand()
151

    
152
    def itemRemoved(self, item):
153
        try:
154
            if type(item) is QTrainingBoxItem:
155
                self.removedItems.append(str(item.uid))
156

    
157
            if item.scene() is not None: item.scene().removeItem(item)
158
        except Exception as ex:
159
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
160

    
161
        
162
        
163

    
164
        
클립보드 이미지 추가 (최대 크기: 500 MB)