Native метод разпознавание лица с помошью OpenCV в Android

351
25 июля 2017, 17:27

Делаю проект используя OpenCV 3.2.0 для распознавания лиц. Решил пробовать через CMakeLists.txt и native-lib.cpp.

Нашел пример метода для распознавания лица, но при его работе очень проседает FPS да и распознавание никудышнее. Может у кого-то есть более лучший код метода?

п.с. В примере было сказано, что файлы haarcascade_frontalface_default.xml и haarcascade_eye_tree_eyeglasses.xml надо положить в память телефона. Есть ли способ положить их куда то в проект и пользоваться ими от-туда?

MainActivity.class

public native void faceDetection(long matAddrRgba);
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
        mRgba = inputFrame.rgba();
        faceDetection(mRgba.getNativeObjAddr());
        return mRgba;
    }

native-lib.cpp

void Java_com_martin_ads_testopencv_MainActivity_faceDetection(JNIEnv*, jobject, jlong addrRgba) {
    Mat& frame = *(Mat*)addrRgba;
    String face_cascade_name = "/storage/sdcard1/data/haarcascade_frontalface_default.xml";
    String eyes_cascade_name = "/storage/sdcard1/data/haarcascade_eye_tree_eyeglasses.xml";
    CascadeClassifier face_cascade;
    CascadeClassifier eyes_cascade;
    if( !face_cascade.load( face_cascade_name ) ){ printf("--(!)Error loading\n"); return; };
    if( !eyes_cascade.load( eyes_cascade_name ) ){ printf("--(!)Error loading\n"); return; };
    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( size_t i = 0; i < faces.size(); i++ )
    {
        Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5 );
        ellipse( frame, center, Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );
        Mat faceROI = frame_gray( faces[i] );
        std::vector<Rect> eyes;
        //-- In each face, detect eyes
        eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30) );
        for( size_t j = 0; j < eyes.size(); j++ )
        {
            Point center( faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5 );
            int radius = cvRound( (eyes[j].width + eyes[j].height)*0.25 );
            circle( frame, center, radius, Scalar( 255, 0, 0 ), 4, 8, 0 );
        }
    }
}
READ ALSO
Реализация открытия стартового Activity

Реализация открытия стартового Activity

Есть логин activity - а, после логгирования юзер попадает в Activity -b, при сворачивании приложения и открытии ,снова открыватеся activity -a, но каждый...

295
Открыть SharedPreferences вне пакета

Открыть SharedPreferences вне пакета

Методы которые предлагает Context открывают sharedPreferences только из папки пакета приложения, а что, если мне нужно открыть такой файл из внешнего...

200
Подсчет индексов

Подсчет индексов

Есть таблица со столбцом boolean, нужно подсчитать кол-во выбранных строк, когда boolean = true, и это кол-во занести в переменнуюНашел индексы строк...

339
MP3 файлы в Java

MP3 файлы в Java

Есть ли способ проиграть музыку в java? Только без xml, и тп

217