コード例 #1
0
    def doCalibration(self, calibrationPoints):
        if self.eyetracker is None:
            return

        self.points = calibrationPoints
        self.point_index = -1

        img = Image.new('RGB', self.experWin.size)
        draw = ImageDraw.Draw(img)

        self.calin = psychopy.visual.Circle(
            self.testWin, radius=2, fillColor=(0.0, 0.0, 0.0))
        self.calout = psychopy.visual.Circle(
            self.testWin, radius=64, lineColor=(0.0, 1.0, 0.0))
        self.calresult = psychopy.visual.SimpleImageStim(self.experWin, img)
        self.calresultmsg = psychopy.visual.TextStim(
            self.experWin, pos=(0, -self.experWin.size[1] / 4))
        self.promptone = psychopy.visual.TextStim(
            self.experWin, pos=(0, -self.experWin.size[1] / 4))
        self.promptone.setText('Press space bar when ready to calibrate.')
        self.prompttwo = psychopy.visual.TextStim(
            self.testWin, pos=(0, -self.testWin.size[1] / 4))
        self.prompttwo.setText(
            'Focus your eyes on the center of the circles that appear.')

        self.initcalibration_completed = False
        print "StartCalibration"
        self.eyetracker.StartCalibration(self.on_calib_start)
        while not self.initcalibration_completed:
            time.sleep(0.01)
        waitkey = True
        while waitkey:
            for key in psychopy.event.getKeys():
                if key == 'space':
                    waitkey = False

            self.calout.draw()
            self.calin.draw()
            self.promptone.draw()
            self.prompttwo.draw()
            self.testWin.flip()
            self.experWin.flip()

        clock = psychopy.core.Clock()
        for self.point_index in range(len(self.points)):
            p = Point2D()
            p.x, p.y = self.points[self.point_index]
            self.calin.setPos(
                ((p.x - 0.5) * self.testWin.size[0], (0.5 - p.y) * self.testWin.size[1]))
            self.calout.setPos(
                ((p.x - 0.5) * self.testWin.size[0], (0.5 - p.y) * self.testWin.size[1]))

            clock.reset()
            currentTime = clock.getTime()
            while currentTime < 1.5:
                self.calout.setRadius(40 * (1.5 - (currentTime)) + 4)
                psychopy.event.getKeys()
                self.calout.draw()
                self.calin.draw()
                self.testWin.flip()
                currentTime = clock.getTime()
            self.add_point_completed = False
            self.eyetracker.AddCalibrationPoint(p, self.on_add_completed)
            while not self.add_point_completed:
                psychopy.event.getKeys()
                self.calout.draw()
                self.calin.draw()
                self.testWin.flip()

        self.computeCalibration_completed = False
        self.computeCalibration_succeeded = False
        self.eyetracker.ComputeCalibration(self.on_calib_compute)
        while not self.computeCalibration_completed:
            time.sleep(0.01)
        self.eyetracker.StopCalibration(None)

        self.testWin.flip()
        self.experWin.flip()

        self.getcalibration_completed = False
        self.calib = self.eyetracker.GetCalibration(self.on_calib_response)
        while not self.getcalibration_completed:
            time.sleep(0.01)

        draw.rectangle(
            ((0, 0), tuple(self.experWin.size)), fill=(128, 128, 128))
        if not self.computeCalibration_succeeded:
            # computeCalibration failed.
            self.calresultmsg.setText(
                'Not enough data was collected (Retry:r/Abort:ESC)')

        elif self.calib == None:
            # no calibration data
            self.calresultmsg.setText(
                'No calibration data (Retry:r/Abort:ESC)')
        else:
            points = {}
            for data in self.calib.plot_data:
                points[data.true_point] = {
                    'left': data.left, 'right': data.right}

            if len(points) == 0:
                self.calresultmsg.setText(
                    'No true calibration data (Retry:r/Abort:ESC)')

            else:
                for p, d in points.iteritems():
                    # MODIFIED: validity -> status
                    if d['left'].status == 1:
                        draw.line(((p.x * self.experWin.size[0], p.y * self.experWin.size[1]),
                                   (d['left'].map_point.x * self.experWin.size[0],
                                    d['left'].map_point.y * self.experWin.size[1])), fill=(255, 0, 0))
                    # MODIFIED: validity -> status
                    if d['right'].status == 1:
                        draw.line(((p.x * self.experWin.size[0], p.y * self.experWin.size[1]),
                                   (d['right'].map_point.x * self.experWin.size[0],
                                    d['right'].map_point.y * self.experWin.size[1])), fill=(0, 255, 0))
                    draw.ellipse(((p.x * self.experWin.size[0] - 10, p.y * self.experWin.size[1] - 10),
                                  (p.x * self.experWin.size[0] + 10, p.y * self.experWin.size[1] + 10)),
                                 outline=(0, 0, 0))
                self.calresultmsg.setText(
                    'Accept calibration results (Accept:a/Retry:r/Abort:ESC)')

        self.calresult.setImage(img)

        waitkey = True
        while waitkey:
            for key in psychopy.event.getKeys():
                if key == 'a':
                    retval = 'accept'
                    waitkey = False
                elif key == 'r':
                    retval = 'retry'
                    waitkey = False
                elif key == 'escape':
                    retval = 'abort'
                    waitkey = False
            self.calresult.draw()
            self.calresultmsg.draw()
            self.experWin.flip()

        return retval
コード例 #2
0
    def doCalibration(self, calibrationPoints):
        if self.eyetracker is None:
            return

        self.points = calibrationPoints
        self.point_index = -1

        img = Image.new('RGB', self.experWin.size)
        draw = ImageDraw.Draw(img)

        self.calin = psychopy.visual.Circle(self.testWin,
                                            radius=2,
                                            fillColor=(0.0, 0.0, 0.0))
        self.calout = psychopy.visual.Circle(self.testWin,
                                             radius=64,
                                             lineColor=(0.0, 1.0, 0.0))
        self.calresult = psychopy.visual.SimpleImageStim(self.experWin, img)
        self.calresultmsg = psychopy.visual.TextStim(
            self.experWin, pos=(0, -self.experWin.size[1] / 4))
        self.promptone = psychopy.visual.TextStim(
            self.experWin, pos=(0, -self.experWin.size[1] / 4))
        self.promptone.setText('Press space bar when ready to calibrate.')
        self.prompttwo = psychopy.visual.TextStim(
            self.testWin, pos=(0, -self.testWin.size[1] / 4))
        self.prompttwo.setText(
            'Focus your eyes on the center of the circles that appear.')

        self.initcalibration_completed = False
        print "StartCalibration"
        self.eyetracker.StartCalibration(self.on_calib_start)
        while not self.initcalibration_completed:
            time.sleep(0.01)
        waitkey = True
        while waitkey:
            for key in psychopy.event.getKeys():
                if key == 'space':
                    waitkey = False

            self.calout.draw()
            self.calin.draw()
            self.promptone.draw()
            self.prompttwo.draw()
            self.testWin.flip()
            self.experWin.flip()

        clock = psychopy.core.Clock()
        for self.point_index in range(len(self.points)):
            p = Point2D()
            p.x, p.y = self.points[self.point_index]
            self.calin.setPos(((p.x - 0.5) * self.testWin.size[0],
                               (0.5 - p.y) * self.testWin.size[1]))
            self.calout.setPos(((p.x - 0.5) * self.testWin.size[0],
                                (0.5 - p.y) * self.testWin.size[1]))

            clock.reset()
            currentTime = clock.getTime()
            while currentTime < 1.5:
                self.calout.setRadius(40 * (1.5 - (currentTime)) + 4)
                psychopy.event.getKeys()
                self.calout.draw()
                self.calin.draw()
                self.testWin.flip()
                currentTime = clock.getTime()
            self.add_point_completed = False
            self.eyetracker.AddCalibrationPoint(p, self.on_add_completed)
            while not self.add_point_completed:
                psychopy.event.getKeys()
                self.calout.draw()
                self.calin.draw()
                self.testWin.flip()

        self.computeCalibration_completed = False
        self.computeCalibration_succeeded = False
        self.eyetracker.ComputeCalibration(self.on_calib_compute)
        while not self.computeCalibration_completed:
            time.sleep(0.01)
        self.eyetracker.StopCalibration(None)

        self.testWin.flip()
        self.experWin.flip()

        self.getcalibration_completed = False
        self.calib = self.eyetracker.GetCalibration(self.on_calib_response)
        while not self.getcalibration_completed:
            time.sleep(0.01)

        draw.rectangle(((0, 0), tuple(self.experWin.size)),
                       fill=(128, 128, 128))
        if not self.computeCalibration_succeeded:
            # computeCalibration failed.
            self.calresultmsg.setText(
                'Not enough data was collected (Retry:r/Abort:ESC)')

        elif self.calib == None:
            # no calibration data
            self.calresultmsg.setText(
                'No calibration data (Retry:r/Abort:ESC)')
        else:
            points = {}
            for data in self.calib.plot_data:
                points[data.true_point] = {
                    'left': data.left,
                    'right': data.right
                }

            if len(points) == 0:
                self.calresultmsg.setText(
                    'No true calibration data (Retry:r/Abort:ESC)')

            else:
                for p, d in points.iteritems():
                    # MODIFIED: validity -> status
                    if d['left'].status == 1:
                        draw.line(
                            ((p.x * self.experWin.size[0],
                              p.y * self.experWin.size[1]),
                             (d['left'].map_point.x * self.experWin.size[0],
                              d['left'].map_point.y * self.experWin.size[1])),
                            fill=(255, 0, 0))
                    # MODIFIED: validity -> status
                    if d['right'].status == 1:
                        draw.line(
                            ((p.x * self.experWin.size[0],
                              p.y * self.experWin.size[1]),
                             (d['right'].map_point.x * self.experWin.size[0],
                              d['right'].map_point.y * self.experWin.size[1])),
                            fill=(0, 255, 0))
                    draw.ellipse(((p.x * self.experWin.size[0] - 10,
                                   p.y * self.experWin.size[1] - 10),
                                  (p.x * self.experWin.size[0] + 10,
                                   p.y * self.experWin.size[1] + 10)),
                                 outline=(0, 0, 0))
                self.calresultmsg.setText(
                    'Accept calibration results (Accept:a/Retry:r/Abort:ESC)')

        self.calresult.setImage(img)

        waitkey = True
        while waitkey:
            for key in psychopy.event.getKeys():
                if key == 'a':
                    retval = 'accept'
                    waitkey = False
                elif key == 'r':
                    retval = 'retry'
                    waitkey = False
                elif key == 'escape':
                    retval = 'abort'
                    waitkey = False
            self.calresult.draw()
            self.calresultmsg.draw()
            self.experWin.flip()

        return retval
コード例 #3
0
ファイル: letobii.py プロジェクト: TheChymera/E2att
    def doCalibration(self,calibrationPoints):
        if self.eyetracker is None:
            return
			        
        self.points = calibrationPoints
        self.point_index = -1
        
        img = Image.new('RGB',self.win.size)
        draw = ImageDraw.Draw(img)
        
        self.calin = psychopy.visual.Circle(self.win,units="pix",radius=2,fillColor=(0.0,0.0,0.0))
        self.calout = psychopy.visual.Circle(self.win,units="pix",lineWidth=2,radius=64,lineColor=(1.0,0.2,0.0))
        self.calresult = psychopy.visual.SimpleImageStim(self.win,img)
        self.calresultmsg = psychopy.visual.TextStim(self.win,units="pix",pos=(0,-self.win.size[1]/4), color=[0,0,0])
        
        self.initcalibration_completed = False
        print "StartCalibration"
        self.eyetracker.StartCalibration(lambda error, r: self.on_calib_start(error, r))
        while not self.initcalibration_completed:
            pass
			
        waitkey = True
        while waitkey:
            for key in psychopy.event.getKeys():
				if key=='space':
					waitkey = False				
            self.calout.draw()
            self.calin.draw()
            self.calresultmsg.setText('Press the space bar to start calibration.')
            self.calresultmsg.draw()
            self.win.flip()
        		
        clock = psychopy.core.Clock()
        for self.point_index in range(len(self.points)):
            p = Point2D()
            p.x, p.y = self.points[self.point_index]
            self.calin.setPos(((p.x-0.5)*self.win.size[0],(0.5-p.y)*self.win.size[1]), units="pix")
            self.calout.setPos(((p.x-0.5)*self.win.size[0],(0.5-p.y)*self.win.size[1]), units="pix")
            
            clock.reset()
            currentTime = clock.getTime()
            while currentTime < 1.5:
                self.calout.setRadius(40*(1.5-(currentTime))+4)
                psychopy.event.getKeys()
                self.calout.draw()
                self.calin.draw()
                self.win.flip()
                currentTime = clock.getTime()
            self.add_point_completed = False
            self.eyetracker.AddCalibrationPoint(p, lambda error, r: self.on_add_completed(error, r))
            while not self.add_point_completed:
                psychopy.event.getKeys()
                self.calout.draw()
                self.calin.draw()
                self.win.flip()
         
        self.computeCalibration_completed = False
        self.computeCalibration_succeeded = False
        self.eyetracker.ComputeCalibration(lambda error, r: self.on_calib_compute(error, r))
        while not self.computeCalibration_completed:
            pass
        self.eyetracker.StopCalibration(None)
        
        self.win.flip()
        
        self.getcalibration_completed = False
        self.calib = self.eyetracker.GetCalibration(lambda error, calib: self.on_calib_response(error, calib))
        while not self.getcalibration_completed:
            pass
        
        draw.rectangle(((0,0),tuple(self.win.size)),fill=(254,254,254))
        if not self.computeCalibration_succeeded:
            #computeCalibration failed.
            self.calresultmsg.setText('Not enough data was collected (Retry:r/Abort:ESC)')
            
        elif self.calib == None:
            #no calibration data
            self.calresultmsg.setText('No calibration data (Retry:r/Abort:ESC)')
        else:
            points = {}
            for data in self.calib.plot_data:
                points[data.true_point] = {'left':data.left, 'right':data.right}
            
            if len(points) == 0:
                self.calresultmsg.setText('No ture calibration data (Retry:r/Abort:ESC)')
            
            else:
                for p,d in points.iteritems():
                    if d['left'].status == 1:
                        draw.line(((p.x*self.win.size[0],p.y*self.win.size[1]),
                                   (d['left'].map_point.x*self.win.size[0],
                                    d['left'].map_point.y*self.win.size[1])),fill=(255,0,0))
                    if d['right'].status == 1:
                        draw.line(((p.x*self.win.size[0],p.y*self.win.size[1]),
                                   (d['right'].map_point.x*self.win.size[0],
                                    d['right'].map_point.y*self.win.size[1])),fill=(0,255,0))
                    draw.ellipse(((p.x*self.win.size[0]-10,p.y*self.win.size[1]-10),
                                  (p.x*self.win.size[0]+10,p.y*self.win.size[1]+10)),
                                 outline=(0,0,0))
                self.calresultmsg.setText('Accept calibration results (Accept:a/Retry:r/Abort:ESC)')
                
        self.calresult.setImage(img)
        
        waitkey = True
        while waitkey:
            for key in psychopy.event.getKeys():
                if key == 'a':
                    retval = 'accept'
                    waitkey = False
                elif key == 'r':
                    retval = 'retry'
                    waitkey = False
                elif key == 'escape':
                    retval = 'abort'
                    waitkey = False
            self.calresult.draw()
            self.calresultmsg.draw()
            self.win.flip()
        
        return retval