android人脸检测opencv,OpenCV on Android 开发(2)实现实时人脸检测

OpenCV on Android 开发(2)实现实时人脸检测

发布时间:2018-03-03 22:56,

浏览次数:492

, 标签:

OpenCV

on

Android

转自我自己的简书https://www.jianshu.com/p/e285b379e48b

我参考网上的教程使用opencv内置的人脸检测模型

前期准备

在Androidstudio项目里新建一个文件夹raw路径如下

再将opencvandroidsdk里的lbpcascade_frontalface.xml添加进去

.xml文件的路径在你存放的位置\OpenCV-android-sdk\sdk\etc\lbpcascades文件夹里

准备工作完成,可以开始码代码了

首先修改AndroidManifest.xml

android:name="android.hardware.camera" android:required="false" />

android:name="android.hardware.camera.autofocus" android:required="false"/> <

uses-feature android:name="android.hardware.camera.front" android:required=

"false" />

android:required="false" />

获取摄像头的权限

其次修改activity_main.xml

添加如下代码

android:layout_width="match_parent" android:layout_height="match_parent"

android:visibility="gone" app:camera_id="any" app:show_fps="true" />

创建一个JavaCameraView控件

最后MainActivity.java

代码如下

package com.example.aaa.opencvcamera; import android.content.Context; import

android.support.v7.app.AppCompatActivity;import android.os.Bundle; import

android.util.Log;import android.view.WindowManager; import

android.widget.TextView;import org.opencv.android.BaseLoaderCallback; import

org.opencv.android.CameraBridgeViewBase;import

org.opencv.android.JavaCameraView;import

org.opencv.android.LoaderCallbackInterface;import

org.opencv.android.OpenCVLoader;import org.opencv.core.Core; import

org.opencv.core.CvType;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.imgproc.Imgproc;import org.opencv.objdetect.CascadeClassifier; import

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

import static org.opencv.imgproc.Imgproc.rectangle; public class MainActivity

extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener{

// Used to load the 'native-lib' library on application startup. //static { //

System.loadLibrary("native-lib"); //} private CameraBridgeViewBase

openCvCameraView;private CascadeClassifier cascadeClassifier; private Mat

grayscaleImage;private int absoluteFaceSize; private BaseLoaderCallback

mLoaderCallback =new BaseLoaderCallback(this) { @Override public void

onManagerConnected(int status){ switch (status){ case

LoaderCallbackInterface.SUCCESS: initializeOpenCVDependencies();break; default:

super.onManagerConnected(status); break; } } }; private void

initializeOpenCVDependencies(){ try{ InputStream is =

getResources().openRawResource(R.raw.lbpcascade_frontalface); File casadeDir =

getDir("cascade", Context.MODE_PRIVATE); File mCascadeFile = new File(casadeDir,

"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(); cascadeClassifier =new

CascadeClassifier(mCascadeFile.getAbsolutePath()); }catch (Exception e) { Log.e(

"OpenCVActivity","Error Loading casade",e); } openCvCameraView.enableView(); }

@Override protected void onCreate(Bundle savedInstanceState) { super

.onCreate(savedInstanceState);

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

openCvCameraView =new JavaCameraView(this, -1);

setContentView(openCvCameraView); openCvCameraView.setCvCameraViewListener(this

);/*setContentView(R.layout.activity_main); // Example of a call to a native

method TextView tv = (TextView) findViewById(R.id.sample_text);

tv.setText(stringFromJNI()); */ } @Override public void onCameraViewStarted(int

width,int height){ grayscaleImage = new Mat(height, width, CvType.CV_8UC4);

absoluteFaceSize = (int)(height * 0.2); } @Override public void

onCameraViewStopped(){ } @Override public Mat onCameraFrame(Mat aInputFrame){

Imgproc.cvtColor(aInputFrame, grayscaleImage, Imgproc.COLOR_RGBA2RGB);

MatOfRect faces =new MatOfRect(); if (cascadeClassifier != null){

cascadeClassifier.detectMultiScale(grayscaleImage,faces,1.1,2,2,new

Size(absoluteFaceSize,absoluteFaceSize),new Size()); } Rect[] faceArray =

faces.toArray();for (int i = 0; i

//原代码是Core.rectangle(aInputFrame, faceArray[i].tl(), faceArray[i].br(), new

Scalar(0, 255, 0, 255), 3); //但好像不行 Imgproc.rectangle(aInputFrame,

faceArray[i].tl(), faceArray[i].br(),new Scalar(0, 255, 0, 255), 3); return

aInputFrame; }/* @Override public void onResume(){ super.onResume();

if(!OpenCVLoader.initDebug()){ Log.e("log_wons", "OpenCV init error"); }

initializeOpenCVDependencies();

OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_4_0, this,

mLoaderCallback); } */ @Override public void onResume(){ super.onResume(); if

(!OpenCVLoader.initDebug()){

OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_4_0,this,

mLoaderCallback); }else {

mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); } }/** * A

native method that is implemented by the 'native-lib' native library, * which

is packaged with this application. */ //public native String stringFromJNI(); }

最后我把生成的apk安装在手机里运行效果如下

ok了还是可以的,但是鲁棒性好像不行,误检概率有点大。

注释和每个函数的意思有空再补

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值