Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[OpenCV, C++] createFisherFaceRecognizer, a dziedziczenie

Ostatnio zmodyfikowano 2013-07-23 20:14
Autor Wiadomość
roserek
Temat założony przez niniejszego użytkownika
[OpenCV, C++] createFisherFaceRecognizer, a dziedziczenie
» 2013-07-22 17:54:22
Mam problem z jedną funkcją... szczerze mówiąc to nie jestem pewien czy ma sens ten post bo będzie mi trudno wytłumaczyć o co chodzi ale ja już po 2 dniach wysiadam , może wasze świeże spojrzenie coś powie :) Sytuacja tyczy się biblioteki opencv. Klasa FisherFace uczy się twarzy i zapisuje je do pliku, mi to nie odpowiadało więc napisałem własną klasę na podstawie fisherface w której zmieniłem zapis i odczyt do bazy danych mysql. Moja klasa wygląda dokładnie tak samo jak poprzednia z tym że dodałem dwie funkcje myload i mysave. Moja klasa tak samo jak oryginał dziedziczy po klasie FaceRecognizer. Aby móc użyć funkcji (tylko w mojej wersji) :
Ptr < FaceRecognizer > model1 = createmyFaceRecognizer();
znalazłem deklaracje i definicje powyżeszej biblioteki i tym śladem przerobiłem ją pod moją klasę ( musiałem przy tym również napisać zamiennik klsay FaceRecognizer) w każdym razie dostałem identyczną funkcję tyle tylko że zwracajacą obiekt mojej klasy.
C/C++
Ptr < myFaceRecognizer > createmyfisherRecognizer( int num_components, double threshold )
{
    return new myfisher( num_components, threshold );
}

Po tych zmianach mój program główny wygląda tek :
C/C++
Ptr < myFaceRecognizer > model0 = createmyfisherRecognizer();
model0->train( images, labels );
//save the model to eigenfaces_at.yaml

model0->save( "my.yml" );
// //
//
// Now create a new Eigenfaces Recognizer
//
Ptr < myFaceRecognizer > model1 = createmyfisherRecognizer();
model1->load( "my.yml" );
// The following line predicts the label of a given
// test image:
int predictedLabel = model1->predict( testSample );
//
// To get the confidence of a prediction call the model with:
//
//      int predictedLabel = -1;
//      double confidence = 0.0;
//      model->predict(testSample, predictedLabel, confidence);
//
string result_message = format( "Predicted class = %d / Actual class = %d.", predictedLabel, testLabel );
cout << result_message << endl;
// Here is how to get the eigenvalues of this Eigenfaces model:
Mat myfishervalues = model1->getMat( "eigenvalues" );
// And we can do the same to display the Eigenvectors (read Eigenfaces):
Mat W = model1->getMat( "eigenvectors" );
// Get the sample mean from the training data
Mat mean = model1->getMat( "mean" );
// Display or save:
if( argc == 2 ) {
    imshow( "mean", norm_0_255( mean.reshape( 1, images[ 0 ].rows ) ) );
} else {
    imwrite( format( "%s/mean.png", output_folder.c_str() ), norm_0_255( mean.reshape( 1, images[ 0 ].rows ) ) );
}

Problem leży w funkcjach "getMat" na których program się wywala. Wszystko się kompiluje , natomiast po uruchomieniu programu wywala komunikat że program przestał działać. Ta funkcja jest funkcją którą dziedziczę w klasie myFaceRecognizer z klasy Algorithm. Znalazłem ja nawet w klasie i jej ciało wygląda tak :
C/C++
Mat Algorithm::getMat( const string & parameter ) const
{
    return get < Mat >( parameter );
}
Tej funkcji wewnątrz już nie znalazłem.

Mam nadzieję że w miarę jasno przedstawiłem sytuację. Jeśli nie to nie smarujcie mnie z góry do dołu :P
P-88579
Admixior
» 2013-07-22 19:28:23
więc napisałem własną klasę na podstawie fisherface[...]. Moja klasa wygląda dokładnie tak samo jak poprzednia z tym że dodałem dwie funkcje myload i mysave.

Więc czemu nie odziedziczysz klasy FisherFace tylko kopiujesz kod? Jak tak zrobisz(odziedziczysz) to będziesz miał wygodę, krótkość i przejrzystość kodu, pewność że nie zepsułeś czegoś oraz 2 nowe funkcje(które dopiszesz). Spróbuj tak zrobić i wtedy na podstawie funkcji zapisującej i wczytującej zmień miejsce zapisu.
P-88588
roserek
Temat założony przez niniejszego użytkownika
» 2013-07-22 20:12:59
Próbowałem tak zrobić. Ale funkcja FisherFace jest zapisana w pliku *.cpp i nie mogę jej odziedziczyć... Też tak chciałem początkowo zrobić. Nawet założyłem temat o otrzymałem odp że jest to niemożliwe.
P-88595
Monika90
» 2013-07-23 20:14:54
nalazłem deklaracje i definicje powyżeszej biblioteki i tym śladem przerobiłem ją pod moją klasę ( musiałem przy tym również napisać zamiennik klsay FaceRecognizer)
Dwa razy bez sensu, funkcja createFisherFaceRecognizer po prostu tworzy obiekt klasy FisherFaces za pomocą new i zwraca inteligenty wskaźnik do klasy bazowej. Mogłeś użyć new bezpośrednio, nie musiałbyś wtedy pisać własnej klasy FaceRecognizer, bo miałbyś bezpośredni dostęp do metod, które dodałeś do klasy FisherFaces.

Wszystko się kompiluje , natomiast po uruchomieniu programu wywala komunikat że program przestał działać.
Nawet nie chciało ci się sprawdzić dlaczego. Może np. rzucany jest wyjątek, który można wyłapać i wyświetlić komunikat. A jak to nie wyjątek, to za pomocą debugera można znaleźć miejsce gdzie się program wywala.

Jeden rzut oka do pliku https://github.com/Itseez​/opencv/blob/master/modules​/contrib/src/facerec.cpp i widać, że każdy algorytm wymaga incjalizacji za pomocą makra CV_INIT_ALGORITHM, może zapomniałeś o tym?
P-88637
« 1 »
  Strona 1 z 1