2012-04-07 194 views
2

我正在研究人脸检测问题,我有工作代码,使用Android的FaceDetector找到脸,但我需要找出一种方法来实现OpenCV/JavaCV函数来检测脸部。这不是使用实时相机,它使用图库中的图像,我能够检索该图像路径,但我似乎无法获得CvHaarClassifierCascade分类器,并且CvMemStorage存储器已初始化,如果有人不能指向正确的方向或者提供一些在Java中正确初始化这些变量的源代码。 谢谢OpenCV/JavaCV Android人脸检测初始化

回答

1

你可以这样做:只需提供一个BufferedImage。

或者使用cvLoadImage(..)直接使用图像路径加载原始IplImage。

// provide an BufferedImage 
BufferedImage image; 

// Preload the opencv_objdetect module to work around a known bug. 
Loader.load(opencv_objdetect.class); 

// Path to the cascade file provided by opencv 
String cascade = "../haarcascade_frontalface_alt2.xml" 

CvHaarClassifierCascade cvCascade = new CvHaarClassifierCascade(cvLoad(cascade)); 

// create storage for face detection 
CvMemStorage tempStorage = CvMemStorage.create(); 

// create IplImage from BufferedImage 
IplImage original = IplImage.createFrom(image); 

IplImage grayImage = null; 

if (original.nChannels() >= 3) { 
    // We need a grayscale image in order to do the recognition, so we 
    // create a new image of the same size as the original one. 
    grayImage = IplImage.create(image.getWidth(), image.getHeight(), 
       IPL_DEPTH_8U, 1); 
    // We convert the original image to grayscale. 
    cvCvtColor(original, grayImage, CV_BGR2GRAY); 
} else { 
    grayImage = original.clone(); 
} 

// We detect the faces with some default params 
CvSeq faces = cvHaarDetectObjects(grayImage, cvCascade, 
      tempStorage, 1.1, 3, 
      0; 

// Get face rectangles 
CvRect[] fArray = new CvRect[faces.total()]; 
for (int i = 0; i < faces.total(); i++) { 
      fArray[i] = new CvRect(cvGetSeqElem(faces, i)); 
     } 
// print them out 
for(CvRect f: fArray){ 
    System.out.println("x: " + f.x() + "y: " + f.y() + "width: " + f.width() + "height: " + f.height()); 
} 

tempStorage.release();