CSiEra

CSiEra

I know I know nothing.

Psychopy学習ノート —— MovieStim

これらの日数は、Psychopy を使用して映画を再生するためのソリューションを作成する必要がありました。以前に何度か使用したことがありますが、Psychopy は常に更新されており、以前の実装にはあまり満足していませんでした。今日は整理しました。

主に使用するクラスはpsychopy.visual.MovieStimです。このクラスにはいくつかの便利なメソッドがあります。

映画が終了したかどうかを確認する方法は?#

MovieStim.ifFinishedメソッドを使用すると、while ループ内でこの値が True かどうかを確認することで、映画が再生終了したかどうかを知ることができます。終了した場合は次のタスクに進むことができますが、終了していない場合は再生を続けます。

テスト中に再生画面からキーで抜ける方法は?#

グローバルな終了キーを追加してみましたが、おそらく私のコードに問題があるため、グローバルな終了キーは機能しませんでした。そのため、代わりに再生中にキーが押されているかどうかをチェックすることにしました。

ビデオの再生を停止するには、mov.stop()メソッドを使用します。

ビデオの再生コード:#

while not mov.isFinished:
    mov.draw()
    win.flip()
    if len(event.getKeys())>0:
        mov.stop()
        break

ビデオのサイズを自動調整する#

2 つのビデオを用意しましたが、これらのビデオのフレームサイズは異なります。自動調整を実現するために、cv2ライブラリを使用する必要があります。

ビデオフレームのサイズを自動検出する#

import cv2
def get_movie_frame_size(movie_path):
    cap = cv2.VideoCapture(movie_path)
    frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    cap.release()
    return frame_width, frame_height

このコードは chatGPT によって生成されました。最初は chatGPT に Psychopy を使用させようとしましたが、出力が正しくありませんでした。

午後に API ドキュメントを読んだ結果、Psychopy にはmovie.sizeがあり、ドキュメントにはフレームのサイズを出力することができるとありましたが、テストした結果、出力結果が正しくありませんでした。chatGPT は最初に Psychopy 自体を使用して同様のアプローチをしましたが、それもうまくいきませんでした。おそらく Psychopy のインターフェースが常に更新されているため、chatGPT がそれを学習していないのかもしれません。最終的には opencv を使用してこのタスクを完了しました。

最終的なコード#

for i in range(2):  #私は2つのビデオしか持っていません
        video_used = cur_movie_path + video_names[i]
        mov = visual.MovieStim(win, video_used,
                                flipVert=False, flipHoriz=False, loop=False)
        frame_width, frame_height = \ 
            get_movie_frame_size(cur_movie_path+video_names[i])
        mov.size = (frame_width, frame_height)

        while not mov.isFinished:
           mov.draw()
           win.flip()
           if len(event.getKeys())>0:
               mov.stop()
               break

コードはコピーされており、インデントが正しくありません。使用する場合は、コードのインデントを調整してエラーを回避してください。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。