Как PCA реализован на снимке с камеры? - PullRequest
1 голос
/ 20 января 2012

Я успешно реализовал часть обнаружения лица в своем проекте распознавания лиц. Теперь у меня есть прямоугольная область лица на изображении. Теперь я должен внедрить PCA в этой обнаруженной прямоугольной области, чтобы извлечь важные функции. Я использовал примеры реализации PCA в базах данных лиц. Я хочу знать, как мы можем передать обнаруженное лицо функции, реализующей PCA? Мы пропускаем прямоугольник? Это код для моего распознавания лица.

#include "cv.h"
#include "highgui.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include <float.h>
#include <limits.h>
#include <time.h>
#include <ctype.h>


// Create a string that contains the exact cascade name
const char* cascade_name =
    "haarcascade_frontalface_alt.xml";
/*    "haarcascade_profileface.xml";*/


// Function prototype for detecting and drawing an object from an image
void detect_and_draw( IplImage* image );

// Main function, defines the entry point for the program.
int main( int argc, char** argv )
{

    // Create a sample image
    IplImage *img = cvLoadImage("Image018.jpg");
    if(!img)
    {
        printf("could not load image");
        return -1;
    }

    // Call the function to detect and draw the face positions
    detect_and_draw(img);

    // Wait for user input before quitting the program
    cvWaitKey();

    // Release the image
    cvReleaseImage(&img);

    // Destroy the window previously created with filename: "result"
    cvDestroyWindow("result");

    // return 0 to indicate successfull execution of the program
    return 0;
}

// Function to detect and draw any faces that is present in an image
void detect_and_draw( IplImage* img )
{

    // Create memory for calculations
    static CvMemStorage* storage = 0;

    // Create a new Haar classifier
    static CvHaarClassifierCascade* cascade = 0;

    int scale = 1;

    // Create a new image based on the input image
    IplImage* temp = cvCreateImage( cvSize(img->width/scale,img->height/scale), 8, 3 );

    // Create two points to represent the face locations
    CvPoint pt1, pt2;
    int i;

    // Load the HaarClassifierCascade
    cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );

    // Check whether the cascade has loaded successfully. Else report and error and quit
    if( !cascade )
    {
        fprintf( stderr, "ERROR: Could not load classifier cascade\n" );
        return;
    }

    // Allocate the memory storage
    storage = cvCreateMemStorage(0);

    // Create a new named window with title: result
    cvNamedWindow( "result", 1 );

    // Clear the memory storage which was used before
    cvClearMemStorage( storage );

    // Find whether the cascade is loaded, to find the faces. If yes, then:
    if( cascade )
    {

        // There can be more than one face in an image. So create a growable sequence of faces.
        // Detect the objects and store them in the sequence
        CvSeq* faces = cvHaarDetectObjects( img, cascade, storage,
                                            1.1, 2, CV_HAAR_DO_CANNY_PRUNING,
                                            cvSize(40, 40) );

        // Loop the number of faces found.
        for( i = 0; i < (faces ? faces->total : 0); i++ )
        {
           // Create a new rectangle for drawing the face
            CvRect* r = (CvRect*)cvGetSeqElem( faces, i );

            // Find the dimensions of the face,and scale it if necessary
            pt1.x = r->x*scale;
            pt2.x = (r->x+r->width)*scale;
            pt1.y = r->y*scale;
            pt2.y = (r->y+r->height)*scale;

            // Draw the rectangle in the input image
            cvRectangle( img, pt1, pt2, CV_RGB(255,0,0), 3, 8, 0 );
        }
    }

    // Show the image in the window named "result"
    cvShowImage( "result", img );

    // Release the temp image created.
    cvReleaseImage( &temp );
}

1 Ответ

4 голосов
/ 30 января 2012

Edit:

Просто чтобы уведомить любого, кто посещает этот сайт. Я написал пример кода для распознавания лиц в видео, используя мою библиотеку libfacerec:

Оригинальный пост:

Полагаю, ваша проблема в следующем. Вы использовали Cascade Classifier cv :: CascadeClassifier , поставляемый с OpenCV, для обнаружения и извлечения лиц из изображений. Теперь вы хотите выполнить распознавание лица на изображениях.

Вы хотите использовать Eigenfaces для распознавания лиц. Итак, первое, что вам нужно сделать, это изучить Eigenfaces из изображений, которые вы собрали. Я переписал Eigenfaces class , чтобы вы упростили его. Чтобы узнать собственные лица, просто передайте вектор с изображениями ваших лиц и соответствующими метками (субъектом) либо Eigenfaces :: Eigenfaces , либо Eigenfaces :: compute . Убедитесь, что все ваши изображения имеют одинаковый размер, вы можете использовать cv :: resize , чтобы гарантировать это.

Как только вы вычислили Eigenfaces, вы можете получить прогнозы из вашей модели. Просто вызовите Eigenfaces ::вести прогноз в вычисляемой модели. main.cpp показывает, как использовать класс и его методы (для прогнозирования, проекции, восстановления изображений), а вот , как получить прогноз для изображения .

Теперь я вижу, где твоя проблема. Вы используете старый OpenCV C API. Это затрудняет взаимодействие с новым API OpenCV2 C ++, в котором написан мой код. Не оскорбляйте, но если вы хотите взаимодействовать с моим кодом, вам лучше использовать API OpenCV2 C ++. Я не могу дать руководство по изучению C ++ и API OpenCV2 здесь, есть много документации, идущей с OpenCV. Хорошее начало - шпаргалка OpenCV C ++ (также доступна по адресу http://opencv.willowgarage.com/) или справочное руководство OpenCV.

Для распознавания изображений с помощью каскадного детектора я повторяю: сначала изучите модель Eigenfaces с людьми, которых вы хотите узнать, это показано в примере с моим кодом. Затем вам нужно получить область интереса (ROI), это грань, прямоугольник, который выводит каскадный детектор. Наконец, вы можете получить прогноз для ROI из модели Eigenfaces (вы ее вычислили выше), это показано в примере с моим кодом. Возможно, вам придется преобразовать изображение в оттенки серого, но это все. Вот как это делается.

...