簡體   English   中英

一種有效的方式來實時緩沖高清視頻而不會占用大量內存

[英]An efficient way to buffer HD video real-time without maxing out memory

我正在編寫一個程序,涉及使用OpenCV從網絡攝像機實時處理視頻。 我希望能夠捕獲(在處理過程中的任何時間)以前的圖像(例如,比如說十秒)並保存到視頻文件中。

我目前正在使用隊列作為緩沖區(推送'cv :: Mat'數據),但這顯然效率不高,因為幾秒鍾的圖像很快耗盡了所有的PC內存。 我嘗試使用'cv :: imencode'壓縮圖像但是使用PNG沒有太大區別,我需要一個使用硬盤驅動器內存並且高效實時操作的解決方案。

有人能建議一個非常簡單有效的解決方案嗎?

編輯:

這樣每個人都明白我現在在做什么; 這是10秒緩沖區的代碼:

void run()
{
    cv::VideoCapture cap(0);
    double fps = cap.get(CV_CAP_PROP_FPS);
    int buffer_lenght = 10;     // in seconds
    int wait = 1000.0/fps;
    QTime time;


    forever{
        time.restart();
        cv::mat image;
        bool read = cap.read(image);

        if(!read)
            break;

        bool locked = _mutex.tryLock(10);

        if(locked){
            if(image.data){
                _buffer.push(image);

                if((int)_buffer.size() > (fps*buffer_lenght))
                    _buffer.pop();
            }
            _mutex.unlock();
        }

        int time_taken = time.elapsed();
        if(time_taken<wait)
            msleep(wait-time_taken);

    }

    cap.release();
}

queue<cv::Mat> _bufferQMutex _mutex是全局變量。 如果您熟悉QT,信號和插槽等,我有一個插槽來抓取緩沖區並使用cv :: VideoWriter將其保存為視頻。

編輯:我認為理想的解決方案是我的queue<cv::Mat> _buffer使用硬盤內存而不是pc內存 不確定哪個星球可行? :/

我建議用x264或類似的方法研究實時壓縮。 x264經常用於視頻流的實時編碼 ,並且通過正確的設置,可以在中等功率的處理器中編碼多個流或1080p視頻流。 我建議在doom9的論壇或類似論壇中提問

x264是一個免費的h.264編碼器,可以實現100:1或更好(與原始)壓縮。 x264的輸出可以存儲在您的內存隊列中,其效率遠高於未壓縮(或無損壓縮)的視頻。

更新

您可以做的一件事是使用imwrite將圖像存儲到硬盤並將其文件名更新到隊列。 隊列已滿時,在彈出文件名時刪除圖像。
在視頻寫入插槽中,加載從隊列中彈出的圖像並將其寫入VideoWriter實例


你提到你需要使用硬盤內存

在這種情況下,請考慮使用OpenCV HighGUI VideoWriter 您可以創建VideoWriter的實例,如下所示:

VideoWriter record("RobotVideo.avi", CV_FOURCC('D','I','V','X'), 
    30, frame.size(), true);

並將圖像捕獲寫入如下:

record.write(image);

在網站上查找文檔示例程序

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM