【问题标题】:opencv circle detection with video带视频的opencv圆形检测
【发布时间】:2012-02-28 10:28:12
【问题描述】:

有没有办法等到发生某些事情(while 循环)或等待 10 秒后再进行圆圈检测,但仍显示视频。我已经尝试过使用 while 循环,但如果不满足条件,则不会显示帧,因为代码没有获取 cvShow\iamge()。

【问题讨论】:

    标签: c opencv detection video-processing geometry


    【解决方案1】:

    是的,有可能,但您必须使用线程。声明一个全局变量bool exec_circle_detection = false; 并启动第二个线程。在此线程上,调用 sleep(10) 等待 10 秒,然后将 exec_circle_detection 更改为 true

    在主线程中,在帧抓取循环中,检查布尔变量是否设置为 true,如果不是,则不会处理帧。这部分看起来像这样(在 C 中):

    char key = 0;
    while (key != 27) // ESC
    {    
      frame = cvQueryFrame(capture);
      if (!frame) 
      {
          fprintf( stderr, "!!! cvQueryFrame failed!\n" );
          break;
      }
    
      if (exec_circle_detection)
      {
          // execute custom processing
      }
    
      // Display processed frame
      cvShowImage("result", frame);
    
      // Exit when user press ESC
      key = cvWaitKey(10);
    }
    

    如果您计划每 10 秒进行一次圆检测,则需要在执行自定义处理后将 exec_circle_detection 更改为 false。在辅助线程上,调整您的代码,使 while 循环每 10 秒将 exec_circle_detection 更改为 true。

    【讨论】:

    • 非常感谢。我打算做一个圆圈检测,然后希望程序除了在接下来的十秒钟内显示视频之外什么都不做。然后返回下一行代码。
    • 太棒了,请随时为我的答案投票或通过单击它附近的复选框将其选为您问题的官方答案。或者两者都做:)
    • 可能是复杂的问题。我的代码中有一部分正在检测圆圈。我希望它计数 10 秒并检测圆圈并显示视频而不会遇到下一行代码???
    • 好吧,我已经提出了一种解决方法。您的应用程序的主线程将继续从相机中检索帧,并且它只会在 exec_circle_detection 变为 true 时执行您的自定义处理。这部分将由第二个线程完成,该线程将运行并调用sleep(10),该线程暂停此线程上的代码执行 10 秒,当此时间结束时,下一条要执行的指令应该是exec_circle_detection = true;,这将触发你的圆圈检测代码在主线程中执行。这对你有意义吗?
    • 我最了解 if.are main() 中的 2 个线程。我想要以下代码。 if(xpos!=oldx){ printf("白球移动") }.那么如果执行此操作,我希望执行 10 秒“什么也不做”。
    【解决方案2】:

    您可以简单地每X 帧运行一次检测。在您的代码中添加一个帧计数器,在执行检测时重新开始为 0,在每个抓取的新帧处增加一个,并在计数器等于 300 时执行检测,因为您的视频显示在 30 fps。您将在每次检测之间延迟 10 秒。

    【讨论】:

    • 如果应用程序应该与不同类型的相机一起工作,而不仅仅是一种相机怎么办?如我的回答中所述,更可靠的解决方案是使用计时机制。
    猜你喜欢
    • 2017-05-24
    • 2016-06-01
    • 2017-07-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多