首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >减少内存消耗

减少内存消耗
EN

Stack Overflow用户
提问于 2016-11-10 23:30:18
回答 2查看 546关注 0票数 0

我目前正在使用这段代码来分析网络摄像头的框架:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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是我后来使用的代码:

代码语言:javascript
复制
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个图像向量?

EN

回答 2

Stack Overflow用户

发布于 2016-11-10 23:52:06

编译为64位。8 GB并不算多,但32位程序最多只能支持4 GB。(我假设您确实有足够的RAM -总共至少12 GB )。OpenCV支持64位。

票数 7
EN

Stack Overflow用户

发布于 2016-11-10 23:39:29

您可能需要找到一种方法来处理您的帧,而不是同时打开所有帧。

我真的不知道OpenCV语法,但似乎打开了9000张480*640像素的图像,假设每像素3个字节,则需要9000*480*640*3字节的内存,即8 GB。用一台具有“经典数量”RAM的标准计算机来处理这个问题并不容易。

如果处理是按顺序进行的,并且不需要同时打开所有帧,那么最好的做法是调整处理方式,以便逐帧地进行处理。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40531270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档