<mat>的循环缓冲区保持的比它应该的少

时间:2017-01-05 14:37:27

标签: c++ multithreading video-streaming buffer circular-buffer

我在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]时它们都是相同的,也与上一次捕获的图像相同流。     就好像缓冲区仅保存最后捕获的图​​像并为任何被调用的槽检索它。任何想法为什么缓冲区不存储它应该是的所有图像?

1 个答案:

答案 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的所有实例都有自己的缓冲区而不是共享缓冲区。