Всем привет!
Столкнулся с такой проблемой как низкая скорость работы алгоритмов распознавания лиц из opencv в Android(+NDK).
Реальная машина для эксперимента - Galaxy S4 - OS-4.2.2.
OpenCV-2.4.11
Кручу в AS - 2.3.3
В общем, проект собирается и работает, лица распознает, но лагает до тошноты жутко...
Перегуглил SoF, там такие же проблемы у людей были, но нормальной "таблетки" я так и не нашел.
Из того, что понял/догуглил я:
1. Хаар работает медленнее, чем LBP, примерно на 30-50%.
2. Если изменить размер фрейма(на 640х480) который отдаем в native метод - то заметно поднимаем производительность, где то на 150-200%.
3. Если изображение "отскалировать" то работает процентов на 5-10% быстрее...(вот тут как обезъянка откопипастил, если кто может объясните пжлст почему так?)
Код
JNIEXPORT void JNICALL Java_com_example_abuumaribnhattab_facedetectionlightv1_OpenCVfinder_faceDetection
( JNIEnv *, jclass, jlong addrRgba ){
Mat& frame = *( Mat* )addrRgba;
detect( frame );
};
void detect( Mat& frame ){
// -- slowely cascade...
//String face_cascade_name = "/storage/emulated/0/data/haarcascade_frontalface_alt.xml";
//const int HaarOptions = CV_HAAR_FIND_BIGGEST_OBJECT | CV_HAAR_DO_ROUGH_SEARCH;
//-- faster cascade...
String face_cascade_name = "/storage/emulated/0/data/lbpcascade_frontalface.xml";
CascadeClassifier face_cascade;
if( !face_cascade.load( face_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 );
//-- scale... wtf ?
const int scale = 3;
cv::Mat resized_frame_gray( cvRound( frame_gray.rows / scale ), cvRound( frame_gray.cols / scale ), CV_8UC1 );
cv::resize( frame_gray, resized_frame_gray, resized_frame_gray.size() );
//-- Detect faces LBP
face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0, Size(30, 30) );
//-- Detect faces haar
//face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(50, 50) );
//-- Detect faces haar whith options
//face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, HaarOptions, Size(50, 50) );
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] );
}
};
Остальной код думаю не нужен, т.к. основная суть переваривается в Native среде, оттуда же и "валит" производительность(памяти жрет под 90%(18Mb) под приложение, процессор на 90-95%).
Кто уже "пережевал" эту проблему, поделитесь пожалуйста способами по ускорению работы!