我正在编写一个程序,该程序涉及使用 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
使用硬盘内存而不是电脑内存。不确定这在哪个星球上是可能的?:/