c++ - <Mat> 的循环缓冲区比应有的少

标签 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] 它们都是相同,也与流中最后捕获的图​​像相同。 就好像缓冲区只保存最后捕获的图​​像并为任何调用的插槽检索它。知道为什么缓冲区没有存储它应该存储的所有图像吗?

最佳答案

感谢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/

相关文章:

c++ - ctime(x) = ctime(x-600) 为什么?

c++ - Windows API MONITORINFO 结构

java - 示例案例的建议锁

python - 对for循环内的python子进程感到困惑

c++ - 将指向模板函数的指针作为函数参数传递?

c++ - 使用模板函数的不同类型的输入

java - 如何释放信号量并让任何线程继续运行?

java - Android:像 Dailymotion App 这样的视频播放器

java - 如何在 Spring MVC 中实现 HTTP 字节范围请求

c# - 如何在接收前不知道数据包大小的情况下通过 TCP 套接字接收数据包?