首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PsychToolbox中实时渲染视频和苏格拉底数据轮询

在PsychToolbox中实时渲染视频和苏格拉底数据轮询
EN

Stack Overflow用户
提问于 2016-03-15 21:01:38
回答 1查看 214关注 0票数 0

我正在使用MATLAB的PsychToolbox运行一个实验,我必须实时收集扫视信息,同时也呈现一帧一帧的视频。我遇到的问题是,给定视频和显示器的帧速率(~24 The ),意味着我有大约40 is的时间窗口来呈现查询和呈现我以前存储在内存中的每一个帧。这是好的,但由于这一过程需要调整时间,它通常意味着我有大约20毫秒左右的持续投票,一个扫视从开始到结束。

这是一个问题,因为当我为扫视进行投票时,我通常所做的事情(例如静态图像,只需要显示一次),就是等待注视的开始和结束,因为从眼睛跟踪机器中得到一致的轮询,它可以检测观察者的视线突然从一个点转移到另一个点。

超速: 35度/秒

和一个

加速度超过: 9500德克/秒^2

但是,如果扫视的开始或结束发生在呈现帧时(这是大多数时间),那么在不将呈现和轮询过程分割成两个独立的MATLAB线程的情况下,就不可能实时地获取数据。

我的代码(相关部分)如下所示:

代码语言:javascript
复制
    while GetSecs-t.stimstart(sess,tc)<fixation_time(stimshownorder(tc))
        x =evt.gx(1);
        y =evt.gy(1);
        pa = evt.pa(1);

        x_vec = [x_vec; x];
        y_vec = [y_vec; y];
        pa_vec = [pa_vec; pa];

        evta=Eyelink('NewestFloatSample');
        evtype=Eyelink('GetNextDataType');

        #%% Ideally this block should detect saccades
        #%% It works perfect in still images but it can't do anything here 
        #%% since it conflicts the main for loop ahead.

        if evtype==el.ENDSACC
            sacdata=Eyelink('GetFloatData',evtype);
            sac.startx(sess,tc,sacc)=sacdata.gstx;
            sac.starty(sess,tc,sacc)=sacdata.gsty;
            sac.endx(sess,tc,sacc)=sacdata.genx;
            sac.endy(sess,tc,sacc)=sacdata.geny;
            sac.start(sess,tc,sacc)=sacdata.sttime;
            sac.end(sess,tc,sacc)=sacdata.entime;
            sacc=sacc+1;
        end

         #%Main loop where we render each frame:
         if (GetSecs-t.space(sess,tc)>lag(tc)) 
            z = floor((GetSecs-t.space(sess,tc)-lag(tc))/(1/24))+1;
            if z > frame_number
                z = frame_number;
            end
            Screen('DrawTexture',win,stimTex{z});    
            Screen('Flip',win);
            #DEBUG:
            #disp(z);
            #%disp(frame_number);
        end

    end

理想情况下,我需要一个MATLAB函数,它可以在后端的一个单独线程中独立地呈现视频,同时仍然在主线程中轮询扫视。理想的情况是:

代码语言:javascript
复制
    #% Define New thread to render video
    #% Some new function that renders video in parallel in another thread
    StartParallelThread(1);
    #%Play video:
    Playmovie(stimTex);

    #%Now start this main loop to poll for eye movements.
    while GetSecs-t.stimstart(sess,tc)<fixation_time(stimshownorder(tc))
        x =evt.gx(1);
        y =evt.gy(1);
        pa = evt.pa(1);

        x_vec = [x_vec; x];
        y_vec = [y_vec; y];
        pa_vec = [pa_vec; pa];

        evta=Eyelink('NewestFloatSample');
        evtype=Eyelink('GetNextDataType');
        if evtype==el.ENDSACC
            sacdata=Eyelink('GetFloatData',evtype);
            sac.startx(sess,tc,sacc)=sacdata.gstx;
            sac.starty(sess,tc,sacc)=sacdata.gsty;
            sac.endx(sess,tc,sacc)=sacdata.genx;
            sac.endy(sess,tc,sacc)=sacdata.geny;
            sac.start(sess,tc,sacc)=sacdata.sttime;
            sac.end(sess,tc,sacc)=sacdata.entime;
            sacc=sacc+1;
        end
    end

运行屏幕(“Flip”,win)命令所需的时间似乎也是16 is左右。这意味着,如果在此间隔内发生任何眼罩,我将无法检测或轮询它们。请注意,最后我有42 of (用于帧刷新速率)减去16 of (查询和显示帧所需的时间),因此每个帧总共有26 of的探测时间,用于获取眼球运动和计算任何实时处理。

一种可能的解决办法可能是不断地抽查目光,而不是检查眼球运动是否是眼珠子。但是我仍然有一个问题,就是不能捕捉每帧中大约三分之一的内容,仅仅因为加载它需要时间。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-14 10:12:32

你需要重组你的代码。做这个工作的唯一方法是知道翻转需要多长时间,并且知道提交下一个视频帧需要多长时间。然后,在循环中轮询眼睛跟踪器,直到有足够的时间在下一个屏幕垂直空白之前执行绘图命令。

在matlab中不能进行任何形式的可靠多线程处理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36022059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档