iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android如何利用OpenCV制作人脸检测APP
  • 484
分享到

Android如何利用OpenCV制作人脸检测APP

2023-06-21 23:06:00 484人浏览 独家记忆
摘要

这篇文章将为大家详细讲解有关Android如何利用OpenCV制作人脸检测APP,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。无图无真相,先把APP运行的结果给大家看看。如上图所示,APP运行后,点击“选

这篇文章将为大家详细讲解有关Android如何利用OpenCV制作人脸检测APP,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

无图无真相,先把APP运行的结果给大家看看。

Android如何利用OpenCV制作人脸检测APP

如上图所示,APP运行后,点击“选择图片”,从手机中选择一张图片,然后点击“处理”,APP会将人脸用矩形给框起来,同时把鼻子也给检测出来了。由于目的是给大家做演示,所以APP设计得很简单,而且也只实现了检测人脸和鼻子,没有实现对其他五官的检测。而且这个APP也只能检测很简单的图片,如果图片中背景太复杂就无法检测出人脸。

下面我将一步一步教大家如何实现上面的APP!

第一步:下载并安装Android studio

为了保证大家能下载到和我相同版本的Android Studio,我把安装包上传了到微云。地址是:https://share.weiyun.com/bHVOWGC9

下载后,一路点击下一步就安装好了。当然,安装过程中要联网,所以可能会中途失败,如果失败了,重试几次,如果还是有问题,那么可能要开启VPN。

第二步:下载SDK tools

打开Android studio后,点击“File”->“Settings”

Android如何利用OpenCV制作人脸检测APP

点击“Appearance & Behavior”->“System Settings”->“Android SDK”->“SDK Tools”。

Android如何利用OpenCV制作人脸检测APP

然后选中“NDK”和“CMake”,点击“OK”。下载这两个工具可能要花一点时间,如果失败了请重试或开启VPN。

第三步:新建一个Android APP项目

点击“File”->“New”->“New Project”

Android如何利用OpenCV制作人脸检测APP

选中“Empty Activity”,点击“Next”

Android如何利用OpenCV制作人脸检测APP

“Language”选择“Java”,Minimum SDK选择“api 21”。点击“Finish”

Android如何利用OpenCV制作人脸检测APP

第四步:下载Opencv

下载地址

下载后解压。

第五步:导入OpenCV

将opencv-4.5.4-android-sdk\OpenCV-android-sdk下面的sdk复制到你在第三步创建的Android项目下面。就是第三步图中的D:\programming\MyApplication下面。然后将sdk文件夹改名为openCVsdk。

Android如何利用OpenCV制作人脸检测APP

选择“Project”->“settings.gradle”。在文件中添加include ‘:openCVsdk'

Android如何利用OpenCV制作人脸检测APP

选择“Project”->“openCVsdk”->“build.gradle”。

将apply plugin: 'Kotlin-android'改为//apply plugin: ‘kotlin-android'

将compileSdkVersion和minSdkVersion,targetSdkVersion改为31,21,31。

Android如何利用OpenCV制作人脸检测APP

点击“File”->“Project Structure”

Android如何利用OpenCV制作人脸检测APP

点击“Dependencies”->“app”->“+”->“Module Dependency”

Android如何利用OpenCV制作人脸检测APP

选中“openCVsdk”,点击“OK”,以及母窗口的“OK”

Android如何利用OpenCV制作人脸检测APP

在Android项目文件夹的app\src里面创建一个新文件夹jniLibs,然后把openCV文件夹的opencv-4.5.4-android-sdk\OpenCV-android-sdk\sdk\native\staticlibs里面的东西都copy到jniLibs文件夹中。

Android如何利用OpenCV制作人脸检测APP

下载分类器。解压后,将下图中的文件都复制到项目文件夹的app\src\main\res\raw文件夹下。

Android如何利用OpenCV制作人脸检测APP

第六步:添加代码

双击“Project”->“app”-》“main”-》“res”下面的“activity_main.xml”。然后点击右上角的“code”。

Android如何利用OpenCV制作人脸检测APP

然后将里面的代码都换成下面的代码

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="Http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".MainActivity"    android:orientation="vertical"    >    <Button        android:id="@+id/select_btn"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="选择图片" />    <Button        android:id="@+id/process_btn"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="处理" />    <ImageView        android:id="@+id/imageView"        android:layout_width="wrap_content"        android:layout_height="wrap_content" /></LinearLayout>

双击“Project”->“app”-》“main”-》“java”-》“com.example…”下面的“MainActivity”。然后把里面的代码都换成下面的代码(保留原文件里的第一行代码)

import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.net.Uri;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.ImageView;import org.opencv.android.OpenCVLoader;import org.opencv.android.Utils;import org.opencv.core.CvType;import org.opencv.core.Mat;import org.opencv.core.Point;import org.opencv.imgproc.Imgproc;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import org.opencv.core.MatOfRect;import org.opencv.core.Rect;import org.opencv.core.Scalar;import org.opencv.core.Size;import org.opencv.objdetect.CascadeClassifier;import android.content.Context;public class MainActivity extends AppCompatActivity {    private double max_size = 1024;    private int PICK_IMAGE_REQUEST = 1;    private ImageView myImageView;    private Bitmap selectbp;    private static final String    TAG                 = "OCVSample::Activity";    private static final Scalar    FACE_RECT_COLOR     = new Scalar(0, 255, 0, 255);    public static final int        JAVA_DETECTOR       = 0;    public static final int        NATIVE_DETECTOR     = 1;    private Mat                    mGray;    private File                   mCascadeFile;    private CascadeClassifier      mJavaDetector,mNoseDetector;    private int                    mDetectorType       = JAVA_DETECTOR;    private float                  mRelativeFaceSize   = 0.2f;    private int                    mAbsoluteFaceSize   = 0;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        staticLoadCVLibraries();        myImageView = (ImageView)findViewById(R.id.imageView);        myImageView.setScaleType(ImageView.ScaleType.FIT_CENTER);        Button selectImageBtn = (Button)findViewById(R.id.select_btn);        selectImageBtn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                // makeText(MainActivity.this.getApplicationContext(), "start to browser image", Toast.LENGTH_SHORT).show();                selectImage();            }            private void selectImage() {                Intent intent = new Intent();                intent.setType("image/*");                intent.setAction(Intent.ACTION_GET_CONTENT);                startActivityForResult(Intent.createChooser(intent,"选择图像..."), PICK_IMAGE_REQUEST);            }        });        Button processBtn = (Button)findViewById(R.id.process_btn);        processBtn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                // makeText(MainActivity.this.getApplicationContext(), "hello, image process", Toast.LENGTH_SHORT).show();                convertGray();            }        });    }    private void staticLoadCVLibraries() {        boolean load = OpenCVLoader.initDebug();        if(load) {            Log.i("CV", "Open CV Libraries loaded...");        }    }    private void convertGray() {        Mat src = new Mat();        Mat temp = new Mat();        Mat dst = new Mat();        Utils.bitmapToMat(selectbp, src);        Imgproc.cvtColor(src, temp, Imgproc.COLOR_BGRA2BGR);        Log.i("CV", "image type:" + (temp.type() == CvType.CV_8UC3));        Imgproc.cvtColor(temp, dst, Imgproc.COLOR_BGR2GRAY);        Utils.matToBitmap(dst, selectbp);        myImageView.setImageBitmap(selectbp);        mGray = dst;        mJavaDetector = loadDetector(R.raw.lbpcascade_frontalface,"lbpcascade_frontalface.xml");        mNoseDetector = loadDetector(R.raw.haarcascade_mcs_nose,"haarcascade_mcs_nose.xml");        if (mAbsoluteFaceSize == 0) {            int height = mGray.rows();            if (Math.round(height * mRelativeFaceSize) > 0) {                mAbsoluteFaceSize = Math.round(height * mRelativeFaceSize);            }        }        MatOfRect faces = new MatOfRect();        if (mJavaDetector != null) {            mJavaDetector.detectMultiScale(mGray, faces, 1.1, 2, 2, // TODO: objdetect.CV_HAAR_SCALE_IMAGE                        new Size(mAbsoluteFaceSize, mAbsoluteFaceSize), new Size());        }        Rect[] facesArray = faces.toArray();        for (int i = 0; i < facesArray.length; i++) {            Log.e(TAG, "start to detect nose!");            Mat faceROI = mGray.submat(facesArray[i]);            MatOfRect noses = new MatOfRect();            mNoseDetector.detectMultiScale(faceROI, noses, 1.1, 2, 2,                    new Size(30, 30));            Rect[] nosesArray = noses.toArray();            Imgproc.rectangle(src,                    new Point(facesArray[i].tl().x + nosesArray[0].tl().x, facesArray[i].tl().y + nosesArray[0].tl().y) ,                    new Point(facesArray[i].tl().x + nosesArray[0].br().x, facesArray[i].tl().y + nosesArray[0].br().y) ,                    FACE_RECT_COLOR, 3);            Imgproc.rectangle(src, facesArray[i].tl(), facesArray[i].br(), FACE_RECT_COLOR, 3);        }        Utils.matToBitmap(src, selectbp);        myImageView.setImageBitmap(selectbp);    }    private CascadeClassifier loadDetector(int rawID,String fileName) {        CascadeClassifier classifier = null;        try {            // load cascade file from application resources            InputStream is = getResources().openRawResource(rawID);            File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);            mCascadeFile = new File(cascadeDir, fileName);            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();            Log.e(TAG, "start to load file:  " + mCascadeFile.getAbsolutePath());            classifier = new CascadeClassifier(mCascadeFile.getAbsolutePath());            if (classifier.empty()) {                Log.e(TAG, "Failed to load cascade classifier");                classifier = null;            } else                Log.i(TAG, "Loaded cascade classifier from " + mCascadeFile.getAbsolutePath());            cascadeDir.delete();        } catch (IOException e) {            e.printStackTrace();            Log.e(TAG, "Failed to load cascade. Exception thrown: " + e);        }        return classifier;    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {            Uri uri = data.getData();            try {                Log.d("image-tag", "start to decode selected image now...");                InputStream input = getContentResolver().openInputStream(uri);                BitmapFactory.Options options = new BitmapFactory.Options();                options.inJustDecodeBounds = true;                BitmapFactory.decodeStream(input, null, options);                int raw_width = options.outWidth;                int raw_height = options.outHeight;                int max = Math.max(raw_width, raw_height);                int newWidth = raw_width;                int newHeight = raw_height;                int inSampleSize = 1;                if (max > max_size) {                    newWidth = raw_width / 2;                    newHeight = raw_height / 2;                    while ((newWidth / inSampleSize) > max_size || (newHeight / inSampleSize) > max_size) {                        inSampleSize *= 2;                    }                }                options.inSampleSize = inSampleSize;                options.inJustDecodeBounds = false;                options.inPreferredConfig = Bitmap.Config.ARGB_8888;                selectbp = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, options);                myImageView.setImageBitmap(selectbp);            } catch (Exception e) {                e.printStackTrace();            }        }    }}

第七步:连接手机运行程序

首先要打开安卓手机的开发者模式,每个手机品牌的打开方式不一样,你自行百度一下就知道了。例如在百度中搜索“小米手机如何开启开发者模式”。

然后用数据线将手机和电脑连接起来。成功后,Android studio里面会显示你的手机型号。如下图中显示的是“Xiaomi MI 8 UD”,本例中的开发手机是小米手机。

Android如何利用OpenCV制作人脸检测APP

点击上图中的“Run”-》“Run ‘app'”就可以将APP运行到手机上面了,注意手机屏幕要处于打开状态。你自拍的图片可以检测不成功,可以下载我的测试图片试试。

关于“Android如何利用OpenCV制作人脸检测APP”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: Android如何利用OpenCV制作人脸检测APP

本文链接: https://www.lsjlt.com/news/301375.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android如何利用OpenCV制作人脸检测APP
    这篇文章将为大家详细讲解有关Android如何利用OpenCV制作人脸检测APP,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。无图无真相,先把APP运行的结果给大家看看。如上图所示,APP运行后,点击“选...
    99+
    2023-06-21
  • Android 利用OpenCV制作人脸检测APP
    目录前言第一步:下载并安装Android studio第二步:下载SDK tools第三步:新建一个Android APP项目第四步:下载Opencv第五步:导入OpenCV第六步:...
    99+
    2024-04-02
  • 如何在python中使用OpenCV检测人脸
    这期内容当中小编将会给大家带来有关如何在python中使用OpenCV检测人脸,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相...
    99+
    2023-06-14
  • 【Android App】人脸识别中借助摄像头和OpenCV实时检测人脸讲解及实战(附源码和演示 超详细)
    需要全部代码请点赞关注收藏后评论区留言私信~~~ 一、借助摄像头实时检测人脸 与Android自带的人脸检测器相比,OpenCV具备更强劲的人脸识别功能,它可以通过摄像头实时检测人脸,实时检测的预览空间是JavaCameraView ...
    99+
    2023-08-31
    opencv 人工智能 计算机视觉 android studio java
  • opencv+mediapipe如何实现人脸检测及摄像头实时示例
    这篇文章主要为大家展示了“opencv+mediapipe如何实现人脸检测及摄像头实时示例”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“opencv+mediapipe如何实现人脸检测及摄像头实...
    99+
    2023-06-22
  • 如何实现基于opencv的行人检测
    这篇文章主要为大家展示了“如何实现基于opencv的行人检测”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现基于opencv的行人检测”这篇文章吧。基于方向梯度直方图(HOG)/线性支持向...
    99+
    2023-06-22
  • 利用Android制作一个APP首页
    本篇文章给大家分享的是有关利用Android制作一个APP首页,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。首页展示LRecyclerView作为主框架,轮播图以及分类网格列表...
    99+
    2023-05-31
    android pp
  • Matlab处理图像后如何实现人脸检测
    这篇文章将为大家详细讲解有关Matlab处理图像后如何实现人脸检测,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.人脸检测原理框图整体思路是寻找图片中最大的连通域,将其认定为人脸。第一个环节均值滤波,是...
    99+
    2023-06-25
  • 怎么在Python3中使用OpenCV实现实时摄像头人脸检测
    这篇文章主要介绍怎么在Python3中使用OpenCV实现实时摄像头人脸检测,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!OpenCV 是一个C++库,目前流行的计算机视觉编程库,用于实时处理计算机视觉方面...
    99+
    2023-06-25
  • Python+OpenCV内置方法如何实现行人检测
    小编给大家分享一下Python+OpenCV内置方法如何实现行人检测,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!您是否知道 OpenCV 具有执行行人检测的内置...
    99+
    2023-06-22
  • 【Android App】人脸识别中使用Opencv比较两张人脸相似程度实战(附源码和演示 超详细)
    需要全部代码请点赞关注收藏后评论区留言私信~~~ 一、比较两张人脸的相似程度 直方图由一排纵向的竖条或者竖线组成,横轴代表数据类型,纵轴代表数据多少。 图像直方图经常应用于特征提取、图像匹配等方面。  假设有两幅图像,它们的直方图很...
    99+
    2023-08-31
    opencv 人工智能 计算机视觉 android studio java
  • PHP中如何进行智能图像处理和人脸检测?
    随着人工智能技术不断发展,图像处理和人脸检测应用越来越广泛。PHP作为一门服务器端语言也能够支持这些应用。本文将向您介绍如何通过PHP实现智能图像处理和人脸检测。一、智能图像处理图片压缩高清晰度图片可以提供更好的视觉体验,但其同时也会导致图...
    99+
    2023-05-21
    PHP 智能图像处理 人脸检测
  • 如何在Android中利用 GestureDetector进行手势检测
    今天就跟大家聊聊有关如何在Android中利用 GestureDetector进行手势检测,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、概述当用户触摸屏幕的时候,会产生许多手势,...
    99+
    2023-05-31
    android gesturedetector detect
  • 树莓派上如何利用python+opencv+dlib实现嘴唇检测
    小编给大家分享一下树莓派上如何利用python+opencv+dlib实现嘴唇检测,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!树莓派上利用python+opencv+dlib实现嘴唇检测项目的目标是在树莓派上运行pyth...
    99+
    2023-06-25
  • 利用Android怎么制作一个APP登录界面
    这期内容当中小编将会给大家带来有关利用Android怎么制作一个APP登录界面,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。布局的xml文件<&#63;xml version="1...
    99+
    2023-05-31
    android pp
  • 利用Python制作简易的核酸检测日历
    目录录入数据制作日历1.使用openpyxl创建表格2.定义表格初始化和单元格设置的函数3.实现日历制作一年的日历我的坐标是深圳,2022年以来,大部分时候要求24小时,少部分时候要...
    99+
    2024-04-02
  • 如何利用Github免费制作app介绍主页
    本篇内容介绍了“如何利用Github免费制作app介绍主页”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、先去注册个帐号2、注册号账号后,...
    99+
    2023-06-19
  • 如何利用Flutter制作一个摸鱼桌面版App
    这篇文章将为大家详细讲解有关如何利用Flutter制作一个摸鱼桌面版App,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Win10商店上架了一款名为《摸鱼》的App,在下载打开之后,这个Ap...
    99+
    2023-06-22
  • 如何利用Python+OpenCV实现简易图像边缘轮廓检测(零基础)
    目录前言函数基础与三方库cv.threshold(pic,thresh,maxvalue,model)cv.findContours(待处理图片,model(提取模式),method...
    99+
    2024-04-02
  • C++如何利用opencv实现单目测距
    这篇文章将为大家详细讲解有关C++如何利用opencv实现单目测距,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。闲来无事,用C++做了一个简易的单目测距。算法用的cv自带的,改改参数就行。实现了读取照片测...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作