画像ファイルを画面に呈示するとき、心理学の実験では一般的に、事前に画像ファイルの読み込みを行って、画像を呈示するときの負荷を減らします。以下に説明する方法でそれを達成できているのではないかと思っていますが、実際に計測などを行って比較したわけではないのでご了承ください。
また、Pythonのリスト型、辞書型についての知識を深めることも目的としています。
リスト型について
PsychoPyのBuilderにCodeコンポーネントを配置します。Begin Experiment に次のコードを書いてみましょう。
import random
myList = [1, 2, 3, 4]
print('CHECK1:')
print(myList)
random.shuffle(myList)
print('CHECK2:')
print(myList)
これを実行すると、PsychoPy outputに次のような内容が表示されるはずです。
CHECK1:
[1, 2, 3, 4]
CHECK2:
[1, 4, 2, 3]
CHECK1のあとの[1, 2, 3, 4]はmyListの内容です。順番は必ず1,2,3,4になります。CHECK2のあともmyListの内容を表示しているのですが、random.shuffle
によってmyList内の数字の順番がランダムになっている点に注意してください。上の例では1,4,2,3ですが、偶然、1,2,3,4となることもあります。
myListの1番目の要素にアクセスする(1番目のデータを使う)場合には、myList[0]
とします。
同様に2番目の要素にアクセスするにはmyList[1]
とします。
詳しくは、リスト | Python入門 - Let'sプログラミングをご覧ください。
辞書型について
辞書型は、keyとvalueがペアになるようなデータを扱うときに便利です。例えば次のようなデータです。
果物 | 値段 |
---|---|
リンゴ | 120円 |
バナナ | 90円 |
オレンジ | 180円 |
記述済みのCodeコンポーネント(Begin Experiment)に次のコードを加えてみましょう。
myDict = {'apple': 120, 'banana': 90, 'orange': 180}
print('CHECK3:')
print(myDict)
print('CHECK4:')
print(myDict["banana"])
これを実行すると、PsychoPy outputに次のような内容が表示されるはずです。
CHECK3:
{'apple': 120, 'banana': 90, 'orange': 180}
CHECK4:
90
CEHCK3のあとに、myDictの内容をすべて表示しています。コロン:をはさんで、keyとvalueが並んでいる点に注目してください。
CHECK4のあとでは、myDict["banana"]
の内容、つまりバナナの金額(90円)を表示させています。
詳しくは、とっても便利なPythonの辞書型について覚え書きをご覧ください。
特定のフォルダに保存している画像ファイルの一覧を取得
いよいよ本題です。特定のフォルダに保存している画像ファイルの、ファイル名の一覧を取得してリストとして保持するには次のようにします。ここでは実験プログラムが保存されているフォルダ内に、imagesというフォルダが存在し、そこにjpgの拡張子を持つ複数の画像ファイルが保存されているとします。
import os
import glob
cwd = os.getcwd() # current working directory
imageLists = glob.glob(cwd + "/images/*.jpg")
print('CHECK5:')
print(imageLists)
CHECK5のあとに、imageListsの内容を表示しています。例えば次のようになります。
['/Users/xxx/Documents/PsychoPy3/practice/images/image1.jpg', '/Users/xxx/Documents/PsychoPy3/practice/images/image2.jpg', '/Users/xxx/Documents/PsychoPy3/practice/images/image3.jpg']
imageListsの内容は [] でくくられていて、リストになっていますね。
この例では要素数は3で、imageLists[1]は、'/Users/xxx/Documents/PsychoPy3/practice/images/image2.jpg' です。
imageListsのすべての画像を読み込むには次のようにします。
imageData = {}
for i in imageLists:
imageData[i] = visual.ImageStim(win, image=i)
print('CHECK6:')
print(imageData)
imageDataは辞書型で、次のような内容になっています。
ファイル名 | 画像データ |
---|---|
画像1のファイル名 | 画像1のデータ |
画像2のファイル名 | 画像2のデータ |
画像3のファイル名 | 画像3のデータ |
画像を呈示する
Codeコンポーネントに次のコードを加えます。
for i in imageLists:
imageData[i].draw()
win.flip()
core.wait(1)
imagesフォルダ内のすべての画像が、1枚ずつ、1秒間呈示されてプログラムが終了します。
さて、このままでは、毎回同じ順番で画像が呈示されることにお気づきでしょうか?
random.shuffle(imageLists)
をどこかに加えると呈示される画像が毎回変わります。つまりリストの内容をランダムな順番にするということですね。お試しください。