從今天開始务漩,我打算邊解釋 PTB 自帶的 demo 程序,邊講解一些涉及到的知識點蒲每,這樣進度會快一點研侣。
PTB 的 demo 可以在 Psychtoolbox Demos 網(wǎng)站上獲取。另外楞泼,在安裝目錄的 PsychDemos
文件夾下也有大量的 demo 程序驰徊。
這次介紹下 Screen 的窗口操作。
在屏幕上顯示一些內(nèi)容堕阔,是我們用得最多的功能棍厂。要在屏幕上顯示內(nèi)容,需要先打開一個窗口超陆。
Psychtoolbox Demos 網(wǎng)站上的第一個 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 以外的其他程序张漂,能關(guān)閉退出的全都關(guān)閉退出,不然谨娜,有可能會出現(xiàn) synchronization error.
最先要學習的是這個 demo 的注釋風格航攒,當然,我們自己熟練以后趴梢,可能不需要這么詳細漠畜。但是為了交流方便,注釋越詳細越好坞靶。
為了指代方便憔狞,后面我會把 demo 程序里面每個用空白行分隔開的代碼稱為 “ 代碼塊 ”。比如彰阴,demo 中的前四行躯喇,就是第一個代碼塊(我在注釋中也添加了這個描述),這當中硝枉,只有第一行是注釋廉丽,后三行都是可執(zhí)行的程序語句。
第一個代碼塊主要是做了一些準備工作妻味,幾乎每個程序都有正压,所以幾乎都是約定俗成了,每個程序的頭幾行都是這個责球。
sca
是 Screen (' CloseAll' )
的簡寫焦履。其功能就是關(guān)閉所有由 PTB 打開的窗口。
close all
是關(guān)閉所有 matlab 打開的圖形窗口(如用 plot
命令畫出來的函數(shù)圖)雏逾。
clearvars
是清空所有的變量嘉裤。
第二個代碼塊是載入默認的設(shè)置,這個不管了栖博,一般我們都用這個 demo 里的設(shè)置屑宠。有興趣的也可以自己 help PsychDefaultSetup
看看,內(nèi)容也不難仇让。
第三塊和第四塊的代碼是為了獲取當前要操縱的屏幕代號典奉,這個代碼是用數(shù)字標示的。
一般情況下丧叽,我們都只有一個屏幕卫玖,但有時候我們一臺電腦上連接著多個顯示器,那么這不同的顯示器踊淳,我們怎么區(qū)分假瞬?
windows 操作系統(tǒng)用數(shù)字編號來區(qū)分,在我們看來就是 0 號顯示器迂尝,1 號顯示器這類的區(qū)別脱茉。
當只有一個顯示器的時候,你使用的顯示器叫 0 號顯示器雹舀,每添加一塊顯示器芦劣,那個顯示器的編號就增加1,如第二塊顯示器就是 1 號顯示器说榆,第三塊就叫 2 號顯示器虚吟,以此類推。
不同操作系統(tǒng)上签财,這種設(shè)置可能不同串慰,但大體規(guī)則如此。
還有個方法就是在 windows 設(shè)置的顯示屬性中有一個按鈕叫 “檢測”(有些版本是 “識別” 按鈕唱蒸, 如在 win 7 系統(tǒng)中)邦鲫,你點一下它,windows 會在不同的顯示器上顯示一個大大的透明數(shù)字,告訴你這些顯示器分別是幾號顯示器庆捺。
回到這個代碼中來古今,它用了兩行代碼來獲取當前顯示器的數(shù)字編號。
先是使用 screens = Screen ('Screens')
獲得當前系統(tǒng)連接了哪些顯示器滔以,返回值是一個單行矩陣捉腥,它存儲了所有的顯示器編號。
例如你画,有兩塊顯示器抵碟,那 screens
的值就是 [0 1]
。
然后 screenNumber = max ( screens )
取變量 screens 中的最大值坏匪,按上例的話拟逮,那意味著后面的一系列操作都只是在 1 號顯示器上進行。當然适滓,如果只有一塊顯示器敦迄,后面的一系列操作都是在當前顯示器上進行。
第五粒竖、六代碼塊涉及到顏色操作的問題颅崩,今天不討論,大家知道蕊苗,經(jīng)過這兩塊代碼后沿后,我們獲得了灰色值,并且把它存儲在變量 gray
中朽砰。
第七塊代碼的功能是打開一個窗口尖滚,后面接著解釋它。
第八塊代碼涉及到了鍵盤輸入的問題瞧柔,今天也不討論漆弄,只需要知道,它會一直等著你按一個鍵造锅,按任意鍵以后撼唾,執(zhí)行其后的語句,也就是第九塊代碼 sca
, 程序就結(jié)束了哥蔚。
總之倒谷,這個程序的功能很簡單,打開一個灰色的全屏窗口糙箍,按任意鍵后程序結(jié)束渤愁。
第七塊代碼才是我們今天要說的重點。
[window, windowRect] = PsychImaging('OpenWindow', screenNumber, grey);
PsychImaging
這個函數(shù)的幫助文檔深夯,內(nèi)容比較多抖格,說的多是一些技術(shù)細節(jié),干脆也不管了,只管這個具體用法雹拄。
實際上收奔,這個函數(shù)接受了三個參數(shù),第一個參數(shù) OpenWindow
是一個指令办桨,告訴它我要做的事情是打開一個窗口筹淫;第二個參數(shù)是告訴它我在哪個顯示器上打開窗口;最后一個參數(shù)是指定了這個窗口的顏色呢撞。所以,你運行這個程序以后饰剥,它就打開了一個灰色的窗口殊霞,還是全屏的。
它的返回值汰蓉,有兩個绷蹲。第一個返回值 window
可以理解為你打開的那個窗口的名字。以后呈現(xiàn)刺激顾孽、顯示指導語等工作祝钢,就是對這個窗口來操作的。
請注意若厚,窗口要在某個顯示器中打開拦英,具體的一些視覺刺激的呈現(xiàn)工作要在打開的那個窗口中操作,這個待操作的窗口用某個變量指代测秸,如這里的 window
疤估。請不要弄混了。
返回值 windowRect
霎冯,給出了打開的窗口大小铃拇,它是用一對坐標值描述,所以你運行完程序以后沈撞,在左邊的變量列表中可以看到 windowRect
的值慷荔。比如,我這里的結(jié)果是 [ 0 0 2560 1440 ]
簡單介紹一下顯示器的坐標系缠俺。我們知道显晶,顯示器還有一個很重要的參數(shù)是分辨率,如我的顯示器分辨率是 2560 X 1440
晋修,這意味著吧碾,這塊顯示器橫向上有 2560 個像素點,縱向上有 1440 個像素點墓卦,一共有 3686400 個像素點倦春。
這每個像素點都有對應的一個坐標,這個坐標系可以用下面的圖來表示:
左上角的那個是起點,右下角的才是這個顯示器最大分辨率的位置睁本。顯然尿庐,對于一個矩形來說,只需要給出兩個坐標點就可以描述這個矩形呢堰。PTB 就是這樣做的抄瑟,對于任意一個矩形,只給出左上角和右下角的像素點坐標枉疼。
現(xiàn)在皮假,我們能理解 PsychImaging
打開一個窗口以后,返回windowRect
值的意義了骂维。[0 0 2560 1440]
這個矩陣的前兩個值是矩形左上角那個點的坐標惹资,后兩個值是矩形右下角那個點的坐標。顯然航闺,這個矩陣的大小信息褪测,我們也能知道。
據(jù)此潦刃,我們還可以獲得其他信息侮措,如屏幕的中心位置在哪里?還有乖杠,如果想把一個寬為 400 像素分扎,高為 300 像素的矩形放到屏幕的中心,那么這個矩形的位置坐標應該是什么滑黔?這些問題笆包,大家可以思考下。