2017-05-27 1 views
0

J'essaie d'extraire tous les points de repère faciaux d'une image de visage et de sauvegarder cette image dans mon répertoire. Dans mon cas, je dois suivre ces étapes.Algorithme de détection des points de repère de visage, image de sortie disparaît C++, Dlib

  1. entrée l'image
  2. Extrait du ROI face
  3. Ensuite, en utilisant la Dlib extraire les repères face
  4. Ajouter une superposition à l'image
  5. Enregistrer cette image dans mon répertoire

J'ai essayé ce code C++, il donne la sortie dont j'avais besoin. Mais après avoir affiché une image superposée, elle disparaît très rapidement. Quelqu'un pourrait-il me dire quel est le problème avec ce code.

#include <dlib\opencv\cv_image.h> 
#include <opencv2/highgui/highgui.hpp> 
#include <dlib/image_processing/frontal_face_detector.h> 
#include <dlib/image_processing/render_face_detections.h> 
#include <dlib/image_processing.h> 
#include <dlib/gui_widgets.h> 

using namespace dlib; 
using namespace std; 
using namespace cv; 

int main() 
{ 
    try 
    { 

     cv::Mat src1; 
     src1 = imread("obama.jpg", CV_LOAD_IMAGE_COLOR); 

     //image_window win, win_faces; 
     image_window win; 
     Mat atom_image = Mat::zeros(500, 500, CV_8UC3); 


     // Load face detection and pose estimation models. 
     frontal_face_detector detector = get_frontal_face_detector(); 
     shape_predictor pose_model; 
     deserialize("shape_predictor_68_face_landmarks.dat") >> pose_model; 

      //cv::Mat temp; 
      //temp = src1; 

      cv_image<bgr_pixel> cimg(src1); 
      cv_image<bgr_pixel> black(atom_image); 
      // Detect faces 
      std::vector<rectangle> faces = detector(cimg); 

      cout << "Number of faces detected: " << faces.size() << endl; 

      // Find the pose of each face. 
      std::vector<full_object_detection> shapes; 
      //for (int i = 0; i < faces.size(); i++) { 
       //shapes.push_back(pose_model(cimg, faces[i])); 


       full_object_detection shape = pose_model(cimg, faces[0]); 


       shapes.push_back(pose_model(cimg, faces[0])); 


       //const full_object_detection& d = shapes[0]; 
       //ofstream outputfile; 
       //outputfile.open("data1.txt"); 


       cout << "pixel position of first part: " << shape.part(2) << endl; 

      // Display it all on the screen 
      //win.clear_overlay(); 
      win.set_image(cimg); 
      win.add_overlay(render_face_detections(shapes)); 

    } 
    catch (serialization_error& e) 
    { 
     cout << "You need dlib's default face landmarking model file to run this example." << endl; 
     cout << "You can get it from the following URL: " << endl; 
     cout << " http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2" << endl; 
     cout << endl << e.what() << endl; 
    } 
    catch (exception& e) 
    { 
     cout << e.what() << endl; 
    } 
} 

Répondre

1

Vous ne maintenez pas la fenêtre d'image. Une façon simple serait

win.set_image(cimg); 
win.add_overlay(render_face_detections(shapes)); 
waitKey(0); 

En outre, je ne vois pas de code où vous enregistrez la sortie dans le répertoire courant que vous avez mentionné dans la question. Vous pouvez regarder imwrite.