def __init__(self, display):
"""Initiates an eyetracker dummy object, that simulates gaze position using the mouse
arguments
display -- a pygaze display.Display instance
keyword arguments
None
"""
# try to copy docstrings (but ignore it if it fails, as we do
# not need it for actual functioning of the code)
try:
copy_docstr(BaseEyeTracker, Dummy)
except:
# we're not even going to show a warning, since the copied
# docstring is useful for code editors; these load the docs
# in a non-verbose manner, so warning messages would be lost
pass
self.recording = False
self.blinking = False
self.bbpos = (settings.DISPSIZE[0]/2, settings.DISPSIZE[1]/2)
self.resolution = settings.DISPSIZE[:]
self.simulator = Mouse(disptype=settings.DISPTYPE, mousebuttonlist=None,
timeout=2, visible=False)
self.kb = Keyboard(disptype=settings.DISPTYPE, keylist=None,
timeout=None)
self.angrybeep = Sound(osc='saw',freq=100, length=100, attack=0,
decay=0, soundfile=None)
self.display = display
self.screen = Screen(disptype=settings.DISPTYPE, mousevisible=False)
def confirm_abort_experiment(self):
"""
Asks for confirmation before aborting the experiment. Displays a
confirmation screen, collects the response, and acts accordingly.
Exceptions:
Raises a response_error upon confirmation.
Returns:
False if no confirmation was given.
"""
# Display the confirmation screen
scr = Screen(disptype=DISPTYPE)
kb = Keyboard(timeout=5000)
yc = DISPSIZE[1]/2
xc = DISPSIZE[0]/2
ld = 40 # Line height
scr.draw_text(u'Really abort experiment?', pos=(xc, yc-3*ld))
scr.draw_text(u'Press \'Y\' to abort', pos=(xc, yc-0.5*ld))
scr.draw_text(u'Press any other key or wait 5s to go to setup', \
pos=(xc, yc+0.5*ld))
self.display.fill(scr)
self.display.show()
# process the response:
try:
key, time = kb.get_key()
except:
return False
# if confirmation, close experiment
if key == u'y':
raise Exception(u'The experiment was aborted')
self.eyelink_graphics.esc_pressed = False
return False
开发者ID:AA33,项目名称:PyGaze,代码行数:35,代码来源:libeyelink.py
示例3: draw_menu_screen
def draw_menu_screen(self):
"""
desc:
Draws the menu screen.
"""
self.menuscreen = Screen(disptype=settings.DISPTYPE, mousevisible=False)
self.menuscreen.draw_text(text="Eyelink calibration menu",
pos=(self.xc,self.yc-6*self.ld), center=True, font='mono',
fontsize=int(2*self.fontsize), antialias=True)
self.menuscreen.draw_text(text="%s (pygaze %s, pylink %s)" \
% (self.libeyelink.eyelink_model, pygaze.version,
pylink.__version__), pos=(self.xc,self.yc-5*self.ld), center=True,
font='mono', fontsize=int(.8*self.fontsize), antialias=True)
self.menuscreen.draw_text(text="Press C to calibrate",
pos=(self.xc, self.yc-3*self.ld), center=True, font='mono',
fontsize=self.fontsize, antialias=True)
self.menuscreen.draw_text(text="Press V to validate",
pos=(self.xc, self.yc-2*self.ld), center=True, font='mono',
fontsize=self.fontsize, antialias=True)
self.menuscreen.draw_text(text="Press A to auto-threshold",
pos=(self.xc,self.yc-1*self.ld), center=True, font='mono',
fontsize=self.fontsize, antialias=True)
self.menuscreen.draw_text(text="Press I to toggle extra info in camera image",
pos=(self.xc,self.yc-0*self.ld), center=True, font='mono',
fontsize=self.fontsize, antialias=True)
self.menuscreen.draw_text(text="Press Enter to show camera image",
pos=(self.xc,self.yc+1*self.ld), center=True, font='mono',
fontsize=self.fontsize, antialias=True)
self.menuscreen.draw_text(
text="(then change between images using the arrow keys)",
pos=(self.xc, self.yc+2*self.ld), center=True, font='mono',
fontsize=self.fontsize, antialias=True)
self.menuscreen.draw_text(text="Press Escape to abort experiment",
pos=(self.xc, self.yc+4*self.ld), center=True, font='mono',
fontsize=self.fontsize, antialias=True)
self.menuscreen.draw_text(text="Press Q to exit menu",
pos=(self.xc, self.yc+5*self.ld), center=True, font='mono',
fontsize=self.fontsize, antialias=True)
class EyelinkGraphics(custom_display):
"""
Implements the EyeLink graphics that are shown on the experimental PC, such
as the camera image, and the calibration dots. This class only implements
the drawing operations, and little to no of the logic behind the set-up,
which is implemented in PyLink.
"""
def __init__(self, libeyelink, tracker):
"""
Constructor.
Arguments:
libeyelink -- A libeyelink object.
tracker -- An tracker object as returned by pylink.EyeLink().
"""
pylink.EyeLinkCustomDisplay.__init__(self)
# objects
self.libeyelink = libeyelink
self.display = libeyelink.display
self.screen = Screen(disptype=DISPTYPE, mousevisible=False)
self.kb = Keyboard(keylist=None, timeout=0)
self.mouse = Mouse(timeout=0)
if DISPTYPE == "pygame":
self.kb.set_timeout(timeout=0.001)
# If we are using a DISPTYPE that cannot be used directly, we have to
# save the camera image to a temporary file on each frame.
# if DISPTYPE not in ('pygame', 'psychopy'):
import tempfile
import os
self.tmp_file = os.path.join(tempfile.gettempdir(), "__eyelink__.jpg")
# drawing properties
self.xc = self.display.dispsize[0] / 2
self.yc = self.display.dispsize[1] / 2
self.extra_info = True
self.ld = 40 # line distance
self.fontsize = libeyelink.fontsize
self.title = ""
self.display_open = True
# menu
self.menuscreen = Screen(disptype=DISPTYPE, mousevisible=False)
self.menuscreen.draw_text(
text="Eyelink calibration menu",
pos=(self.xc, self.yc - 6 * self.ld),
center=True,
font="mono",
fontsize=int(2 * self.fontsize),
antialias=True,
)
self.menuscreen.draw_text(
text="%s (pygaze %s, pylink %s)" % (libeyelink.eyelink_model, pygaze.version, pylink.__version__),
pos=(self.xc, self.yc - 5 * self.ld),
center=True,
font="mono",
fontsize=int(0.8 * self.fontsize),
antialias=True,
)
self.menuscreen.draw_text(
text="Press C to calibrate",
pos=(self.xc, self.yc - 3 * self.ld),
center=True,
font="mono",
fontsize=self.fontsize,
antialias=True,
)
self.menuscreen.draw_text(
text="Press V to validate",
pos=(self.xc, self.yc - 2 * self.ld),
center=True,
font="mono",
fontsize=self.fontsize,
antialias=True,
)
self.menuscreen.draw_text(
text="Press A to auto-threshold",
pos=(self.xc, self.yc - 1 * self.ld),
center=True,
font="mono",
fontsize=self.fontsize,
antialias=True,
)
self.menuscreen.draw_text(
text="Press I to toggle extra info in camera image",
pos=(self.xc, self.yc - 0 * self.ld),
center=True,
font="mono",
fontsize=self.fontsize,
antialias=True,
)
self.menuscreen.draw_text(
text="Press Enter to show camera image",
pos=(self.xc, self.yc + 1 * self.ld),
center=True,
font="mono",
fontsize=self.fontsize,
#.........这里部分代码省略.........
def __init__(self, display, ip='127.0.0.1', sendport=4444, receiveport= \
5555, logfile=LOGFILE, eventdetection=EVENTDETECTION, \
saccade_velocity_threshold=35, saccade_acceleration_threshold=9500, \
**args):
"""Initializes the SMItracker object
arguments
display -- a pygaze.display.Display instance
keyword arguments
ip -- internal ip address for iViewX (default =
'127.0.0.1')
sendport -- port number for iViewX sending (default = 4444)
receiveport -- port number for iViewX receiving (default = 5555)
logfile -- logfile name (string value); note that this is the
name for the SMI logfile, NOT the .idf file
(default = LOGFILE)
"""
# try to copy docstrings (but ignore it if it fails, as we do
# not need it for actual functioning of the code)
try:
copy_docstr(BaseEyeTracker, SMITracker)
except:
# we're not even going to show a warning, since the copied
# docstring is useful for code editors; these load the docs
# in a non-verbose manner, so warning messages would be lost
pass
# object properties
self.disp = display
self.screen = Screen()
self.dispsize = DISPSIZE # display size in pixels
self.screensize = SCREENSIZE # display size in cm
self.kb = Keyboard(keylist=['space', 'escape', 'q'], timeout=1)
self.errorbeep = Sound(osc='saw',freq=100, length=100)
# output file properties
self.outputfile = logfile
self.description = "experiment" # TODO: EXPERIMENT NAME
self.participant = "participant" # TODO: PP NAME
# eye tracker properties
self.connected = False
self.recording = False
self.eye_used = 0 # 0=left, 1=right, 2=binocular
self.left_eye = 0
self.right_eye = 1
self.binocular = 2
self.errdist = 2 # degrees; maximal error for drift correction
self.maxtries = 100 # number of samples obtained before giving up (for obtaining accuracy and tracker distance information, as well as starting or stopping recording)
self.prevsample = (-1,-1)
self.prevps = -1
# event detection properties
self.fixtresh = 1.5 # degrees; maximal distance from fixation start (if gaze wanders beyond this, fixation has stopped)
self.fixtimetresh = 100 # milliseconds; amount of time gaze has to linger within self.fixtresh to be marked as a fixation
self.spdtresh = saccade_velocity_threshold # degrees per second; saccade velocity threshold
self.accthresh = saccade_acceleration_threshold # degrees per second**2; saccade acceleration threshold
self.eventdetection = eventdetection
self.set_detection_type(self.eventdetection)
self.weightdist = 10 # weighted distance, used for determining whether a movement is due to measurement error (1 is ok, higher is more conservative and will result in only larger saccades to be detected)
# set logger
res = iViewXAPI.iV_SetLogger(c_int(1), c_char_p(logfile + '_SMILOG.txt'))
if res != 1:
err = errorstring(res)
raise Exception("Error in libsmi.SMItracker.__init__: failed to set logger; %s" % err)
# first logger argument is for logging type (I'm guessing these are decimal bit codes)
# LOG status bitcode
# 1 = LOG_LEVEL_BUG 00001
# 2 = LOG_LEVEL_iV_FCT 00010
# 4 = LOG_LEVEL_ETCOM 00100
# 8 = LOG_LEVEL_ALL 01000
# 16 = LOG_LEVEL_IV_COMMAND 10000
# these can be used together, using a bitwise or, e.g.: 1|2|4 (bitcode 00111)
# connect to iViewX
res = iViewXAPI.iV_Connect(c_char_p(ip), c_int(sendport), c_char_p(ip), c_int(receiveport))
if res == 1:
res = iViewXAPI.iV_GetSystemInfo(byref(systemData))
self.samplerate = systemData.samplerate
self.sampletime = 1000.0 / self.samplerate
if res != 1:
err = errorstring(res)
raise Exception("Error in libsmi.SMItracker.__init__: failed to get system information; %s" % err)
# handle connection errors
else:
self.connected = False
err = errorstring(res)
raise Exception("Error in libsmi.SMItracker.__init__: establishing connection failed; %s" % err)
# initiation report
self.log("pygaze initiation report start")
self.log("experiment: %s" % self.description)
self.log("participant: %s" % self.participant)
self.log("display resolution: %sx%s" % (self.dispsize[0],self.dispsize[1]))
self.log("display size in cm: %sx%s" % (self.screensize[0],self.screensize[1]))
self.log("samplerate: %s Hz" % self.samplerate)
#.........这里部分代码省略.........
开发者ID:AA33,项目名称:PyGaze,代码行数:101,代码来源:libsmi.py
示例8: SMItracker
class SMItracker(BaseEyeTracker):
"""A class for SMI eye tracker objects"""
def __init__(self, display, ip='127.0.0.1', sendport=4444, receiveport= \
5555, logfile=LOGFILE, eventdetection=EVENTDETECTION, \
saccade_velocity_threshold=35, saccade_acceleration_threshold=9500, \
**args):
"""Initializes the SMItracker object
arguments
display -- a pygaze.display.Display instance
keyword arguments
ip -- internal ip address for iViewX (default =
'127.0.0.1')
sendport -- port number for iViewX sending (default = 4444)
receiveport -- port number for iViewX receiving (default = 5555)
logfile -- logfile name (string value); note that this is the
name for the SMI logfile, NOT the .idf file
(default = LOGFILE)
"""
# try to copy docstrings (but ignore it if it fails, as we do
# not need it for actual functioning of the code)
try:
copy_docstr(BaseEyeTracker, SMITracker)
except:
# we're not even going to show a warning, since the copied
# docstring is useful for code editors; these load the docs
# in a non-verbose manner, so warning messages would be lost
pass
# object properties
self.disp = display
self.screen = Screen()
self.dispsize = DISPSIZE # display size in pixels
self.screensize = SCREENSIZE # display size in cm
self.kb = Keyboard(keylist=['space', 'escape', 'q'], timeout=1)
self.errorbeep = Sound(osc='saw',freq=100, length=100)
# output file properties
self.outputfile = logfile
self.description = "experiment" # TODO: EXPERIMENT NAME
self.participant = "participant" # TODO: PP NAME
# eye tracker properties
self.connected = False
self.recording = False
self.eye_used = 0 # 0=left, 1=right, 2=binocular
self.left_eye = 0
self.right_eye = 1
self.binocular = 2
self.errdist = 2 # degrees; maximal error for drift correction
self.maxtries = 100 # number of samples obtained before giving up (for obtaining accuracy and tracker distance information, as well as starting or stopping recording)
self.prevsample = (-1,-1)
self.prevps = -1
# event detection properties
self.fixtresh = 1.5 # degrees; maximal distance from fixation start (if gaze wanders beyond this, fixation has stopped)
self.fixtimetresh = 100 # milliseconds; amount of time gaze has to linger within self.fixtresh to be marked as a fixation
self.spdtresh = saccade_velocity_threshold # degrees per second; saccade velocity threshold
self.accthresh = saccade_acceleration_threshold # degrees per second**2; saccade acceleration threshold
self.eventdetection = eventdetection
self.set_detection_type(self.eventdetection)
self.weightdist = 10 # weighted distance, used for determining whether a movement is due to measurement error (1 is ok, higher is more conservative and will result in only larger saccades to be detected)
# set logger
res = iViewXAPI.iV_SetLogger(c_int(1), c_char_p(logfile + '_SMILOG.txt'))
if res != 1:
err = errorstring(res)
raise Exception("Error in libsmi.SMItracker.__init__: failed to set logger; %s" % err)
# first logger argument is for logging type (I'm guessing these are decimal bit codes)
# LOG status bitcode
# 1 = LOG_LEVEL_BUG 00001
# 2 = LOG_LEVEL_iV_FCT 00010
# 4 = LOG_LEVEL_ETCOM 00100
# 8 = LOG_LEVEL_ALL 01000
# 16 = LOG_LEVEL_IV_COMMAND 10000
# these can be used together, using a bitwise or, e.g.: 1|2|4 (bitcode 00111)
# connect to iViewX
res = iViewXAPI.iV_Connect(c_char_p(ip), c_int(sendport), c_char_p(ip), c_int(receiveport))
if res == 1:
res = iViewXAPI.iV_GetSystemInfo(byref(systemData))
self.samplerate = systemData.samplerate
self.sampletime = 1000.0 / self.samplerate
if res != 1:
err = errorstring(res)
raise Exception("Error in libsmi.SMItracker.__init__: failed to get system information; %s" % err)
# handle connection errors
else:
self.connected = False
err = errorstring(res)
raise Exception("Error in libsmi.SMItracker.__init__: establishing connection failed; %s" % err)
# initiation report
self.log("pygaze initiation report start")
self.log("experiment: %s" % self.description)
#.........这里部分代码省略.........
开发者ID:AA33,项目名称:PyGaze,代码行数:101,代码来源:libsmi.py
示例9: __init__
def __init__(self,
display,
resolution=DISPSIZE,
data_file=LOGFILENAME + ".edf",
fg_color=FGC,
bg_color=BGC,
eventdetection=EVENTDETECTION,
saccade_velocity_threshold=35,
saccade_acceleration_threshold=9500,
force_drift_correct=True,
pupil_size_mode=EYELINKPUPILSIZEMODE,
**args):
"""See pygaze._eyetracker.baseeyetracker.BaseEyeTracker"""
# try to import copy docstring (but ignore it if it fails, as we do
# not need it for actual functioning of the code)
try:
copy_docstr(BaseEyeTracker, libeyelink)
except:
# we're not even going to show a warning, since the copied
# docstring is useful for code editors; these load the docs
# in a non-verbose manner, so warning messages would be lost
pass
global _eyelink
# Make sure that we have a valid data file. The local_data_file may
# contain a folder. The eyelink_data_file is only a basename, i.e.
# without folder. The eyelink_data_file must be at most eight characters
# and end with a `.edf` extension.
self.local_data_file = data_file
self.eyelink_data_file = os.path.basename(data_file)
stem, ext = os.path.splitext(self.eyelink_data_file)
if len(stem) > 8 or ext.lower() != '.edf':
raise Exception(
"The EyeLink cannot handle filenames longer than eight "
"characters (excluding '.edf' extension).")
# properties
self.display = display
self.fontsize = 18
self.scr = Screen(disptype=DISPTYPE, mousevisible=False)
self.kb = Keyboard(keylist=["escape", "q"], timeout=1)
self.resolution = resolution
self.recording = False
self.saccade_velocity_treshold = saccade_velocity_threshold
self.saccade_acceleration_treshold = saccade_acceleration_threshold
self.eye_used = None
self.left_eye = 0
self.right_eye = 1
self.binocular = 2
self.pupil_size_mode = pupil_size_mode
self.prevsample = (-1, -1)
self.prevps = -1
# event detection properties
# degrees; maximal distance from fixation start (if gaze wanders beyond
# this, fixation has stopped)
self.fixtresh = 1.5
# milliseconds; amount of time gaze has to linger within self.fixtresh
# to be marked as a fixation
self.fixtimetresh = 100
# degrees per second; saccade velocity threshold
self.spdtresh = self.saccade_velocity_treshold
# degrees per second**2; saccade acceleration threshold
self.accthresh = self.saccade_acceleration_treshold
self.set_detection_type(eventdetection)
# weighted distance, used for determining whether a movement is due to
# measurement error (1 is ok, higher is more conservative and will
# result in only larger saccades to be detected)
self.weightdist = 10
# distance between participant and screen in cm
self.screendist = SCREENDIST
# distance between participant and screen in cm
self.screensize = SCREENSIZE
self.pixpercm = (self.resolution[0]/float(self.screensize[0]) + \
self.resolution[1]/float(self.screensize[1])) / 2.0
# only initialize eyelink once
if _eyelink == None:
try:
_eyelink = pylink.EyeLink()
except:
raise Exception(
"Error in libeyelink.libeyelink.__init__(): Failed to "
"connect to the tracker!")
# determine software version of tracker
self.tracker_software_ver = 0
self.eyelink_ver = pylink.getEYELINK().getTrackerVersion()
if self.eyelink_ver == 3:
tvstr = pylink.getEYELINK().getTrackerVersionString()
vindex = tvstr.find("EYELINK CL")
self.tracker_software_ver = int(float(tvstr[(vindex + \
len("EYELINK CL")):].strip()))
if self.eyelink_ver == 1:
self.eyelink_model = 'EyeLink I'
elif self.eyelink_ver == 2:
self.eyelink_model = 'EyeLink II'
elif self.eyelink_ver == 3:
self.eyelink_model = 'EyeLink 1000'
else:
#.........这里部分代码省略.........
class EyelinkGraphics(custom_display):
"""
Implements the EyeLink graphics that are shown on the experimental PC, such
as the camera image, and the calibration dots. This class only implements
the drawing operations, and little to no of the logic behind the set-up,
which is implemented in PyLink.
"""
def __init__(self, display, tracker):
"""
Constructor.
Arguments:
display -- A PyGaze Display object.
tracker -- An tracker object as returned by pylink.EyeLink().
"""
pylink.EyeLinkCustomDisplay.__init__(self)
# objects
self.display = display
self.screen = Screen(disptype=DISPTYPE, mousevisible=False)
self.kb = Keyboard(keylist=None, timeout=1)
if DISPTYPE == 'pygame':
self.kb.set_timeout(timeout=0.001)
# If we are using a DISPTYPE that cannot be used directly, we have to
# save the camera image to a temporary file on each frame.
#if DISPTYPE not in ('pygame', 'psychopy'):
import tempfile
import os
self.tmp_file = os.path.join(tempfile.gettempdir(), \
'__eyelink__.jpg')
# drawing properties
self.xc = self.display.dispsize[0]/2
self.yc = self.display.dispsize[1]/2
self.ld = 40 # line distance
# menu
self.menuscreen = Screen(disptype=DISPTYPE, mousevisible=False)
self.menuscreen.draw_text(text="== Eyelink calibration menu ==", pos= \
(self.xc,self.yc-5*self.ld), center=True, font='mono', fontsize= \
12, antialias=True)
self.menuscreen.draw_text(text="Press C to calibrate", pos=(self.xc, \
self.yc-3*self.ld), center=True, font='mono', fontsize=12, \
antialias=True)
self.menuscreen.draw_text(text="Press V to validate", pos=(self.xc, \
self.yc-2*self.ld), center=True, font='mono', fontsize=12, \
antialias=True)
self.menuscreen.draw_text(text="Press A to auto-threshold", pos=( \
self.xc,self.yc-1*self.ld), center=True, font='mono', fontsize=12, \
antialias=True)
self.menuscreen.draw_text(text="Press Enter to show camera image", \
pos=(self.xc,self.yc+1*self.ld), center=True, font='mono', \
fontsize=12, antialias=True)
self.menuscreen.draw_text(text= \
"(then change between images using the arrow keys)", pos=(self.xc, \
self.yc+2*self.ld), center=True, font='mono', fontsize=12, \
antialias=True)
self.menuscreen.draw_text(text="Press Q to exit menu", pos=(self.xc, \
self.yc+5*self.ld), center=True, font='mono', fontsize=12, \
antialias=True)
# beeps
self.__target_beep__ = Sound(osc='sine', freq=440, length=50, attack= \
0, decay=0, soundfile=None)
self.__target_beep__done__ = Sound(osc='sine', freq=880, length=200, \
attack=0, decay=0, soundfile=None)
self.__target_beep__error__ = Sound(osc='sine', freq=220, length=200, \
attack=0, decay=0, soundfile=None)
# further properties
self.state = None
self.imagebuffer = array.array('l')
self.pal = None
self.size = (0,0)
self.set_tracker(tracker)
self.last_mouse_state = -1
def set_tracker(self, tracker):
"""
Connects the tracker to the graphics environment.
Arguments:
tracker -- An tracker object as returned by pylink.EyeLink().
"""
self.tracker = tracker
self.tracker_version = tracker.getTrackerVersion()
if self.tracker_version >= 3:
self.tracker.sendCommand("enable_search_limits=YES")
self.tracker.sendCommand("track_search_limits=YES")
self.tracker.sendCommand("autothreshold_click=YES")
self.tracker.sendCommand("autothreshold_repeat=YES")
self.tracker.sendCommand("enable_camera_position_detect=YES")
def setup_cal_display(self):
"""
Sets up the initial calibration display, which contains a menu with
instructions.
#.........这里部分代码省略.........
class EyeTribeTracker(BaseEyeTracker):
"""A class for EyeTribeTracker objects"""
def __init__(self, display, logfile=LOGFILE, eventdetection=EVENTDETECTION, \
saccade_velocity_threshold=35, saccade_acceleration_threshold=9500, \
**args):
"""Initializes the EyeTribeTracker object
arguments
display -- a pygaze.display.Display instance
keyword arguments
logfile -- logfile name (string value); note that this is the
name for the eye data log file (default = LOGFILE)
"""
# try to copy docstrings (but ignore it if it fails, as we do
# not need it for actual functioning of the code)
try:
copy_docstr(BaseEyeTracker, EyeTribeTracker)
except:
# we're not even going to show a warning, since the copied
# docstring is useful for code editors; these load the docs
# in a non-verbose manner, so warning messages would be lost
pass
# object properties
self.disp = display
self.screen = Screen()
self.dispsize = DISPSIZE # display size in pixels
self.screensize = SCREENSIZE # display size in cm
self.kb = Keyboard(keylist=['space', 'escape', 'q'], timeout=1)
self.errorbeep = Sound(osc='saw',freq=100, length=100)
# output file properties
self.outputfile = logfile
# eye tracker properties
self.connected = False
self.recording = False
self.errdist = 2 # degrees; maximal error for drift correction
self.pxerrdist = 30 # initial error in pixels
self.maxtries = 100 # number of samples obtained before giving up (for obtaining accuracy and tracker distance information, as well as starting or stopping recording)
self.prevsample = (-1,-1)
self.prevps = -1
# event detection properties
self.fixtresh = 1.5 # degrees; maximal distance from fixation start (if gaze wanders beyond this, fixation has stopped)
self.fixtimetresh = 100 # milliseconds; amount of time gaze has to linger within self.fixtresh to be marked as a fixation
self.spdtresh = saccade_velocity_threshold # degrees per second; saccade velocity threshold
self.accthresh = saccade_acceleration_threshold # degrees per second**2; saccade acceleration threshold
self.eventdetection = eventdetection
self.set_detection_type(self.eventdetection)
self.weightdist = 10 # weighted distance, used for determining whether a movement is due to measurement error (1 is ok, higher is more conservative and will result in only larger saccades to be detected)
# connect to the tracker
self.eyetribe = EyeTribe(logfilename=logfile)
# get info on the sample rate
self.samplerate = self.eyetribe._samplefreq
self.sampletime = 1000.0 * self.eyetribe._intsampletime
# initiation report
self.log("pygaze initiation report start")
self.log("display resolution: %sx%s" % (self.dispsize[0],self.dispsize[1]))
self.log("display size in cm: %sx%s" % (self.screensize[0],self.screensize[1]))
self.log("samplerate: %.2f Hz" % self.samplerate)
self.log("sampletime: %.2f ms" % self.sampletime)
self.log("fixation threshold: %s degrees" % self.fixtresh)
self.log("speed threshold: %s degrees/second" % self.spdtresh)
self.log("acceleration threshold: %s degrees/second**2" % self.accthresh)
self.log("pygaze initiation report end")
def calibrate(self):
"""Calibrates the eye tracking system
arguments
None
keyword arguments
None
returns
success -- returns True if calibration succeeded, or False if
not; in addition a calibration log is added to the
log file and some properties are updated (i.e. the
thresholds for detection algorithms)
"""
# CALIBRATION
# determine the calibration points
calibpoints = []
for x in [0.1,0.5,0.9]:
for y in [0.1,0.5,0.9]:
calibpoints.append((int(x*self.dispsize[0]),int(y*self.dispsize[1])))
random.shuffle(calibpoints)
#.........这里部分代码省略.........
请发表评论