2014-02-14 97 views
1

我使用OpenCV检测几幅图像中的人脸,然后将人脸图像(矩形)保存为jpg文件。但是,由于我有很多图像,我得到了内存不足的OpenCV错误。我知道这是因为使用了IplImage,它不会自行释放,我应该使用cv::Mat来代替,但我无法找到我想要使用cv::Mat的解决方案。任何人都可以帮忙吗?OpenCV替换IplImage的垫子

这是我的代码

int main (int argc, const char* argv[]) 
{ 

    cv::CascadeClassifier face_cascade; 

    face_cascade.load("haarcascade_frontalface_alt.xml"); 

    cv::Mat captureFrame; 
    cv::Mat grayscaleFrame; 

    DIR *dir; 
    struct dirent *ent; 
    if ((dir = opendir ("c:\\images\\")) != NULL) { 
     int counter = 1; 
     while ((ent = readdir (dir)) != NULL) { 
      printf ("%s\n", ent->d_name); 

      std::string fullPath = std::string("c:\\images\\") + ent->d_name; 

      captureFrame = cv::imread(fullPath); 

      cvtColor(captureFrame, grayscaleFrame, CV_BGR2GRAY); 
      equalizeHist(grayscaleFrame, grayscaleFrame); 

      std::vector<cv::Rect> faces; 

      face_cascade.detectMultiScale(grayscaleFrame, faces, 1.2,2,CV_HAAR_DO_CANNY_PRUNING, cv::Size(60, 60)); 

      for(int i = 0; i < faces.size(); i++) 
      { 
       IplImage* img = cvCloneImage(&(IplImage)captureFrame); 
       cvSetImageROI(img, cvRect(faces.at(i).x, faces.at(i).y, faces.at(i).width, faces.at(i).height)); 

       IplImage *img2 = cvCreateImage(cvGetSize(img), 
        img->depth, 
        img->nChannels); 

       cvCopy(img, img2, NULL); 

       cvResetImageROI(img); 

       std::stringstream sstm; 
       sstm << "faces\\" <<counter << ".jpg"; 
       string result = sstm.str(); 

       cvSaveImage (result.c_str() , img2); 

       counter++; 
      } 
     } 
     closedir (dir); 
    } 
    return 1; 
} 

回答

1

好想法摆脱iplimages!

看,它变得更容易,太:

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

    Mat roi(captureFrame, faces[i]); 

    std::stringstream sstm; 
    sstm << "faces\\" <<counter << ".jpg"; 
    string result = sstm.str(); 

    imwrite(result.c_str() , roi); 

    counter++; 
} 
2

下面的线裁剪矩形并复制成毡式。

Mat cropped = captureframe(faces[i]); 

下面的行将裁剪后的图像保存到您的项目目录中,名称以数字形式存储在计数器(int类型)中。

imwrite(format("%d.jpg", counter), cropped); 

如果您正在训练识别器,请不要忘记在保存前将所有图像调整为相同大小。