Делаю проект используя 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 );
}
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть логин activity - а, после логгирования юзер попадает в Activity -b, при сворачивании приложения и открытии ,снова открыватеся activity -a, но каждый...
Методы которые предлагает Context открывают sharedPreferences только из папки пакета приложения, а что, если мне нужно открыть такой файл из внешнего...
Есть таблица со столбцом boolean, нужно подсчитать кол-во выбранных строк, когда boolean = true, и это кол-во занести в переменнуюНашел индексы строк...