我正在尝试提高我正在使用 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);
}