Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 减少内存消耗_C++_Opencv - Fatal编程技术网

C++ 减少内存消耗

C++ 减少内存消耗,c++,opencv,C++,Opencv,我目前正在使用此代码分析网络摄像头帧: 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 (framen

我目前正在使用此代码分析网络摄像头帧:

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
我有没有办法避免这种情况?非常感谢先进的

编辑:谢谢大家的建设性反馈!我想我现在能做的就是改变我对这个问题的看法。我试图做到的是平均每15帧拍摄一次。例如:9000帧,我将有600张平均图片。因此,我创建了一个9000个图像的矢量,并使用计数器来实现。这是我稍后使用的代码:

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);
for(int i=0;i<600;i++)
{
Mat avgImg(480640,CV_32FC3,Scalar());
对于(framenumb=15*i;framenumb<(15*i)+15;++framenumb)
{
cv::累计(图像[framenumb],平均);
}
//将每15幅图像叠加为一幅图像
avgImg=avgImg/15;
平均转换器(平均,CV_8UC3);
字符文件名[80];
sprintf(文件名,“C:/AvgPics/test_u%d.jpeg”,framenumb);
imwrite(文件名,avgImg);

那么,有没有一种方法可以让我指定opencv在不使用9000图像向量的情况下平均每15幅图像一次?

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

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


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

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

9000个图像可能需要大量内存。我建议保存更少的图像,或者减少存储在
cv::Mat
类型中的每个图像的大小。我肯定支持@nobar,而且为什么您有完全相同的两个for循环?另外,为了代码的好处,可以在f for循环。640*480*3字节/帧*9000帧大约为8gb。标题有误导性-它不是
vector
使用内存,而是内存中的对象。我将编辑标题。带有64位程序的虚拟内存应该可以处理8gb的内存。这台机器有32GB的物理内存。这不是过度延迟调用
创建
直到调用frame.copyTo(images[framenumb])之前,在不需要的情况下,可能会使用相同的内存。
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);