我正在处理视频流,在 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]
它们都是相同,也与流中最后捕获的图像相同。
就好像缓冲区只保存最后捕获的图像并为任何调用的插槽检索它。知道为什么缓冲区没有存储它应该存储的所有图像吗?
最佳答案
感谢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
的所有实例都有自己的缓冲区,而不是共享一个缓冲区。
关于c++ - <Mat> 的循环缓冲区比应有的少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41487692/