如何设置相机的fps?

时间:2012-03-16 15:44:34

标签: c image-processing camera frame frame-rate

我正在使用1GB内存的帧抓取器inspecta-5,还有高速摄像头“EoSens扩展模式,640X480 1869fps,10X8水龙头”。我是编码抓取器和控制摄像头的新手。 Inspecta-5抓取器为我提供了不同的选项,例如将所需的帧数从camrea更改为抓取器以及从抓取器到主存储器。我也可以使用camrea链接向相机发送信号,并有不同的曝光时间。 但我真的不确定我应该用什么来获得每秒1000帧的速率,我该如何测试呢? 根据软件手册,如果我在相机配置文件中设置以下选项: ReqFrame = 1000 GReqFrame = 1000 它意味着从相机到抓取器传输1000帧,并且还分别从抓取器将1000帧传输到主存储器。 但这是否意味着我有1000fps?

将fps设置为1000的选项是什么?还有我如何测试它在One Second中真正抓住了1000帧?

这里是抓取器软件手册的链接:mikrotron.de/index.php?de_downloadfiles你可以在“Inspecta Level1 API for WinNT / 2000 / XP”部分找到软件手册。文件名是“i5-level1-sw_manual_e.pdf”,万一有人需要它。

谢谢你

1 个答案:

答案 0 :(得分:1)

在1,000fps时,您没有太多时间拍摄画面甚至保存画面。使用以下示例并插入估计的FPS,捕获并保存延迟。在1,000fps时,你总共可以有大约0.8ms的延迟(为什么不是.99999?我不知道 - 与无法达到的理论最大值或我的旧PC有关)。

public static void main(String args[]) throws Exception {

    int fps = 1000;
    float simulationCaptureNowMS = .40f;
    float simulationSaveNowNowMS = .40f;

    final long simulationCaptureNowNS = (long)(simulationCaptureNowMS * 1000000.0f);
    final long simulationSaveNowNowNS = (long)(simulationSaveNowNowMS * 1000000.0f);
    final long windowNS = (1000*1000000)/fps;
    final long movieDurationSEC = 2;
    long dropDeadTimeMS = System.currentTimeMillis() + (1000* movieDurationSEC);
        while(System.currentTimeMillis() < dropDeadTimeMS){
            long startNS = System.nanoTime(); 
            actionSimulator(simulationCaptureNowNS);
            actionSimulator(simulationSaveNowNowNS);
            long endNS = System.nanoTime();
            long sleepNS = windowNS-(endNS-startNS);
            if (sleepNS<0) {
                System.out.println("Data loss. Try again.");
                System.exit(0);
            }
            actionSimulator(sleepNS);
        }
        System.out.println("No data loss at "+fps+"fps with interframe latency of "+(simulationCaptureNowMS+simulationSaveNowNowMS)+"ms");
}            

private static void actionSimulator(long ns) throws Exception {
    long d = System.nanoTime()+ns;
    while(System.nanoTime()<d) Thread.yield();
}