2017-02-14 43 views
0

Я пытаюсь запустить следующий код и определить ориентиры лица фреймов, которые берутся с веб-камеры.Как использовать «shape_predictor_68_face_landmarks.dat» в извлечении ориентира в opencv C++ с использованием Dlib

#include <dlib/opencv.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; 

int main() 
{ 
    try 
    { 
     cv::VideoCapture cap(0); 
     if (!cap.isOpened()) 
     { 
      cerr << "Unable to connect to camera" << endl; 
      return 1; 
     } 

     image_window win; 

     // 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; 

     // Grab and process frames until the main window is closed by the user. 
     while(!win.is_closed()) 
     { 
      // Grab a frame 
      cv::Mat temp; 
      cap >> temp; 
      // Turn OpenCV's Mat into something dlib can deal with. Note that this just 
      // wraps the Mat object, it doesn't copy anything. So cimg is only valid as 
      // long as temp is valid. Also don't do anything to temp that would cause it 
      // to reallocate the memory which stores the image as that will make cimg 
      // contain dangling pointers. This basically means you shouldn't modify temp 
      // while using cimg. 
      cv_image<bgr_pixel> cimg(temp); 

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

      // 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; 
    } 
} 

Но при выполнении этого .cpp-файла он выводит консольный вывод следующим образом.

enter image description here

Как и в этом у меня скачать shape_predictor_68_face_landmarks.dat. Но я не знаю, где добавить этот каталог .dat и whish для включения. Может ли кто-нибудь сказать мне, как использовать этот shape_predictor_68_face_landmarks.dat.

ответ

1

ошибка, кажется, от:

deserialize("shape_predictor_68_face_landmarks.dat") >> pose_model; 

И Фикс для выше будет предоставлять полный квалифицированный путь как:

deserialize("/full/path/to/shape_predictor_68_face_landmarks.dat") >> pose_model; 

Это, вероятно, по той причине, что в C++ исполняемый файл может запускаться из некоторого места сборки, к которому этот файл не может находиться в локальной области, и, следовательно, он не может его найти. Лучшим способом было бы использовать полные пути.

+0

Да. Теперь он работает хорошо. Большое спасибо. У меня есть одна вещь, чтобы спросить вас. Когда потребовалось некоторое время, чтобы изменить фрейм ... есть ли у вас какое-то представление об этом .... – Linton