как PCA реализован на изображении, снятом камерой?

Я успешно реализовал часть обнаружения лица в своем проекте распознавания лиц. Теперь у меня есть прямоугольная область лица на изображении. Теперь мне нужно реализовать 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 );
}

person Abhishek kumar    schedule 20.01.2012    source источник
comment
Как вы представляете свое изображение и область с лицом в вашей программе?   -  person Björn Pollex    schedule 20.01.2012
comment
@BjörnPollex-Я использовал кадры с камеры и прямое чтение изображения из файла. Лицо представляет собой прямоугольный объект, который нарисован поверх изображения.   -  person Abhishek kumar    schedule 20.01.2012
comment
В вашем вопросе не хватает информации. Как вы храните кадры (массив, vector<int> или какой-то класс из библиотеки). Какой код у вас есть для PCA? Пожалуйста, постарайтесь быть конкретным.   -  person Björn Pollex    schedule 20.01.2012
comment
@BjörnPollex-Для распознавания лиц я использовал код, приведенный здесь opencv.willowgarage.com/wiki/FaceRecognition .Я не реализовал PCA для своего проекта. Я прочитал код, приведенный по адресу github.com/bytefish/opencv/blob/master/eigenfaces/, и в этом коде он напрямую использует изображение лица в базе данных AT&T. Это лицо находится в формате pgm. Итак, у меня есть обнаруженное лицо как прямоугольная область, которую можно преобразовать в матрицу. Но можем ли мы использовать эту матрицу вместо этого изображения в формате pgm?   -  person Abhishek kumar    schedule 20.01.2012
comment
@BjörnPollex-Сэр, я обновил свой вопрос, указав точный код. Не могли бы вы помочь?   -  person Abhishek kumar    schedule 03.02.2012


Ответы (1)


Редактировать:

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

Исходный пост:

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

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

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

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

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

person bytefish    schedule 30.01.2012
comment
@bytefish-Спасибо за ответ :) Я использовал ваш код Eigenfaces на github .com/bytefish/opencv/tree/master/eigenfaces. В этом коде вы передали текстовый файл, содержащий лица из базы данных лиц ORL. Могу ли я просто изменить этот текстовый файл и передать свое извлеченное лицо? - person Abhishek kumar; 31.01.2012
comment
Нет проблем. Да, конечно, вы можете использовать любой вектор cv::Mat вы хотите, пока изображения имеют одинаковый размер. Файл CSV — это просто пример загрузки данных, вы, конечно, можете отредактировать этот файл, чтобы передать свои собственные изображения. Если у вас все еще есть проблемы, отредактируйте свой пост и вставьте код. Как отметил @BjörnPollex, трудно делать предположения без подробностей. Кстати, пожалуйста, примите, если это ответ на ваш вопрос. - person bytefish; 31.01.2012
comment
Это все еще продолжается, но я начал руководство по распознаванию лиц: bytefish.de/pdf /facerec.pdf. Примеры кода доступны по адресу github.com/bytefish/facerecognition_guide. - person bytefish; 01.02.2012
comment
@bytefish-Я использовал две версии кода на github. Предыдущая была немного простой, так как содержала только eigenfaces.h, eigenfaces.cpp и main.cpp. Но новая имеет в дополнение к этим двум еще файл helper.hpp и helper.cpp. Я попытался запустить это, и он показывает ошибку helper.cpp(77): ошибка C2572: 'cv::argsort_': переопределение параметра по умолчанию: параметр 2. - person Abhishek kumar; 01.02.2012
comment
И для принятия ответа я работаю над решением своей проблемы. Я обязательно сделаю это, как только закончу :) - person Abhishek kumar; 01.02.2012
comment
К сожалению, это произошло при копировании и вставке кода из Fisherfaces. Должно быть исправлено сейчас. Скоро весь код солью, но сейчас нет времени. - person bytefish; 01.02.2012
comment
@bytefish-Большое спасибо. код в вашем блоге bytefish.de/blog/pca_in_opencv сработал. .bt ничего не могу сказать о кодах на github :( - person Abhishek kumar; 07.02.2012