2

我正在尝试提高我正在使用 OpenCV 在嵌入式 Linux 计算机上运行的实时计算机视觉程序的捕获性能。我想使用多个线程和一个共享内存缓冲区来分离(1)捕获视频帧和(2)处理它们的任务(我相信这是一个“生产者/消费者问题”)。我已经阅读了 pthread、互斥变量和条件变量,但不明白如何将它们与select()函数一起使用。

现在,视频帧是使用改编自Video4Linux2 视频捕获示例的代码捕获的,该示例使用select(). 据我了解,select()在网络摄像头提供数据之前会阻止程序,这可能会很慢并且会浪费大量时间。如果可能的话,我想利用那些浪费的 CPU 周期来处理图像。(当然,这意味着必须始终对“陈旧”一帧的图像进行处理,但在 30 fps 时它实际上是实时的)。

我找到了一些使用和保护共享数据的示例代码,但似乎这些代码仍然会阻止“处理”线程在通过. 更具体地说,这里有一些伪代码来说明我的担忧。(注意:我意识到这些线程需要包含循环和其他检查,如上面链接的示例才能真正正常工作。)pthread_mutex_lock()pthread_mutex_control()select()

void* capture()
{
    pthread_mutex_lock(&mutex);             // protect shared data
    pthread_cond_wait(&space_avail,&mutex); // make sure the buffer has room

    ///  capture code... ///

    select(fd+1, &fds, NULL, NULL, &tv);  // waiting for data...
                                          // Want to be processing frames
                                          // during select, but won't the
                                          // processing thread be blocked
                                          // by the mutex lock?

    // store image to the frame buffer

    /// more capture code... ///

    pthread_cond_signal(&data_avail);
    pthread_mutex_unlock(&mutex);
}


void* process()
    pthread_mutex_lock(&mutex);
    pthread_cond_wait(&data_avail);

    // access the most recently stored frame from the buffer

    /// Do image processing ///

    pthread_mutex_signal(&space_avail);
    pthread_mutex_unlock(&mutex);
}
4

1 回答 1

0

如果我正确理解了您的问题,您希望避免在程序等待选择时浪费的繁忙等待周期,然后将其用于图像处理。如果我错了,请纠正我。

根据我的经验,一个简单的方法是为选择 API 指定一个小的超时时间。Select API 将等待此超时。如果在此期间它从网络摄像头接收到任何数据,则 select 的返回值将非零。如果在这段时间内没有看到任何有趣的东西,则返回值为 0。

所以你的伪代码可以修改如下:

void* capture(){
    while(true){//iterate how many times you feel it is valid to
        if (select(fd+1, &fds, NULL, NULL, &tv)!=0){
              //We have found something here.take data from the webcam.
              //break from the loop.
              break;
         }else{
              //timeout occurred. process the image.
         }
     }
     //process the data from the webcam
}

让我知道这是否可以解决您的问题。有关 Select API 的更多信息,请访问: http: //linux.die.net/man/2/select

于 2013-10-23T23:39:22.633 回答