[英]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> _buffer
和QMutex _mutex
是全局變量。 如果您熟悉QT,信號和插槽等,我有一個插槽來抓取緩沖區並使用cv :: VideoWriter將其保存為視頻。
編輯:我認為理想的解決方案是我的queue<cv::Mat> _buffer
使用硬盤內存而不是pc內存 。 不確定哪個星球可行? :/
更新
您可以做的一件事是使用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.