示例#1
0
 def __init__(self, master):
     Frame.__init__(self, master)
     self.statusLabelText = StringVar()
     self.statusLabelText.set('Probes Generating')
     self.heading = Label(
         self,
         text=
         "Welcome to the QA Wizard. Press Next to begin the QA Process or Quit to stop. This is "
         "Manny; He is here to help you analyze the journal. The tool is currently generating the probes. "
         "This could take a while. When the next button is enabled you may begin.",
         wraplength=400)
     self.heading.grid(column=0, row=0, rowspan=2, columnspan=2)
     manny_color = maskgen.tool_set.get_icon('Manny_icon_color.jpg')
     manny_mask = maskgen.tool_set.get_icon('Manny_icon_mask.jpg')
     self.mannyFrame = Frame(self)
     self.mannyFrame.grid(column=0, row=2, columnspan=2)
     self.canvas = Canvas(self.mannyFrame, width=510, height=510)
     self.canvas.pack()
     manny_img = openImage(manny_color)
     manny_img_mask = openImage(manny_mask).to_mask()
     manny_img_mask = imageResizeRelative(manny_img_mask, (500, 500),
                                          manny_img_mask.size)
     self.manny = ImageTk.PhotoImage(
         imageResizeRelative(manny_img, (500, 500), manny_img.size).overlay(
             manny_img_mask, self.manny_colors[random.randint(
                 0,
                 len(self.manny_colors) - 1)]).toPIL())
     self.image_on_canvas = self.canvas.create_image(510 / 2,
                                                     510 / 2,
                                                     image=self.manny,
                                                     anchor=CENTER,
                                                     tag='things')
     self.statusLabelObject = Label(self, textvariable=self.statusLabelText)
     self.statusLabelObject.grid(column=0,
                                 row=3,
                                 columnspan=2,
                                 sticky=E + W)
     self.canvas.bind("<Double-Button-1>", master.help)
     self.wquit = Button(self,
                         text='Quit',
                         command=master.exitProgram,
                         width=20)
     self.wquit.grid(column=0, row=4, sticky=W, padx=5, pady=5)
     self.wnext = Button(self,
                         text='Next',
                         command=master.nex,
                         state=DISABLED,
                         width=20)
     self.wnext.grid(column=1, row=4, sticky=E, padx=5, pady=5)
示例#2
0
    def load_overlay(self, initialize):
        """
        Lays out display for spatial overlay for image probes
        :param initialize:
        :return:
        """
        edgeTuple = self.edgeTuple
        message = 'final image'
        if (len(self.link.split('->')) > 1):
            probe = [
                probe for probe in self.master.probes
                if probe.edgeId[1] in self.master.lookup[self.edgeTuple[0]]
                and probe.finalNodeId in self.master.lookup[self.edgeTuple[1]]
            ][0]
            n = self.master.scModel.G.get_node(probe.finalNodeId)
            finalFile = os.path.join(
                self.master.scModel.G.dir,
                self.master.scModel.G.get_node(probe.finalNodeId)['file'])
            final = openImage(finalFile)
            finalResized = imageResizeRelative(final, (500, 500), final.size)
            imResized = imageResizeRelative(
                probe.targetMaskImage, (500, 500), probe.targetMaskImage.size
                if probe.targetMaskImage is not None else finalResized.size)

        else:
            message = 'donor'
            probe = \
        [probe for probe in self.master.probes if probe.edgeId[1] in self.master.lookup[edgeTuple[0]] and probe.donorBaseNodeId in self.master.lookup[edgeTuple[1]]][0]
            final, final_file = self.master.scModel.G.get_image(
                probe.donorBaseNodeId)
            finalResized = imageResizeRelative(final, (500, 500), final.size)
            imResized = imageResizeRelative(
                probe.donorMaskImage, (500, 500), probe.donorMaskImage.size
                if probe.donorMaskImage is not None else finalResized.size)

        edge = self.master.scModel.getGraph().get_edge(probe.edgeId[0],
                                                       probe.edgeId[1])

        if initialize is True:
            self.c = Canvas(self.cImgFrame, width=510, height=510)
            self.c.pack()
        self.transitionString(None)
        try:
            finalResized = finalResized.overlay(imResized)
        except IndexError:
            tex = self.c.create_text(250, 250, width=400, font=("Courier", 20))
            self.c.itemconfig(
                tex,
                text="The mask of link {} did not match the size of the {}.".
                format(self.link, message))
            return
        self.master.photos[self.link] = ImageTk.PhotoImage(
            finalResized.toPIL())
        self.image_on_canvas = self.c.create_image(
            255,
            255,
            image=self.master.photos[self.link],
            anchor=CENTER,
            tag='imgc')
示例#3
0
 def test_zip(self):
     import os
     filename = self.locateFile('tests/zips/raw.zip')
     self.addFileToRemove(os.path.join(os.path.dirname(filename), 'raw.png'))
     img = tool_set.openImage(filename,tool_set.getMilliSecondsAndFrameCount('2'),preserveSnapshot=True)
     self.assertEqual((5796, 3870),img.size)
     tool_set.condenseZip(filename,keep=1)
     self.addFileToRemove(os.path.join(os.path.dirname(filename),'raw_c.zip'))
     contents = tool_set.getContentsOfZip(os.path.join(os.path.dirname(filename),'raw_c.zip'))
     self.assertTrue('59487443539401a4d83512edaab3c1b2.cr2' in contents)
     self.assertTrue('7d1800a38ca7a22021bd94e71b6e0f42.cr2' in contents)
     self.assertTrue(len(contents) == 2)
    def test_gray_writing(self):
        import os
        import sys
        import time
        s = time.clock()
        writer = tool_set.GrayBlockWriter('test_ts_gw', 29.97002997)
        mask_set = list()
        for i in range(255):
            mask = np.random.randint(255, size=(1090, 1920)).astype('uint8')
            mask_set.append(mask)
            writer.write(mask, 33.3666666667 * i, i + 1)
        for i in range(300, 350):
            mask = np.random.randint(255, size=(1090, 1920)).astype('uint8')
            mask_set.append(mask)
            writer.write(mask, 33.3666666667 * i, i + 1)
        writer.close()
        fn = writer.get_file_name()
        reader = tool_set.GrayBlockReader(fn, end_frame=305)
        pos = 0
        while True:
            mask = reader.read()
            if mask is None:
                break
            compare = mask == mask_set[pos]
            self.assertEqual(mask.size, sum(sum(compare)))
            if pos == 255:
                self.assertEqual(301, reader.current_frame() - 1)
            pos += 1

        reader.close()
        self.assertEqual(305, pos)
        print time.clock() - s
        suffix = 'm4v'
        if sys.platform.startswith('win'):
            suffix = 'avi'
        filename = tool_set.convertToVideo(fn)
        self.assertEquals('test_ts_gw_mask_0.0.' + suffix, filename)
        self.assertTrue(os.path.exists(filename))

        size = tool_set.openImage(
            filename, tool_set.getMilliSecondsAndFrameCount('00:00:01')).size
        self.assertTrue(size == (1920, 1090))
        os.remove(filename)
        os.remove(fn)
示例#5
0
    def check_input_mask(edge, op, graph, frm, to):
        inputmaskname = edge[
            'inputmaskname'] if 'inputmaskname' in edge else None

        if inputmaskname is not None and len(inputmaskname) > 0 and \
                not os.path.exists(os.path.join(graph.dir, inputmaskname)):
            return [
                ValidationMessage(
                    Severity.ERROR, frm, to,
                    "Input mask file {} is missing".format(inputmaskname),
                    'Input Mask', repairMask)
            ]
        if inputmaskname is not None and len(inputmaskname) > 0 and \
                os.path.exists(os.path.join(graph.dir, inputmaskname)):
            ft = fileType(os.path.join(graph.dir, inputmaskname))
            if ft == 'audio':
                return []
            inputmask = openImage(os.path.join(graph.dir, inputmaskname))
            if inputmask is None:
                return [
                    ValidationMessage(
                        Severity.ERROR, frm, to,
                        "Input mask file {} is missing".format(inputmaskname),
                        'Input Mask', repairMask if ft == 'image' else None)
                ]
            inputmask = inputmask.to_mask().to_array()
            mask = openImageFile(os.path.join(
                graph.dir, edge['maskname'])).invert().to_array()
            if inputmask.shape != mask.shape:
                return [
                    ValidationMessage(
                        Severity.ERROR, frm, to,
                        'input mask name parameter has an invalid size',
                        'Input Mask', repairMask if ft == 'image' else None)
                ]
        return []
示例#6
0
def compare_images(file1, file2):
    if file1 is None and file2 is None:
        return True
    if file1 is not None and file2 is not None:
        return compare_mask_images(openImage(file1), openImage(file2))
    return False
示例#7
0
    def __init__(self, master, link):
        Frame.__init__(self, master=master)
        self.master = master
        self.link = link
        self.checkboxes = CheckboxGroup(boxes=[])
        #Find this probe- could probably do this elsewhere and pass it in.
        self.edgeTuple = tuple(link.split("<-"))
        if len(self.edgeTuple) < 2:
            self.finalNodeName = link.split("->")[1]
            self.edgeTuple = tuple(link.split("->"))
        else:
            self.finalNodeName = None
        if (len(link.split('->')) > 1):
            probe = [
                probe for probe in master.probes
                if probe.edgeId[1] in master.lookup[self.edgeTuple[0]]
                and probe.finalNodeId in master.lookup[self.edgeTuple[1]]
            ][0]
        else:
            probe = \
            [probe for probe in master.probes if
             probe.edgeId[1] in master.lookup[self.edgeTuple[0]] and probe.donorBaseNodeId in
             master.lookup[
                 self.edgeTuple[1]]][0]
        self.probe = probe
        iFrame = Frame(self)
        c = Canvas(iFrame, width=35, height=35)
        c.pack()

        #Success Icon
        img = openImage(
            maskgen.tool_set.get_icon('RedX.png') if probe.
            failure else maskgen.tool_set.get_icon('check.png'))
        self.successIcon = ImageTk.PhotoImage(
            imageResizeRelative(img, (30, 30), img.size).toPIL())
        c.create_image(15,
                       15,
                       image=self.successIcon,
                       anchor=CENTER,
                       tag='things')

        #Layout
        row = 0
        col = 0
        self.optionsLabel = Label(self, text=self.link, font=(None, 10))
        self.optionsLabel.grid(row=row,
                               columnspan=3,
                               sticky='EW',
                               padx=(40, 0),
                               pady=10)
        iFrame.grid(column=0, row=0, columnspan=1, sticky=W)
        row += 1
        self.operationVar = StringVar(value="Operation [ Semantic Groups ]:")
        self.operationLabel = Label(self,
                                    textvariable=self.operationVar,
                                    justify=LEFT)
        self.semanticFrame = SemanticFrame(self)
        self.semanticFrame.grid(row=row + 1,
                                column=0,
                                columnspan=2,
                                sticky=N + W,
                                rowspan=1,
                                pady=10)
        row += 2
        #cImageFrame is used for plot, image and overlay
        self.cImgFrame = ttk.Notebook(self)
        self.cImgFrame.bind('<<NotebookTabChanged>>',
                            lambda a: self.frameMove())
        self.cImgFrame.grid(row=row, rowspan=8)
        self.descriptionVar = StringVar()
        self.descriptionLabel = Label(self,
                                      textvariable=self.operationVar,
                                      justify=LEFT)
        row += 8
        self.operationLabel.grid(row=row, columnspan=3, sticky='W', padx=10)
        row += 1
        textscroll = Scrollbar(self)
        textscroll.grid(row=row, column=col + 1, sticky=NS)
        self.commentBox = Text(self,
                               height=5,
                               width=80,
                               yscrollcommand=textscroll.set,
                               relief=SUNKEN)
        self.master.commentsBoxes[self.link] = self.commentBox
        self.commentBox.grid(row=row,
                             column=col,
                             padx=5,
                             pady=5,
                             columnspan=1,
                             rowspan=2,
                             sticky=NSEW)
        textscroll.config(command=self.commentBox.yview)
        col = 3
        row = 0
        scroll = Scrollbar(self)
        scroll.grid(row=row,
                    column=col + 2,
                    rowspan=5,
                    columnspan=1,
                    sticky=NS)

        self.pathList = Listbox(self,
                                width=30,
                                yscrollcommand=scroll.set,
                                selectmode=EXTENDED,
                                exportselection=0)
        self.pathList.grid(row=row,
                           column=col - 1,
                           rowspan=5,
                           columnspan=3,
                           padx=(30, 10),
                           pady=(20, 20))
        self.master.pathboxes[self] = self.semanticFrame.getListbox()
        scroll.config(command=self.pathList.yview)
        self.transitionVar = StringVar()

        edge = master.scModel.getGraph().get_edge(probe.edgeId[0],
                                                  probe.edgeId[1])
        self.operationVar.set(self.operationVar.get() +
                              master._compose_label(edge))
        master.edges[self] = [edge, self.semanticFrame.getListbox()]
        for sg in edge['semanticGroups'] if 'semanticGroups' in edge else []:
            self.semanticFrame.insertListbox(ANCHOR, sg)
        operation = master.scModel.getGroupOperationLoader(
        ).getOperationWithGroups(edge['op'])

        #QA checkboxes
        if operation.qaList is not None:
            args = getValue(edge, 'arguments', {})
            self.curOpList = [x for x in operation.qaList]
            for item_pos in range(len(self.curOpList)):
                item = self.curOpList[item_pos]
                try:
                    self.curOpList[item_pos] = item.format(**args)
                except:
                    pass
        else:
            self.curOpList = []
        row += 5
        if self.curOpList is None:
            master.qaData.set_qalink_status(self.link, 'yes')

        for q in self.curOpList:
            box_label = Label(self, text=q, wraplength=250, justify=LEFT)
            ck = Chkbox(parent=self,
                        dialog=master,
                        label=box_label,
                        value=master.qaData.get_qalink_status(link=link))
            ck.box.grid(row=row, column=col - 1)
            ck.label.grid(row=row, column=col, columnspan=4, sticky='W')
            self.checkboxes.boxes.append(ck)
            row += 1
        master.checkboxes[self] = self.checkboxes

        # Main Features- load the overlay for images, load plot graph & overlay page for videos
        if ('<-' in self.link and probe.donorVideoSegments is None
            ) or probe.targetVideoSegments is None:
            self.load_overlay(initialize=True)
        else:
            self.transitionString(None)
            self.setUpFrames()

        #Comment section
        currentComment = master.qaData.get_qalink_caption(self.link)
        self.commentBox.delete(1.0, END)
        self.commentBox.insert(
            END, currentComment if currentComment is not None else '')

        #Navigation Buttons
        self.acceptButton = Button(self,
                                   text='Next',
                                   command=master.nex,
                                   width=15)
        self.acceptButton.grid(row=12,
                               column=col + 2,
                               columnspan=2,
                               sticky='E',
                               padx=(20, 20))
        self.prevButton = Button(self,
                                 text='Previous',
                                 command=master.pre,
                                 width=15)
        self.prevButton.grid(row=12,
                             column=col - 1,
                             columnspan=2,
                             sticky='W',
                             padx=(20, 20))

        self.acceptnButton = Button(self,
                                    text='Next Unchecked',
                                    command=master.nexCheck,
                                    width=15)
        self.acceptnButton.grid(row=13,
                                column=col + 2,
                                columnspan=2,
                                sticky='E',
                                padx=(20, 20))
        self.prevnButton = Button(self,
                                  text='Previous Unchecked',
                                  command=master.preCheck,
                                  width=15)
        self.prevnButton.grid(row=13,
                              column=col - 1,
                              columnspan=2,
                              sticky='W',
                              padx=(20, 20))
        row = 14
        #Progress Bar
        pb = ttk.Progressbar(self,
                             orient='horizontal',
                             mode='determinate',
                             maximum=100.0001)
        pb.grid(row=row, column=0, sticky=EW, columnspan=8)
        pb.step(master.progress * 100)

        master.progressBars.append(pb)
示例#8
0
    def processProbe(self, probe):
        """
        :param probe:
        :return:
        @type probe: Probe
        """
        expected_probe_id = probe.targetBaseNodeId + '_' + str(
            probe.edgeId) + '_' + probe.finalNodeId + '_' + str(
                probe.donorBaseNodeId)
        if expected_probe_id not in self.probes_data:
            return ['Missing Probe']
        expected_probe = self.probes_data[expected_probe_id]
        self.notprocessed.pop(expected_probe_id)
        errors = []

        if probe.targetMaskFileName is None:
            if expected_probe.targetMaskFileName is not None:
                errors.append('Expected targetMaskFileName {}'.format(
                    expected_probe.targetMaskFileName))
        elif probe.targetMaskFileName is not None and expected_probe.targetMaskFileName is None:
            errors.append('Got unexpected targetMaskFileName {}'.format(
                probe.targetMaskFileName))
        else:
            if not compare_mask_images(
                    probe.targetMaskImage,
                    openImage(
                        os.path.join(self.results_dir,
                                     expected_probe.targetMaskFileName))):
                errors.append('Mask mismatch targetMaskFileName {}'.format(
                    expected_probe.targetMaskFileName))

        if probe.donorMaskFileName is None:
            if expected_probe.donorMaskFileName is not None:
                errors.append('Expected donorMaskFileName {}'.format(
                    expected_probe.donorMaskFileName))
        elif probe.donorMaskFileName is not None and expected_probe.donorMaskFileName is None:
            errors.append('Got unexpected donorMaskFileName {}'.format(
                probe.donorMaskFileName))
        else:
            if not compare_mask_images(
                    probe.donorMaskImage,
                    openImage(
                        os.path.join(self.results_dir,
                                     expected_probe.donorMaskFileName))):
                errors.append('Mask mismatch donorMaskFileName {}'.format(
                    expected_probe.donorMaskFileName))

        if not probe.targetVideoSegments and expected_probe.targetVideoSegments:
            errors.append('Missing target segments')
        elif expected_probe.targetVideoSegments and probe.targetVideoSegments:
            errors.extend(
                match_video_segments(expected_probe.targetVideoSegments,
                                     probe.targetVideoSegments))

        if not probe.donorVideoSegments and expected_probe.donorVideoSegments:
            errors.append('Missing donor segments')
        elif expected_probe.donorVideoSegments and probe.donorVideoSegments:
            errors.extend(
                match_video_segments(expected_probe.donorVideoSegments,
                                     probe.donorVideoSegments))

        return errors