如何提高OpenCV实时检测器应用的fps?

时间:2019-12-15 18:18:15

标签: android c++ opencv java-native-interface

我有面部检测器应用程序,它使用Java的本机cpp行和OpenCV。它正在检测面部并在其周围绘制一个圆圈。 但由于其工作计划,其fps极低。 因此,我尝试更改JavaCameraView的布局宽度和高度以减少重新分配和增加fps,但是它仍然具有相同的fps。然后,我尝试在我的cpp文件中添加设置resulotion和fps lines,但它们不起作用。

这是我更改的cpp代码:

#include <jni.h>
#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include <android/log.h>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;

extern "C" {
void detect(Mat &input);
void JNICALL
Java_com_example_nativeopencvandroidtemplate_MainActivity_adaptiveThresholdFromJNI(JNIEnv *env, jobject instance,
                                                                                   jlong matAddr) {

    Mat &input = *(Mat *) matAddr;
    detect(input);
}
void detect(Mat &input) {
    String face_cascade_name = "/storage/emulated/0/ony.xml";
    CascadeClassifier face_cascade;


    std::vector<Rect> faces;
    Mat frame_gray;

    cvtColor( input, frame_gray, COLOR_RGB2GRAY );
    equalizeHist(frame_gray, frame_gray);

    face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CASCADE_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(input, center, Size(faces[i].width * 0.5, faces[i].height * 0.5), 0, 0, 360, Scalar(255, 0, 255), 4, 8,
                0);
    }
}
}

Here's其原始模板,直到我将其cpp文件更改为检测面部。

当我尝试添加三个分类器及其行以检测其他事物并绘制另一个圆圈时,应用在我的Android操作系统上反复停止。 That是我对该项目的另一个建议。

1 个答案:

答案 0 :(得分:2)

您的代码不完整,但看起来好像您在每个框架上创建了分类器。那不是很有效。