2012/06/21

続テレビロガー

うーん、題名に違和感を感じつつも、続編です。
opencvの顔検出とROIの部分保存の2つのサンプルを糊でくっつけたようなものなので、あまり参考になりません。(^^;)ゞ
とりあえず、評価環境です。
・Ubuntu 12.04
・OpenCV 2.3.1 (apt-getでインストールしました)
・PC: sotec C101
・Camera: Qcam E3500
ROIを保存するファイル名が手抜きになっています。。。
 int
main(int argc, char *argv[])
{
  const char *imagename = argc > 1 ? argv[1] : "../../image/lenna.png";
  cv::Mat img;

  //Capture routine
  cv::VideoCapture cap(0);
  cap.set(CV_CAP_PROP_FRAME_WIDTH, 640);
  cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
  if(!cap.isOpened()) return -1;
//  cv::namedWindow("Capture", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
  cv::namedWindow("result", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);

  double scale = 4.0;

 while(1) {
  cap >> img;
//  cv::imshow("Capture", img); //output capture image

  cv::Mat gray, smallImg(cv::saturate_cast<int>(img.rows/scale), cv::saturate_cast<int>(img.cols/scale), CV_8UC1);
  // translation grayscale
  cv::cvtColor(img, gray, CV_BGR2GRAY);
  // Reduce the image in order to reduce processing time
  cv::resize(gray, smallImg, smallImg.size(), 0, 0, cv::INTER_LINEAR);
  cv::equalizeHist( smallImg, smallImg);

  // Reading of the classifier
  std::string cascadeName = "./haarcascade_frontalface_alt.xml"; // v2 Haar-like
//  std::string cascadeName = "./haarcascade_frontalface_default.xml"; // v1 Haar-like
  //std::string cascadeName = "./lbpcascade_frontalface.xml"; // LBP
  cv::CascadeClassifier cascade;
  if(!cascade.load(cascadeName))
    return -1;

  std::vector<cv::Rect> faces;
  cascade.detectMultiScale(smallImg, faces,
                           1.1, 2,
                           CV_HAAR_SCALE_IMAGE,
                           cv::Size(10, 10));

  // Rendering the result
  std::vector<cv::Rect>::const_iterator r = faces.begin();
  for(; r != faces.end(); ++r) {
    struct timeval tv;
    char clipout[200];
    cv::Point pt1, pt2; //draw rectangle
    int radius; //draw circle
    pt1.x = cv::saturate_cast<int>(r->x*3); //draw rectangle
    pt1.y = cv::saturate_cast<int>(r->y*3); //draw rectangle
    pt2.x = cv::saturate_cast<int>((r->x + r->width)*5); //draw rectangle
    pt2.y = cv::saturate_cast<int>((r->y + r->height)*5); //draw rectangle
    cv::rectangle( img, pt1, pt2, cv::Scalar(80,80,255), 3, 8, 0 ); //draw rectangle

    gettimeofday(&tv, NULL);
    sprintf(clipout,"./result/%d.%d.jpg",tv.tv_sec,tv.tv_usec);
    cv::Mat roi_img(img, cv::Rect(pt1.x, pt1.y, r->width*7, r->height*7));
    cv::imwrite(clipout,roi_img);
  }

  cv::imshow( "result", img );   
  cv::waitKey(66);
 }
}

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。