OpenCV を使用して、ネットワーク カメラからのビデオをリアルタイムで処理するプログラムを作成しています。(処理中にいつでも) 以前の画像 (たとえば、10 秒分) をキャプチャして、ビデオ ファイルに保存できるようにしたいと考えています。
私は現在、バッファとしてキューを使用してこれを行っています(「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 を使用してビデオとして保存するスロットがあります。
編集: 理想的な解決策は、 PC メモリではなくハード ドライブ メモリqueue<cv::Mat> _buffer
を使用することだと思います。どの惑星でこれが可能かわかりませんか? :/