OpenCV Error: Insufficient memory

在使用OpenCV从视频预处理人脸训练数据时,在正常运行一段时间后,程序报错 。


这里写图片描述

上述错误是典型的内存溢出错误,肯定是程序中存在使用后的指针没有释放,检查后发现使用是使用的IplImage* srcCopy参数在函数结束(或者已经不用了)的地方没有释放,只需要在相应的位置使用cvReleaseImage(&srcCopy)释放掉就可以。其他情况可类似排查,实例代码如下:

// 截取人脸,并保存
void CropFaceAndSave(const Mat& imgInput, bool isRight, const string& filename){

    IplImage* src = &IplImage(imgInput);
    IplImage* srcCopy;

    int ratio = 3; // imgorl/imgdeal = 3 将图像缩小3倍处理

    if (isRight)
    {
        srcCopy = cvCreateImage(cvSize(src->height, src->width), src->depth, src->nChannels);
        cvTranspose(src, srcCopy);
        cvFlip(srcCopy, NULL, 0);
    }
    else{
        srcCopy = cvCreateImage(cvSize(src->width, src->height), src->depth, src->nChannels);
        cvCopy(src, srcCopy, 0);
    }

    Mat imgOriginal(srcCopy), imgResult;

    resize(imgOriginal, imgResult, Size(srcCopy->width / ratio, srcCopy->height / ratio));

    // 对imgcopy检测人脸
    Mat face_gray;

    cvtColor(imgResult, face_gray, CV_BGR2GRAY);  //rgb类型转换为灰度类型    
    equalizeHist(face_gray, face_gray);   //直方图均衡化    

    face_cascade.detectMultiScale(face_gray, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));

    for (int i = 0; i < faces.size(); i++){

        // 起始点
        Point pointStart(faces[i].x, faces[i].y);
        Point pointEnd(faces[i].x + faces[i].width, faces[i].y + faces[i].height);
        Point center(int(faces[i].x + faces[i].width*0.5), int(faces[i].y + faces[i].height*0.5));

        rectangle(imgResult, pointStart, pointEnd, Scalar(255, 0, 0), 2, 8, 0);

        // 阈值选取,滤除小的干扰
        if (ratio*faces[i].width < srcCopy->width / 3){
            //cout << "滤除 x = " << ratio*faces[i].x << ", y = " << ratio*faces[i].y << endl;
            continue;
        }

        // 计算原图上的截取区域,并截取
        Point centerInOrignal(ratio*center.x, ratio*center.y);
        // cout << "x = " << centerInOrignal.x << ", y = " << centerInOrignal.y << endl;

        // 可以剪裁
        if (centerInOrignal.y >= 360){

            if (centerInOrignal.y > 720){
                centerInOrignal.y = 720;
            }

            // 新建ROI大小的图片
            cvSetImageROI(srcCopy, cvRect(0, centerInOrignal.y - 360, srcCopy->width, srcCopy->width));
            IplImage* imgCrop = cvCreateImage(cvSize(srcCopy->width, srcCopy->width), srcCopy->depth, srcCopy->nChannels);
            cvCopy(srcCopy, imgCrop, 0);
            cvResetImageROI(srcCopy);

            Mat imgCropResult(imgCrop);
            imshow("Crop ROI", imgCropResult);

            stringstream ss;
            string indexStr;
            ss << saveIndex;
            ss >> indexStr;

            imwrite(filename + "\\real" + indexStr + ".png", imgCropResult);

            cvReleaseImage(&imgCrop); // 不用的指针一定要释放掉,不然内存会泄露
            saveIndex++;
        }

    }

    imshow("检测人脸", imgResult);
    // 注意,这个指针不用释放,他不是我们新建出来的,只是指向了现有内存空间,而那块空间在栈中,系统会自动释放
    //cvReleaseImage(&src);
    // 只需要释放我们申请的内存
    cvReleaseImage(&srcCopy);

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,cv2.errorOpenCV库中的一个错误类型。在引用中,报错信息是"OpenCV(4.8.0) D:\a\opencv-python\opencv-python\opencv\modules\core\src\alloc.cpp:73: error: (-4:Insufficient memory)",意味着内存不足。而在引用中,报错信息是"OpenCV(4.8.0) D:\a\opencv-python\opencv-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'",意味着函数未实现或缺少相关支持库。 这些错误通常是由于OpenCV库的版本不匹配或者缺少相关依赖库引起的。解决这些错误的方法如下: 1. 内存不足错误: - 检查系统内存使用情况,确保有足够的可用内存。 - 如果内存不足,可以尝试释放一些内存或者增加系统内存。 - 如果问题仍然存在,可以尝试降低图像或数据的分辨率,以减少内存使用量。 2. 函数未实现或缺少支持库错误: - 确认OpenCV库的版本是否与代码兼容。如果版本不匹配,可以尝试升级或降级OpenCV库。 - 检查是否缺少相关的支持库。根据错误信息中提到的支持库,可以尝试安装libgtk2.0-dev和pkg-config等库,并重新运行cmake或配置脚本。 请注意,具体的解决方法可能因具体情况而异。建议根据错误信息中提供的详细信息和您的系统环境进行进一步调查和尝试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值