c++ - 函数调用中的 OpenCV 错误 : insufficient memory,

标签 c++ opencv

我有一个看起来像这样的函数:

void foo(){
     Mat mat(50000, 200, CV_32FC1);

     /* some manipulation using mat */

     }

然后经过几个循环(在每个循环中,我调用一次foo()),它给出了一个错误:

OpenCV Error: insufficient memory when allocating (about 1G) memory.

据我所知,Mat 是本地的,一旦 foo() 返回,它就会自动取消分配,所以我想知道为什么它会泄漏。

它泄漏了一些数据,但不是全部。

这是我的实际代码:

bool VidBOW::readFeatPoints(int sidx, int eidx, cv::Mat &keys, cv::Mat &descs, cv::Mat &codes, int &barrier) {
    // initialize buffers for keys and descriptors
    int num = 50000; /// a large number
    int nDims = 0; /// feature dimensions


    if (featName == "STIP")
        nDims = 162;

    Mat descsBuff(num, nDims, CV_32FC1);
    Mat keysBuff(num, 3, CV_32FC1);
    Mat codesBuff(num, 3000, CV_64FC1);

    // move overlapping codes from a previous window to buffer
    int idxPre = -1;
    int numPre = keys.rows;
    int numMov = 0; /// number of overlapping points to move

    for (int i = 0; i < numPre; ++i) {
        if (keys.at<float>(i, 0) >= sidx) {
            idxPre = i;
            break;
        }
    }

    if (idxPre > 0) {
        numMov = numPre - idxPre;
        keys.rowRange(idxPre, numPre).copyTo(keysBuff.rowRange(0, numMov));
        codes.rowRange(idxPre, numPre).copyTo(codesBuff.rowRange(0, numMov));
    }

    // the starting row in code matrix where new codes from the updated features to add in
    barrier = numMov;

    // read keys and descriptors from feature file
    int count = 0; /// number of new points that are read in buffers
    if (featName == "STIP")
        count = readSTIPFeatPoints(numMov, eidx, keysBuff, descsBuff);

    // update keys, descriptors and codes matrix
    descsBuff.rowRange(0, count).copyTo(descs);
    keysBuff.rowRange(0, numMov+count).copyTo(keys);
    codesBuff.rowRange(0, numMov+count).copyTo(codes);

    // see if reaching the end of a feature file
    bool flag = false;

    if (feof(fpfeat))
        flag = true;

    return flag;
}

最佳答案

您没有发布调用您的函数的代码,所以我无法判断这是否是真正的内存泄漏。您在 readFeatPoints() 中分配的 Mat 对象将被正确释放,因此我看不到内存泄漏。

您声明 Mat codesBuff(num, 3000, CV_64FC1);。对于 num = 5000,这意味着您正试图在一个大块中分配 1.2 GB 的内存。您还使用以下行将其中一些数据复制到 codes:

codesBuff.rowRange(0, numMov+count).copyTo(codes);

如果 numMove + count 的值在迭代之间发生变化,这将导致在 codes 中重新分配数据缓冲区。如果该值足够大,您可能还会消耗大量在循环迭代中持续存在的内存。这两件事都可能导致 heap fragmentation .如果在任何时候都没有 1.2 GB 的内存块等待,则会发生内存不足错误,这就是您所遇到的情况。

关于c++ - 函数调用中的 OpenCV 错误 : insufficient memory,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17865223/

相关文章:

android - OpenCV4Android 示例应用程序 - 此代码 fragment 的作用是什么?

c++ - 如何正确使用指针 vector ?

c++ - C++ 代码中的大负输出

android - 如何在后台使用 Android 相机?

python - 将作为二进制字符串加载的图像转换为 numpy 数组

python - 如何改进我的 python openCV 视频流?

opencv - 真实比例的3D重建

c++ - 无法为arm-none-linux-gnueabi-g++编译器找到-lpaho-mqtt3c

c++ - 英特尔 PIN 例程地址检索 : Linux vs. Windows

c++ - 将光标位置存储在类对象中(ncurses c++)