JNIEXPORT void JNICALL Java_org_opencv_contrib_FaceRecognizer_load_10
  (JNIEnv* env, jclass , jlong self, jstring filename)
{
    static const char method_name[] = "contrib::load_10()";
    try {
        LOGD("%s", method_name);
        FaceRecognizer* me = (FaceRecognizer*) self; //TODO: check for NULL
        const char* utf_filename = env->GetStringUTFChars(filename, 0); std::string n_filename( utf_filename ? utf_filename : "" ); env->ReleaseStringUTFChars(filename, utf_filename);
        me->load( n_filename );
        return;
    } catch(const std::exception &e) {
        throwJavaException(env, &e, method_name);
    } catch (...) {
        throwJavaException(env, 0, method_name);
    }
    return;
}
int main()
{
    try
    {
        cv::VideoCapture cap(0);
        cv::namedWindow( "Face window", cv::WINDOW_AUTOSIZE);
        image_window win;
        OpenFace of("resources/shape_predictor_68_face_landmarks.dat",
            "src/openface/forward_nn.lua", "resources/nn4.v2.t7");
        FaceDetector fd("resources/haarcascade_frontalface_alt.xml",
                        "");

        FaceRecognizer fr;
        try {
            fr.load("facedatabase.dat");
        }
        catch(serialization_error& err) {
            cout << "No learned database found." << endl;
            cout << "Please create a database with the ./examples/database_builder" << endl;
            cout << "Afterwards learn the decision function using ./examples/database_processor" << endl;
            cout << endl << err.what() << endl;
        }


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

            Image img(temp);

            Detection detect = fd.dlib_detect(img);
            if (detect.face.width() == 0) {
                win.set_image(img.asDLIBImage());
                continue;
            }
            //fa.align(detect);
            FaceNetEmbed rep = of.facenet(detect);

            auto df = fr.df();
            auto result = df.predict(rep);
            if (result.second > 0.5) {
                std::stringstream ss;
                ss << result.first << ", " << result.second;
                std::string label = ss.str(); //fr.recognize(rep);
                // Display it all on the screen
                win.clear_overlay();
                win.set_image(img.asDLIBImage());
                win.add_overlay(detect.rect.asDLIBRect(),rgb_pixel(255,0,0), label);
            }
            else {
                // Display it all on the screen
                win.clear_overlay();
                win.set_image(img.asDLIBImage());
                win.add_overlay(detect.rect.asDLIBRect(),rgb_pixel(255,0,0), std::to_string(result.second));
            }
        }
    }
    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;
    }
}