2012-04-07 102 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();