ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – 在PsychoPy实验期间的截图

2019-07-22 19:57:17  阅读:410  来源: 互联网

标签:python screenshot psychopy


我正在尝试在我的心理任务期间捕获定时屏幕截图.我有一个固定十字架,然后是屏幕左侧和右侧的两个面,然后是一个点.我只想要两个面部出现在屏幕上的1秒时间段的屏幕截图.例程中有10个不同的面对,并且例程循环3次.理想情况下,我希望通过此代码将30张图像保存到我的计算机中.我的代码到目前为止:

from __future__ import division  # so that 1/3=0.333 instead of 1/3=0
from psychopy import visual, core, data, event, logging, sound, gui
from psychopy.constants import *  # things like STARTED, FINISHED
import numpy as np  # whole numpy lib is available, prepend 'np.'
from numpy import sin, cos, tan, log, log10, pi, average, sqrt, std, deg2rad, rad2deg,    linspace, asarray)
from numpy.random import random, randint, normal, shuffle
import os  # handy system and path functions

import socket
import time

# Store info about the experiment session
expName = 'DotProbe_EyeTracker_BSchool' 
expInfo = {u'session': u'001', u'participant': u''}
dlg = gui.DlgFromDict(dictionary=expInfo, title=expName)
if dlg.OK == False: core.quit()  # user pressed cancel
expInfo['date'] = data.getDateStr()  # add a simple timestamp
expInfo['expName'] = expName

# Setup files for saving
if not os.path.isdir('data'):
    os.makedirs('data')  # if this fails (e.g. permissions) we will get error
filename = 'data' + os.path.sep + '%s_%s' %(expInfo['participant'], expInfo['date'])
logFile = logging.LogFile(filename+'.log', level=logging.EXP)
logging.console.setLevel(logging.WARNING)  # this outputs to the screen, not a file

# An ExperimentHandler isn't essential but helps with data saving
thisExp = data.ExperimentHandler(name=expName, version='',
    extraInfo=expInfo, runtimeInfo=None,
    originPath=None,
    savePickle=True, saveWideText=True,
    dataFileName=filename)

# Start Code - component code to be run before the window creation

# Setup the Window
win = visual.Window(size=(1366, 768), fullscr=True, screen=0, allowGUI=False,      
    allowStencil=False, monitor='testMonitor', color=[-1,-1,-1], colorSpace='rgb')
myClock = core.Clock()

# store frame rate of monitor if we can measure it successfully
expInfo['frameRate']=win.getActualFrameRate()
if expInfo['frameRate']!=None:
    frameDur = 1.0/round(expInfo['frameRate'])
else:
    frameDur = 1.0/60.0 # couldn't get a reliable measure so guess

# Initialize components for Routine "instructions"
instructionsClock = core.Clock()
text = visual.TextStim(win=win, ori=0, name='text',
text='Respond to the probe once it appears. EIther click "2" when probe replaces left     face or click "3" when probe replaces right face.',    font='Arial',
    pos=[0, 0], height=0.1, wrapWidth=None,
    color='white', colorSpace='rgb', opacity=1,
    depth=0.0)

# Initialize components for Routine "block1"
block1Clock = core.Clock()
fixation = visual.TextStim(win=win, ori=0, name='fixation',
    text='+',    font='Arial',
    pos=[0, 0], height=0.1, wrapWidth=None,
    color='white', colorSpace='rgb', opacity=1,
    depth=0.0)

leftimage = visual.ImageStim(win=win, name='leftimage',
    image='sin', mask=None,
    ori=0, pos=[0,0], size=[1, 1.34],
    color=[1,1,1], colorSpace='rgb', opacity=1,
    texRes=128, interpolate=False, depth=-1.0)

rightimage = visual.ImageStim(win=win, name='rightimage',
    image='sin', mask=None,
    ori=0, pos=[0,0], size=[1, 1.34],
    color=[1,1,1], colorSpace='rgb', opacity=1,
    texRes=128, interpolate=False, depth=-2.0)

probe = visual.ImageStim(win=win, name='probe',
    image='sin', mask=None,
    ori=0, pos=[0,0], size=[0.5, 0.5],
    color=[1,1,1], colorSpace='rgb', opacity=1,
    texRes=128, interpolate=False, depth=-3.0)

#Get and save a screen shot" of everything in stimlist:
stimlist = [leftimage, rightimage]
t0 = myClock.getTime()
rect=(-1,1,1,-1)
screenshot = visual.BufferImageStim(win, stim=stimlist, rect=rect)
    # rect is the screen rectangle to grab, (-1,1,1,-1) is whole screen
    # as a list of the edges: Left Top Right Bottom, in norm units.

# Create some handy timers
globalClock = core.Clock()  # to track the time since experiment started
routineTimer = core.CountdownTimer()  # to track time remaining of each (non-slip) routine

解决方法:

像其他人建议的那样使用win.getMovieFrame和win.saveMovieFrames.您不需要visual.BufferImageStim.当你完成脚本时,你可能最终会遇到循环过度.我会拍摄截图,因为实际的实验正在运行,而不是事先“模拟”.它确保您的屏幕截图准确描述了实验过程中实际发生的事情 – 如果您犯了错误并且错误地绘制了东西:-)当然,如果截图的目的纯粹是为了文档,请删除/在运行实际实验以提高性能时,将这些行取消.

# Loop through trials. You may organize them using ``data.TrialHandler`` or generate them yourself.
for trial in myTrialList:
    # Draw whatever you need, probably dependent on the condition. E.g.:
    if trial['condition'] == 'right':
        rightimage.draw()
    else:
        leftimage.draw() 
    fixation.draw()

    # Show your stimulus
    win.flip()

    # Save screenshot. Maybe outcomment these line during production.
    win.getMovieFrame()   # Defaults to front buffer, I.e. what's on screen now.
    win.saveMovieFrames('screenshot' + trial['condition'])  # save with a descriptive and unique filename.                                .      

标签:python,screenshot,psychopy
来源: https://codeday.me/bug/20190722/1506340.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有