我在C ++代码中使用Mat
的增强循环缓冲区处理视频流。一个线程推送Mat
个对象:
void* capture(void* arg){
boost::circular_buffer<Mat> cb(2000);
Mat frame;
while ((VideoCapture >> frame), !frame.empty()) {
pthread_mutex_lock(&mtx);
cb.push_back(frame);
pthread_mutex_unlock(&mtx);
}
}
其他线程处理并弹出它们:
void* process(void* arg){
while (1){
Mat frame;
pthread_mutex_lock(&mtx);
frame =cb.front();
cb.pop_front();
pthread_mutex_unlock(&mtx);
scan(frame);
}
}
然而,即使使用完整缓冲区,与视频流相比也没有延迟。我检查了缓冲区cb[1]
中的第一个(前面)图像和最后一个(后面)图像,当缓冲区已满cb[1999]
时它们都是相同的,也与上一次捕获的图像相同流。
就好像缓冲区仅保存最后捕获的图像并为任何被调用的槽检索它。任何想法为什么缓冲区不存储它应该是的所有图像?
答案 0 :(得分:1)
感谢Sean Cline我能够解决这个问题。 我不得不改变我的捕获线程:
void* capture(void* arg){
boost::circular_buffer<Mat> cb(2000);
Mat frame;
while ((VideoCapture >> frame), !frame.empty()) {
pthread_mutex_lock(&mtx);
cb.push_back(frame);
pthread_mutex_unlock(&mtx);
}
}
为:
void* capture(void* arg){
boost::circular_buffer<Mat> cb(2000);
Mat frame;
while ((VideoCapture >> frame), !frame.empty()) {
Mat image;
frame.copyTo(image);
pthread_mutex_lock(&mtx);
cb.push_back(image);
pthread_mutex_unlock(&mtx);
}
}
这样推入缓冲区的Mat
对象在同一个while
循环中声明。我使用了copyTo()
,因为在Mat
循环的条件中使用了while
帧。这使得Mat image
的所有实例都有自己的缓冲区而不是共享缓冲区。