opencv4Android——人脸识别

我电脑上的版本:

  • opencv4Android3.3.1
  • Androidstudio2.3.3
  • compile SDK version:API 25
  • Build tools version:25.0.3

步骤

  1. 导入opencv的人脸识别源码,import project


    opencv4Android——人脸识别_第1张图片
    image.png

    2.更改根目录,OpenCVLibrary331,openCVSampledetection的build.gradle,主要是compile SDK version和target SDK version的版本;
    opencv4Android——人脸识别_第2张图片
    image.png

    3.更改gradle目录下的gradle-wrapper.properties的gradle版本;
    4.配置项目结构里的ndk路径,链接C++文件,同步gradle;

    (更改openCVSamplefacedetection/src/jni/Android.mk14行,你自己的opencv.mk路径)


    opencv4Android——人脸识别_第3张图片
    image.png

    opencv4Android——人脸识别_第4张图片
    image.png

    5.在项目build.gradle下ndk部分里添加声明abiFilters "armeabi-v7a"(新手机可能是v8a);
    opencv4Android——人脸识别_第5张图片
    image.png

Android6.0相机权限

添加两段代码

   @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    doNext(requestCode, grantResults);
}

private void doNext(int requestCode, int[] grantResults) {
    if (requestCode == 1) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Permission Granted

        } else {
            // Permission Denied
            //  displayFrameworkBugMessageAndExit();
            Toast.makeText(this, "请在应用管理中打开“相机”访问权限!", Toast.LENGTH_LONG).show();
            finish();
        }
    }
}
@Override
    public void onResume()
    {
        super.onResume();
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {
            //申请WRITE_EXTERNAL_STORAGE权限
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA},
                    1);}
    }
    public void onDestroy() {
        super.onDestroy();
        mOpenCvCameraView.disableView();
    }

去除opencv manager依赖

1.复制~\OpenCV-android-sdk\sdk\native\libs文件夹到src\main中,并更名jniLibs;
opencv4Android——人脸识别_第6张图片
image.png

2.去掉两段代码

    private BaseLoaderCallback  mLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch (status) {
                case LoaderCallbackInterface.SUCCESS:
                {
                    Log.i(TAG, "OpenCV loaded successfully");

                    // Load native library after(!) OpenCV initialization
                    System.loadLibrary("detection_based_tracker");

                    try {
                        // load cascade file from application resources
                        InputStream is = getResources().openRawResource(R.raw.lbpcascade_frontalface);
                        File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);
                        mCascadeFile = new File(cascadeDir, "lbpcascade_frontalface.xml");
                        FileOutputStream os = new FileOutputStream(mCascadeFile);

                        byte[] buffer = new byte[4096];
                        int bytesRead;
                        while ((bytesRead = is.read(buffer)) != -1) {
                            os.write(buffer, 0, bytesRead);
                        }
                        is.close();
                        os.close();

                        mJavaDetector = new CascadeClassifier(mCascadeFile.getAbsolutePath());
                        if (mJavaDetector.empty()) {
                            Log.e(TAG, "Failed to load cascade classifier");
                            mJavaDetector = null;
                        } else
                            Log.i(TAG, "Loaded cascade classifier from " + mCascadeFile.getAbsolutePath());

                        mNativeDetector = new DetectionBasedTracker(mCascadeFile.getAbsolutePath(), 0);

                        cascadeDir.delete();

                    } catch (IOException e) {
                        e.printStackTrace();
                        Log.e(TAG, "Failed to load cascade. Exception thrown: " + e);
                    }

                    mOpenCvCameraView.enableView();
                } break;
                default:
                {
                    super.onManagerConnected(status);
                } break;
            }
        }
    };
    @Override
    public void onResume()
    {
        super.onResume();
        if (!OpenCVLoader.initDebug()) {
            Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
        } else {
            Log.d(TAG, "OpenCV library found inside package. Using it!");
            mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
        }
    }

3.在onCreate最后添加

// Load native library after(!) OpenCV initialization
System.loadLibrary("detection_based_tracker");

try {
    // load cascade file from application resources
    InputStream is = getResources().openRawResource(R.raw.lbpcascade_frontalface);
    File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);
    mCascadeFile = new File(cascadeDir, "lbpcascade_frontalface.xml");
    FileOutputStream os = new FileOutputStream(mCascadeFile);

    byte[] buffer = new byte[4096];
    int bytesRead;
    while ((bytesRead = is.read(buffer)) != -1) {
        os.write(buffer, 0, bytesRead);
    }
    is.close();
    os.close();

    mJavaDetector = new CascadeClassifier(mCascadeFile.getAbsolutePath());
    if (mJavaDetector.empty()) {
        Log.e(TAG, "Failed to load cascade classifier");
        mJavaDetector = null;
    } else
        Log.i(TAG, "Loaded cascade classifier from " + mCascadeFile.getAbsolutePath());

    mNativeDetector = new DetectionBasedTracker(mCascadeFile.getAbsolutePath(), 0);

    cascadeDir.delete();

} catch (IOException e) {
    e.printStackTrace();
    Log.e(TAG, "Failed to load cascade. Exception thrown: " + e);
}

mOpenCvCameraView.enableView();

活动里添加

static{
        System.loadLibrary("opencv_java3");
    }

主活动导入的包

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;
import org.opencv.objdetect.CascadeClassifier;
import org.opencv.imgproc.Imgproc;
import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.WindowManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.widget.Toast;
import android.content.pm.PackageManager;

你可能感兴趣的:(opencv4Android——人脸识别)