14 用 Screen 函数打开一个窗口

从今天开始,我打算边解释 PTB 自带的 demo 程序,边讲解一些涉及到的知识点,这样进度会快一点。

PTB 的 demo 可以在 Psychtoolbox Demos 网站上获取。另外,在安装目录的 PsychDemos 文件夹下也有大量的 demo 程序。

这次介绍下 Screen 的窗口操作。

在屏幕上显示一些内容,是我们用得最多的功能。要在屏幕上显示内容,需要先打开一个窗口。

Psychtoolbox Demos 网站上的第一个 demo 就演示了如何打开窗口,并获得一些其他信息。

% 第一块 Clear the workspace and the screen
sca;
close all;
clearvars;

% 第二块 Here we call some default settings for setting up Psychtoolbox
PsychDefaultSetup(2);

% 第三块 Get the screen numbers. This gives us a number for each of the screens
% attached to our computer.
screens = Screen('Screens');

% 第四块 To draw we select the maximum of these numbers. So in a situation where we
% have two screens attached to our monitor we will draw to the external
% screen.
screenNumber = max(screens);

% 第五块 Define black and white (white will be 1 and black 0). This is because
% in general luminace values are defined between 0 and 1 with 255 steps in
% between. All values in Psychtoolbox are defined between 0 and 1
white = WhiteIndex(screenNumber);
black = BlackIndex(screenNumber);

% 第六块 Do a simply calculation to calculate the luminance value for grey. This
% will be half the luminace values for white
grey = white / 2;

% 第七块 Open an on screen window using PsychImaging and color it grey.
[window, windowRect] = PsychImaging('OpenWindow', screenNumber, grey);

% 第八块 Now we have drawn to the screen we wait for a keyboard button press (any
% key) to terminate the demo.
KbStrokeWait;

% 第九块 Clear the screen.
sca;

运行程序时,要记得把除了 matlab 以外的其他程序,能关闭退出的全都关闭退出,不然,有可能会出现 synchronization error.

最先要学习的是这个 demo 的注释风格,当然,我们自己熟练以后,可能不需要这么详细。但是为了交流方便,注释越详细越好。

为了指代方便,后面我会把 demo 程序里面每个用空白行分隔开的代码称为 “ 代码块 ”。比如,demo 中的前四行,就是第一个代码块(我在注释中也添加了这个描述),这当中,只有第一行是注释,后三行都是可执行的程序语句。

第一个代码块主要是做了一些准备工作,几乎每个程序都有,所以几乎都是约定俗成了,每个程序的头几行都是这个。

scaScreen (' CloseAll' ) 的简写。其功能就是关闭所有由 PTB 打开的窗口。

close all 是关闭所有 matlab 打开的图形窗口(如用 plot 命令画出来的函数图)。

clearvars 是清空所有的变量。

第二个代码块是载入默认的设置,这个不管了,一般我们都用这个 demo 里的设置。有兴趣的也可以自己 help PsychDefaultSetup 看看,内容也不难。

第三块和第四块的代码是为了获取当前要操纵的屏幕代号,这个代码是用数字标示的。

一般情况下,我们都只有一个屏幕,但有时候我们一台电脑上连接着多个显示器,那么这不同的显示器,我们怎么区分?

windows 操作系统用数字编号来区分,在我们看来就是 0 号显示器,1 号显示器这类的区别。

当只有一个显示器的时候,你使用的显示器叫 0 号显示器,每添加一块显示器,那个显示器的编号就增加1,如第二块显示器就是 1 号显示器,第三块就叫 2 号显示器,以此类推。

不同操作系统上,这种设置可能不同,但大体规则如此。

还有个方法就是在 windows 设置的显示属性中有一个按钮叫 “检测”(有些版本是 “识别” 按钮, 如在 win 7 系统中),你点一下它,windows 会在不同的显示器上显示一个大大的透明数字,告诉你这些显示器分别是几号显示器。

回到这个代码中来,它用了两行代码来获取当前显示器的数字编号。

先是使用 screens = Screen ('Screens') 获得当前系统连接了哪些显示器,返回值是一个单行矩阵,它存储了所有的显示器编号。

例如,有两块显示器,那 screens 的值就是 [0 1]

然后 screenNumber = max ( screens ) 取变量 screens 中的最大值,按上例的话,那意味着后面的一系列操作都只是在 1 号显示器上进行。当然,如果只有一块显示器,后面的一系列操作都是在当前显示器上进行。

第五、六代码块涉及到颜色操作的问题,今天不讨论,大家知道,经过这两块代码后,我们获得了灰色值,并且把它存储在变量 gray 中。

第七块代码的功能是打开一个窗口,后面接着解释它。

第八块代码涉及到了键盘输入的问题,今天也不讨论,只需要知道,它会一直等着你按一个键,按任意键以后,执行其后的语句,也就是第九块代码 sca, 程序就结束了。

总之,这个程序的功能很简单,打开一个灰色的全屏窗口,按任意键后程序结束。

第七块代码才是我们今天要说的重点。

[window, windowRect] = PsychImaging('OpenWindow', screenNumber, grey);

PsychImaging 这个函数的帮助文档,内容比较多,说的多是一些技术细节,干脆也不管了,只管这个具体用法。

实际上,这个函数接受了三个参数,第一个参数 OpenWindow 是一个指令,告诉它我要做的事情是打开一个窗口;第二个参数是告诉它我在哪个显示器上打开窗口;最后一个参数是指定了这个窗口的颜色。所以,你运行这个程序以后,它就打开了一个灰色的窗口,还是全屏的。

它的返回值,有两个。第一个返回值 window 可以理解为你打开的那个窗口的名字。以后呈现刺激、显示指导语等工作,就是对这个窗口来操作的。

请注意,窗口要在某个显示器中打开,具体的一些视觉刺激的呈现工作要在打开的那个窗口中操作,这个待操作的窗口用某个变量指代,如这里的 window。请不要弄混了。

返回值 windowRect ,给出了打开的窗口大小,它是用一对坐标值描述,所以你运行完程序以后,在左边的变量列表中可以看到 windowRect 的值。比如,我这里的结果是 [ 0 0 2560 1440 ]

简单介绍一下显示器的坐标系。我们知道,显示器还有一个很重要的参数是分辨率,如我的显示器分辨率是 2560 X 1440,这意味着,这块显示器横向上有 2560 个像素点,纵向上有 1440 个像素点,一共有 3686400 个像素点。

这每个像素点都有对应的一个坐标,这个坐标系可以用下面的图来表示:


描述像素点位置的坐标系

左上角的那个是起点,右下角的才是这个显示器最大分辨率的位置。显然,对于一个矩形来说,只需要给出两个坐标点就可以描述这个矩形。PTB 就是这样做的,对于任意一个矩形,只给出左上角和右下角的像素点坐标。

现在,我们能理解 PsychImaging 打开一个窗口以后,返回windowRect 值的意义了。[0 0 2560 1440] 这个矩阵的前两个值是矩形左上角那个点的坐标,后两个值是矩形右下角那个点的坐标。显然,这个矩阵的大小信息,我们也能知道。

据此,我们还可以获得其他信息,如屏幕的中心位置在哪里?还有,如果想把一个宽为 400 像素,高为 300 像素的矩形放到屏幕的中心,那么这个矩形的位置坐标应该是什么?这些问题,大家可以思考下。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,501评论 6 544
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,673评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,610评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,939评论 1 318
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,668评论 6 412
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 56,004评论 1 329
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 44,001评论 3 449
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,173评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,705评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,426评论 3 359
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,656评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,139评论 5 364
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,833评论 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,247评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,580评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,371评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,621评论 2 380

推荐阅读更多精彩内容