2013-09-19 3 views
0

Привет У меня есть большой набор изображений лиц, извлеченных из видео. Я хотел бы просто измерить ширину и высоту каждого лица, найденного в изображениях. Когда я использую классификаторы HAAR, он возвращает квадратные лица, обнаруженные независимо от того, насколько они жирны или тонкие.OpenCV Как получить ширину и высоту лица из изображения

Есть некоторые улучшения, которые были бы идеальными, хотя я доволен только первым шагом.

Как минимум я ищу примеры для измерения ширины и высоты лиц, обнаруженных на изображениях. В идеале эти грани сначала будут повернуты, чтобы смотреть вперед, чтобы измерять ширину и высоту лица фактического лица, а не ширину пикселя потенциально повернутой поверхности.

Пример кода был бы очень признателен.

ответ

0

Адрес: code. Нижние две строки будут печатать ширину и высоту обнаруженного лица.

В первом цикле "detectAndDisplay" добавьте две линии.

cout << "face width = " << faces[i].width << endl; 
cout << "face Height = " << faces[i].height << endl; 

Вот модифицированный код для вас:

#include "opencv2/objdetect/objdetect.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 

#include <iostream> 
#include <stdio.h> 

using namespace std; 
using namespace cv; 

/** Function Headers */ 
void detectAndDisplay(Mat frame); 

/** Global variables */ 
String face_cascade_name = "haarcascade_frontalface_alt.xml"; 
CascadeClassifier face_cascade; 
string window_name = "Capture - Face detection"; 
RNG rng(12345); 

/** @function main */ 
int main(int argc, const char** argv) 
{ 
    CvCapture* capture; 
    Mat frame = imread ("C:\\Desktop\\1.jpg"); 

    //-- 1. Load the cascades 
    if(!face_cascade.load(face_cascade_name)){ printf("--(!)Error loading\n"); return -1; }; 


    //-- 3. Apply the classifier to the frame 
     if(!frame.empty()) 
     { detectAndDisplay(frame); } 
     else 
     { printf(" --(!) No captured frame -- Break!"); } 

    return 0;  

    } 



/** @function detectAndDisplay */ 
void detectAndDisplay(Mat frame) 
{ 
    std::vector<Rect> faces; 
    Mat frame_gray; 

    cvtColor(frame, frame_gray, CV_BGR2GRAY); 
    equalizeHist(frame_gray, frame_gray); 

    //-- Detect faces 
    face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30)); 

    for(int i = 0; i < faces.size(); i++) 
    { 
    cv :: rectangle (frame, faces[i], Scalar(255, 0, 255), 4); 
    cout << "face width = " << faces[i].width << endl; 
    cout << "face Height = " << faces[i].height << endl; 

    } 
    //-- Show what you got 
    imshow(window_name, frame); 

    waitKey(0); 
} 
+1

ли это не всегда дает вам с квадратным столкнулись результат? Мне нужен край к краю лица и сверху к подбородку. –

+0

Вы можете изменить этот код в соответствии с вашими требованиями. Не ожидайте, что вас будут кормить ложкой –

Смежные вопросы