2016-11-10 142 views
0

我目前使用此代码来分析网络摄像头帧:减少内存消耗

int main() 
{ 
    VideoCapture cap(0); // open the default camera 
    if (!cap.isOpened()) // check if we succeeded 
     return -1; 
    cap.set(CV_CAP_PROP_FPS, 15); 

    std::vector<cv::Mat> images(9000); 
    for (framenumb = 0; framenumb < 9000; ++framenumb) 
    { 
     images[framenumb].create(480, 640, CV_8UC3); 
    } 
    for (framenumb = 0; framenumb < 9000; ++framenumb) 
    { 
     Mat frame; 
     cap >> frame; 
     if (frame.empty()) break; // end of video stream 
     if (waitKey(1) == 27) break; // stop capturing by pressing ESC 
     frame.copyTo(images[framenumb]); 
     imshow("webcam", images[framenumb]); 
    } 
    //We can then process the captured frames 

但是,它会导致内存不足错误:

OpenCV Error: Insufficient Memory (failed to allocate xyz bytes) in unknown function, file 
..\..\opecv\modules\core\src\alloc.cpp line 52. 

有我避免这种情况的方式?非常感谢先进!

编辑:感谢所有建设性的反馈大家!我想我现在所能做的就是改变我对这个问题的态度。我试图完成的是平均每15帧。例如:9000帧,我将有600张平均图片。因此,我创建了9000个图像的载体,使用计数器来实现that.This是我后来使用的代码:

for (int i = 0; i < 600; i++) 
      { 
       Mat avgImg(480, 640, CV_32FC3, Scalar()); 
       for (framenumb = 15 * i; framenumb < (15 * i) + 15; ++framenumb) 
       { 
        cv::accumulate(images[framenumb], avgImg); 
       } 
       //stacking every 15 images into a single image 
       avgImg = avgImg/15; 
       avgImg.convertTo(avgImg, CV_8UC3); 
       char filename[80]; 
       sprintf(filename, "C:/AvgPics/test_%d.jpeg", framenumb); 
       imwrite(filename, avgImg); 

那么,有没有办法为我指定的OpenCV采取每15幅图像的平均,而无需使用9000图像矢量?

+2

9000图像可能需要大量内存。我建议少放一些图像,或者减少每个图像的大小,并保存在'cv :: Mat'类型中。 – nobar

+1

我肯定在@nobar上,也为什么你有完全相同的两个循环? 此外,为了您的代码的良好,可以在for循环的外部声明** Mat frame **。 – Prometheus

+1

640 * 480 *每帧3字节* 9000帧大约8千兆字节。 – molbdnilo

回答

2

您可能需要找到一种方法来处理您的框架,而无需同时打开它们。

我并不真正了解OpenCV的语法,但似乎打开了9000 * 480像素的图像,要求假设每像素3个字节,内存为9000 * 480 * 640 * 3个字节,即8个GB。用“经典数量”的RAM来处理标准计算机并不容易。

如果治疗是连续的,并不需要同时打开所有的帧,最好的办法是调整治疗顺序逐帧完成。

+0

具有64位程序的虚拟内存应该处理8GB的罚款。这台机器有32GB物理内存。这并不过分 –

7

编译为64位。 8 GB不会过多,但32位程序最多只限于4GB。 (我假设你有足够的内存 - 总共至少12 GB)。 OpenCV支持64位。

+0

在调用frame.copyTo(images [framenumb])之前,延迟调用'create'直到* just *,在不需要的情况下可能会使用相同的内存。 –