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

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.

我有办法避免这种情况吗?非常感谢高级!

编辑:感谢大家的所有 build 性反馈!我想我现在所能做的就是改变我解决问题的方法。我试图完成的是平均每15帧拍摄一次。例如:使用9000帧,我将获得600张平均图片。因此,我创建了一个9000张图像的 vector 并使用counter来实现这一目标,这是我稍后使用的代码:
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张图像 vector ?

最佳答案

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

关于c++ - 减少内存消耗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40531270/

10-12 22:12