認知情報解析 Jo Project beta 2

// openCVを使った顔検出
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv/highgui.h"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv/cv.h"
#include "iostream"
#include "stdlib.h"
#include "fstream"

using namespace cv;
int main(int argc, char **argv) {
  IplImage *src_img=0, *src_gray=0;
  if (argc < 2 || (src_img = cvLoadImage (argv[1], CV_LOAD_IMAGE_COLOR)) == 0)
    return -1;
  src_gray = cvCreateImage (cvGetSize (src_img), IPL_DEPTH_8U, 1);
    
  CvMemStorage *storage = 0;
  storage = cvCreateMemStorage (0);
  cvClearMemStorage (storage);
  cvCvtColor (src_img, src_gray, CV_BGR2GRAY);
  cvEqualizeHist (src_gray, src_gray);
    
  CvMemStorage* FaceStorage = cvCreateMemStorage(0);
  CvHaarClassifierCascade* FaceCascade = (CvHaarClassifierCascade*)
    cvLoad("/opt/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt_tree.xml");
    
  std::ofstream out_file("DetectedFace.out");
  out_file<<"xMin,"<<"yMin,"<<"xMax,"<<"yMax"<<'\n';

  cvClearMemStorage( FaceStorage );
  CvSeq* FaceObjects = cvHaarDetectObjects(src_img,FaceCascade,FaceStorage,1.1,4,0,
    cvSize( 30, 30 ));
  CvRect* rF;
  // detect at most 10 faces
  int n=std::min(10,(FaceObjects ? FaceObjects->total : 0 ));
  for (int i=0;i<n;++i){
    rF = ( CvRect* )cvGetSeqElem( FaceObjects, i );
    out_file<<rF->x<<","<< rF->y<<","<<rF->x+rF->width<<","<<rF->y+rF->height<<'\n';
  }
  cvReleaseImage(&src_img);
  cvReleaseImage(&src_gray); 
  return 0;
}
# 上のopenCVのプログラムをRで使用する関数
JoFaceDetection<-function(file_name) {
  res<-system(paste("./JoFaceDetect ",file_name))
  if (res!=0) {
    warning("incorrect file name");
    return(-99)   	
  } else {
    xys=read.csv("DetectedFace.out");
    if (nrow(xys)!=0) {
      print("successfully detected face(s)");
      return(xys);
    } else {
      print("no face was detected");
      return(-99);
    }
  }
}

実行例

loc<-JoFaceDetection("~/Downloads/IMG_2095.jpg")
[1] "successfully detected face(s)"
> loc
  xMin yMin xMax yMax
1  307  114  521  328

認知情報解析B face detection

徐くんプロジェクト
OpenCVを使った顔と目の検出。

#include "opencv2/objdetect/objdetect.hpp"
#include "opencv/highgui.h"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>

int main(int argc, char** argv){
  IplImage* img=cvLoadImage(argv[1]);
  CvMemStorage* FaceStorage = cvCreateMemStorage(0);
  CvMemStorage* EyeStorage = cvCreateMemStorage(0);
  CvHaarClassifierCascade* FaceCascade = (CvHaarClassifierCascade*)  
   cvLoad("/opt/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt_tree.xml");
  CvHaarClassifierCascade* EyeCascade =(CvHaarClassifierCascade*) 
   cvLoad("/opt/local/share/OpenCV/haarcascades/haarcascade_eye_tree_eyeglasses.xml");
  double scale = 1.2;
  
  // Detect Faces
  cvClearMemStorage(FaceStorage);
  CvSeq* FaceObjects = cvHaarDetectObjects(img,FaceCascade,FaceStorage,scale,1.1,0,cvSize(1,1));
  CvRect* rF;
  // Loop through objects and draw boxes
  for (int i=0;i<(FaceObjects ? FaceObjects->total:0);i++ ){
    rF = ( CvRect* )cvGetSeqElem(FaceObjects,i);
    cvRectangle(img,cvPoint(rF->x,rF->y),cvPoint(rF->x+rF->width,rF->y+rF->height ),
      CV_RGB(255,0,0),3,4,0);
  }
  // Detect Eyes
  cvClearMemStorage(EyeStorage);
  CvSeq* EyeObjects = cvHaarDetectObjects(img,EyeCascade,EyeStorage,scale,1.1,0,cvSize(1,1));
  CvRect* rE;
  // Loop through objects and draw boxes
  for (int i=0;i<(EyeObjects ? EyeObjects->total:0);i++){
    rE = ( CvRect* )cvGetSeqElem(EyeObjects,i);
    cvRectangle(img,cvPoint(rE->x,rE->y),cvPoint(rE->x+rE->width,rE->y+rE->height ),
      CV_RGB(0,0,255),3,4,0);
  }
  // Displaying image
  cvNamedWindow("Face&Eye Detection");
  cvShowImage("Face&Eye Detection",img);
  cvWaitKey();
  cvReleaseImage(&img);    
  return 0;
}

opencvFD01input.jpg opencvFD01output.jpg

パラメターを変えないと、うまくは検出されないこともある。口と鼻の検出の精度は低いみたい。