Обнаружение глаз с помощью CascadeClassifier_GPU (OpenCV)

#opencv #face-detection #cascade-classifier #eye-detection

#opencv #распознавание лиц #каскад-классификатор #обнаружение глаз

Вопрос:

Я пытаюсь одновременно обнаруживать лица и глаза, используя cacadeClassifier_GPU в OpenCV. Обнаружение лиц работает нормально, но не обнаруживает никаких глаз. Я использую opencv 2.4.9 (версия gpu) в Visual Studio 2010.

Вот мой код.

 for(;;)
{
  cap >> frame; // get a new frame from camera
  double t = (double)getTickCount();

  GpuMat faces;
  Mat frame_gray;
  cvtColor(frame, frame_gray, CV_BGR2GRAY);  // convert to gray image as face detection do NOT use color info

  int scale = 2;
  cv::Mat resized_frame_gray((int)(frame_gray.rows/ scale), (int)(frame_gray.cols/ scale),CV_8UC1);
  cv::resize(frame_gray, resized_frame_gray, resized_frame_gray.size() );

  GpuMat gray_gpu(resized_frame_gray);  // copy the gray image to GPU memory
  equalizeHist(resized_frame_gray,resized_frame_gray);

  int detect_num = cascadeFace.detectMultiScale(gray_gpu, faces, 1.2, 4, Size(10, 10) );  // call face detection routine

  Mat obj_host;
  faces.colRange(0, detect_num).download(obj_host);  // retrieve results from GPU
  Rect* cfaces = obj_host.ptr<Rect>();  // results are now in "obj_host"

  for(int i=0;i<detect_num;  i)
  {

     Point pt1 = cfaces[i].tl();
     pt1.x *= scale;
     pt1.y *= scale;

     Size sz = cfaces[i].size();
     Point pt2(pt1.x sz.width*scale, pt1.y sz.height*scale);
     rectangle(frame, pt1, pt2, Scalar(255));

     Mat faceROI = resized_frame_gray( cfaces[i] );
     GpuMat faceROIgpu(faceROI);
     GpuMat eyes;

     //-- In each face, detect eyes
     int detect_num2 = cascade_eye.detectMultiScale( faceROIgpu, eyes, 1.2, 4, Size(10, 10) );
     Mat obj_host_eye;
     eyes.colRange(0, detect_num2).download(obj_host_eye);
     Rect* cEyes = obj_host_eye.ptr<Rect>();

     //cout<<detect_num2<<endl;
     for( int j = 0; j < detect_num2; j   ) 
     {
         Point pt1_e = cEyes[i].tl();
         pt1_e.x *= scale;
         pt1_e.y *= scale;

         Size sz_e = cEyes[i].size();
         Point pt2_e(pt1_e.x sz_e.width*scale, pt1_e.y sz_e.height*scale);
         rectangle(frame, pt1_e, pt2_e, Scalar(255,0,255));
      }

   imshow("faces", frame);

   waitKey(1);
}
  

Комментарии:

1. обнаруживает ли cascade_eye что-либо (например, ложные срабатывания) на изображениях в натуральную величину? Можете ли вы добавить строки, в которых вы создаете и открываете cascade_eye и cascade_face? Вы уверены, что глаза нарисованы в правильном месте? Поскольку вы пытаетесь обнаружить их в субизображении, но рисуете их в полноразмерном изображении, может возникнуть ошибка преобразования (я слишком ленив, чтобы анализировать этот сложный код), я бы предложил попробовать что-то вроде rectangle(frame(cFaces[i]), cEyes[i], Scalar(255,0,255)); нарисовать нетрансформированные местоположения в субизображении кадра.

2. ах, хорошо, масштаб все еще может потребоваться, потому что вы масштабировали исходное изображение… Но вам придется нарисовать их относительно вашего прямоугольника лица!