示例#1
0
class Controller:
    def __init__(self, imFolder, gtFolder):
        self.app = Tkinter.Tk()

        # self.app.style = ttk.Style()
        # self.app.style.theme_use('default')

        self.app.title('Video Annotation')

        self.model = Model(imFolder, gtFolder)

        # init flags
        self.brushSize = 3 #TODO

        self.view = View(self.app)
        self.setCommands()

    def setCommands(self):
        self.view.labelIm.bind('<B1-Motion>', self.mouseMovAnnotationImage)
        self.view.labelIm.bind('<ButtonRelease-1>', self.mouseReleaseAnnotationImage)

        self.view.labelGT.bind('<ButtonPress-1>', self.mousePressGT)
        self.view.labelGT.bind('<B1-Motion>', self.mouseMovGT)
        self.view.labelGT.bind('<ButtonRelease-1>', self.mouseReleaseGT)

        self.view.btPrev.bind('<ButtonPress-1>', self.prevButtonClick)
        self.app.bind('<Left>', self.prevButtonClick)

        self.view.btNext.bind('<ButtonPress-1>', self.nextButtonClick)
        self.app.bind('<Right>', self.nextButtonClick)

        self.app.bind('+', self.plusKey)
        self.app.bind('-', self.minusKey)

        self.app.bind('d', self.delKey)

        self.app.bind('1', self.anomalyTypeKey)
        self.app.bind('2', self.anomalyTypeKey)
        self.app.bind('3', self.anomalyTypeKey)
        self.view.setAnomalyType(self.model.anomalySelectedType)

        self.updateView()

    def xy2rowcol(self, x, y):
        return y / self.view.zoom, x / self.view.zoom

    def run(self):
        self.app.mainloop()

    def updateView(self):
        self.view.updateImages(self.model.im.copy(), self.model.gt)

    def nextButtonClick(self, event):
        self.model.nextIm()
        self.updateView()

    def prevButtonClick(self, event):
        self.model.prevIm()
        self.updateView()

    def mouseMovAnnotationImage(self, event):
        row, col = self.xy2rowcol(event.x, event.y)

        nRows = self.model.gt.shape[0]
        nCols = self.model.gt.shape[1]

        if row >= 0 and row < nRows and col >= 0 and col < nCols:
            d = self.brushSize/2
            self.model.annotate(row-d,col-d,row+d,col+d)
            self.updateView()

        print '(%d, %d)' % (row, col)

    def mouseReleaseAnnotationImage(self, event):
        self.model.fill()
        self.updateView()

    def mousePressGT(self, event):
        self.row1gt, self.col1gt = self.xy2rowcol(event.x, event.y)
        print 'p1 = (%d, %d)' % (self.row1gt, self.col1gt)

    def mouseMovGT(self, event):
        row, col = self.xy2rowcol(event.x, event.y)
        print 'p = (%d, %d)' % (row, col)

    def mouseReleaseGT(self, event):
        row, col = self.xy2rowcol(event.x, event.y)
        print 'p1 = (%d, %d) -> p2 = (%d, %d)' % (row, col, self.row1gt, self.col1gt)

        if row == self.row1gt and col == self.col1gt:
            print 'click!!!'
            row1, col1, row2, col2 = self.model.selectByPiont(row, col)
            if row1 != -1:
                self.model.setAnomalyType(row1, col1, row2, col2)
            print 'select (%d, %d) -> (%d, %d)' % (row1, col1, row2, col2)
            self.view.drawSelection(row1, col1, row2, col2)

    def plusKey(self, event):
        self.view.zoomIn()

    def minusKey(self, event):
        self.view.zoomOut()

    def delKey(self, event):
        self.model.switchDel()

    def anomalyTypeKey(self, event):
        t = int(event.char)
        key = self.model.anomalyTypeDict.keys()[t-1]
        self.model.anomalySelectedType = key
        self.view.setAnomalyType(key)