【问题标题】:Switching an image at specific frequencies c++以特定频率切换图像c ++
【发布时间】:2017-05-08 09:38:52
【问题描述】:

作为大学项目的一部分,我目前正在为大脑的视觉皮层开发一种刺激提供器。该程序将(最好)用 c++ 编写,利用 Visual Studio 和 OpenCV。它应该工作的方式是程序根据不同频率的数量创建许多线程,每个线程都为其各自的频率运行一个计时器。 到目前为止,代码看起来像这样:

void timerThread(void *param) {
t *args = (t*)param; 
int id = args->data1;
float freq = args->data2;
unsigned long period = round((double)1000 / (double)freq)-1;

while (true) {
    Sleep(period);
    show[id] = 1;
    Sleep(period);
    show[id] = 0;
}
}

对于某些频率,它似乎可以正常工作,但其他频率的帧速率变化很大。我试图研究创建自己的计时功能,类似于在 Arduino 的“blinkWithoutDelay”功能中所做的,尽管效果非常糟糕。另外,我尝试过使用 waitKey() 函数,它的工作原理与现在使用的 Sleep() 函数非常相似。

任何帮助将不胜感激!

【问题讨论】:

  • 你提供的代码不足以描述问题:这个show[id]是干什么用的?
  • 这适用于哪些频率,哪些频率有问题?你的好帧率和坏帧率是多少? show是什么类型的?
  • (double)1000 / (double)freq ==> 1000.0 / freq

标签: c++ visual-studio opencv timing time-critical


【解决方案1】:

您应该使用计时器而不是“睡眠”来解决此问题,因为有时循环可能需要更多或更少的时间才能完成。

在循环开始时重新启动计时器并在重置之前取其值 - 这将为您提供循环完成所需的时间。 如果这个时间大于“周期”值,那么意味着你迟到了,你需要立即执行(甚至为下一个循环降低周期)。 否则,如果它较低,则意味着您需要等到它更大。 我个人不喜欢睡眠,而是不断地重新启动计时器,直到它变大为止。

我建议查看“固定时间步长”代码,例如下面的代码。您需要将这段代码的 sn-p 放在每个线程上,期间 (ns) 具有不同的值,并将您的代码放在“doUpdates()”所在的位置。

如果你需要一个“定时器”库,由于我不了解 OpenCV,我推荐SFML (SFML's timer docs)。

以下代码来自here

long int start = 0, end = 0;
double delta = 0;
double ns = 1000000.0 / 60.0; // Syncs updates at 60 per second (59 - 61)
while (!quit) {
    start = timeAsMicro();
    delta+=(double)(start - end) / ns; // You can skip dividing by ns here and do "delta >= ns" below instead //
    end = start;

    while (delta >= 1.0) {
       doUpdates();
       delta-=1.0;
    }
}

请注意,在此代码中,计时器永远不会重置。

(这可能不完全准确,但鉴于您提供的代码,这是我可以解决您的问题的最佳假设)

【讨论】:

  • 感谢您的回答,我会尝试查看该库!
猜你喜欢
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多