opencv4Android——人臉識別

我電腦上的版本:

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

步驟

  1. 導(dǎo)入opencv的人臉識別源碼,import project


    image.png

    2.更改根目錄,OpenCVLibrary331,openCVSampledetection的build.gradle,主要是compile SDK version和target SDK version的版本;
    image.png

    3.更改gradle目錄下的gradle-wrapper.properties的gradle版本;
    4.配置項(xiàng)目結(jié)構(gòu)里的ndk路徑,鏈接C++文件,同步gradle;

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


    image.png

    image.png

    5.在項(xiàng)目build.gradle下ndk部分里添加聲明abiFilters "armeabi-v7a"(新手機(jī)可能是v8a);
    image.png

Android6.0相機(jī)權(quán)限

添加兩段代碼

   @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, "請?jiān)趹?yīng)用管理中打開“相機(jī)”訪問權(quán)限!", Toast.LENGTH_LONG).show();
            finish();
        }
    }
}
@Override
    public void onResume()
    {
        super.onResume();
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {
            //申請WRITE_EXTERNAL_STORAGE權(quán)限
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA},
                    1);}
    }
    public void onDestroy() {
        super.onDestroy();
        mOpenCvCameraView.disableView();
    }

去除opencv manager依賴

1.復(fù)制~\OpenCV-android-sdk\sdk\native\libs文件夾到src\main中,并更名jniLibs;
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();

活動(dòng)里添加

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

主活動(dòng)導(dǎo)入的包

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;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,524評論 25 708
  • afinalAfinal是一個(gè)android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,569評論 2 45
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,991評論 19 139
  • 笑話段子 貪財(cái)有道,好色有品,博學(xué)有識,讀書有癮,喝酒有量,玩笑有度;經(jīng)得住誘惑,耐得住寂寞;沒事不惹事,遇事不怕...
    可樂薄荷丶閱讀 825評論 0 1
  • 2017一9月第2篇一星期六一晴 因?yàn)樽蛲砑依镉惺拢瑳]有和一順一起觀看《開學(xué)第一課》。中午,一順寫完作業(yè)...
    一帆風(fēng)順平平安安閱讀 168評論 0 0