基于Java的Android OpenCV安装配置及人脸识别示例

1. OpenCV安装配置

1.1 开发环境

  • Android Studio 3.5.2
  • Opencv-4.3.0-android-sdk

1.2 安装OpenCV SDK

opencv的官网中下载android sdk,我这边下载的opencv-4.3.0
在这里插入图片描述
将opencv-4.3.0-sdk解压到本地,解压后文件主要包括:
在这里插入图片描述

1.3 创建android项目

选择带有c++开发环境的Native C++模板,创建项目
在这里插入图片描述
C++Standard选择 c++14
创建好项目如下:
在这里插入图片描述
其中cpp文件夹下包括: include,CMakeLists.txt,native-lib文件
点击File -> Setting -> Android SDK->SDK Tools,勾选好NDK,CMAKE
在这里插入图片描述
点击Show Package Details可选择详细的版本进行安装
在这里插入图片描述
如果NDK报错,可能是版本太高了。选择File -> Project Structure,配置低版本的NDK的路径,这里选择ndk-r16b
在这里插入图片描述

1.4 添加OpenCV开发包支持

通过选择File -> New -> import Module
在这里插入图片描述

选择opencv-android-sdk/sdk/java,选择sdk下面的java目录。Module name命名为OpenCVLibrary430,选择Next默认,Finsh.
在这里插入图片描述
在这里插入图片描述
创建好后,成功导入了OpenCVLibrary430库。
将项目切换为Project模式,选择OpenCV Library430 ->build gradle将 build gradle第一行的

apply plugin: 'com.android.application'

改为:

apply plugin: 'com.android.library'

删除defaultConfig 中的applicationId
选择File -> Project Structure ->Dependencies可以看到OpenCVLibrary430前面变成了库文件的图标。
在这里插入图片描述

1.5 创建JniLibs

选择app -> src ->main 在main文件中右键选择New -> Folder ->JNI Folder,创建Jni文件
在这里插入图片描述
在这里插入图片描述
将opencv-android-sdk下面的sdk ->native ->libs中的文件拷贝到JNI文件中。

然后选中File -> Project Structure ->Dependencies,点击app选择+号,添加Module Dependency,将OpenCVLibrary430库添加到app中

在这里插入图片描述将OpenCVLibrary430中的compileSdkVersionbuildToolVersion的版本设置与app中build.gradle的compileSdkVersionbuildToolVersion的版本一致。可以在Project Structure中的Modules中进行设置。
在这里插入图片描述
在这里插入图片描述
查看app所属的build.gradle,将

   sourceSets { main { jni.srcDirs = ['src/main/jni', 'src/main/jniLibs'] } }

改为

   sourceSets { main { jniLibs.srcDirs = [ 'src/main/jniLibs'] } }

注: 如果提示OpenCV error: Cannot load info library for OpenCV,说明系统找不到OpenCV的so文件。确认是否把jniLibs.srcDirs错误写成了jni.srcDirs。因为我们配置的是jniLibs,所以需要写成jniLibs.srcDirs

查看dependencies中是否进入了OpenCVLibrary430在这里插入图片描述
并且,在defaultCofig中的externalNativeBuild配置cmake参数

  externalNativeBuild {
            cmake {
                cppFlags "-std=c++14 -frtti  -fexceptions"
                abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64'
                arguments 'DANDROID_STL=c++_shared'
            }
        }

环境配置好后,运行程序,如果程序运行没出错,说明已经正确添加好程序。

注:如果提示ERROR: Cause: exception while building Json D:\works\Android_cv\project\OpenCVCplus\app\.cxx\cmake\debug\x86\CMakeFiles\CMakeTmp\.ninja_deps: 另一个程序正在使用此文件,进程无法访问。通过删除app文件下的 .cxxbuild文件重新运行即可。
在这里插入图片描述

2. 人脸识别项目

2.1 页面布局

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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">

    <Button
        android:layout_width="100dp"
        android:layout_height="40dp"
        android:id="@+id/loadButton"
        android:text="load"/>
    <Button
        android:layout_width="100dp"
        android:layout_height="40dp"
        android:layout_below="@id/loadButton"
        android:id="@+id/processButton"
        android:text="Detect Face"/>
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:id="@+id/imageView1"
        android:layout_below="@+id/processButton"/>
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:id="@+id/imageView2"
        android:layout_below="@+id/imageView1"/>
</RelativeLayout>

界面效果:
在这里插入图片描述

2.2 存放模型资源文件

创建res资源文件下创建raw文件用来存放人脸识别的lbpcascade_frontalface.xml模型文件。
方法:res ->New ->Android Resource Directory
在这里插入图片描述

设置:Directory name为raw, Resource type 下拉选择raw。然后将模型资源文件lbpcascade_frontalface.xml粘贴到该文件下。
在这里插入图片描述
在这里插入图片描述

2.3 MainActivity.java

代码

package com.example.myopencvdemo;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;

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

public class MainActivity extends AppCompatActivity {

    Button loadButton;
    Button detectFaceButton;

    ImageView imageView1;
    ImageView imageView2;
    String imagePathLoaded;
    Mat matrix;
    Bitmap bitmap;


    static {
        System.loadLibrary("native-lib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//        OpenCVLoader.initDebug();
        ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},200);
       loadButton=findViewById(R.id.loadButton);
       detectFaceButton=findViewById(R.id.processButton);
       imageView1=findViewById(R.id.imageView1);
       imageView2=findViewById(R.id.imageView2);

       loadButton.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
               Intent intent=new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI);
               //打开一个带有返回值的交互界面
               startActivityForResult(intent,300); //300 requestCode设置为300
           }
       });

       detectFaceButton.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
              detectFace();
           }
       });
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data){
        super.onActivityResult(requestCode,resultCode,data);
        if(requestCode == 300){
            if(resultCode == RESULT_OK){
                Uri uri=data.getData();
                imageView1.setImageURI(uri);
                imagePathLoaded=getPathFromURI(MainActivity.this,uri);

                try {
                    FileInputStream fis = new FileInputStream(imagePathLoaded);
                    bitmap=BitmapFactory.decodeStream(fis);
                    //imageView1.setImageBitmap(bitmap);

                } catch (Exception e) {
                    e.printStackTrace();
                }
//                matrix= Imgcodecs.imread(imagePathLoaded);
            }
        }
    }
    // 根据相册的Uri获取图片的路径
    public static String getPathFromURI(Context context, Uri uri) {
        String result;
        Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
        if (cursor == null) {
            result = uri.getPath();
        } else {
            cursor.moveToFirst();
            int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
            result = cursor.getString(idx);
            cursor.close();
        }
        return result;
    }

    public void detectFace(){
        if(bitmap == null)
        {
            return ;
        }
        Bitmap bit=bitmap.copy(Bitmap.Config.ARGB_8888,false);
        Mat src=new Mat(bit.getHeight(),bit.getWidth(), CvType.CV_8UC(3));

        Utils.bitmapToMat(bit,src);
        Mat dst=src.clone();
        Imgproc.cvtColor(src,dst, Imgproc.COLOR_BGR2GRAY);
        Mat matrix =dst.clone();

        CascadeClassifier cascadeClassifier=new CascadeClassifier();

        try {
            //Copy the resource into a temp file so OpenCV can load it
            InputStream is=this.getResources().openRawResource(R.raw.lbpcascade_frontalface);
            //在内存中创建名为cascade的目录  Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问
            File cascadeDir=getDir("cascade", Context.MODE_PRIVATE);
            //android 中raw文件下面的模型文件不支持直接读取,我们需要把模型保存到一个缓存目录,然后再从缓存目录加载模。
            File mCascadeFile = new File(cascadeDir,"lbpcascade_frontalface.xml");
           // 创建一个向指定 File 对象表示的文件中写入数据的文件输出流
            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();

            //Load the cascade classifer
            cascadeClassifier=new CascadeClassifier(mCascadeFile.getAbsolutePath());

        }catch (Exception e){
            Log.e("OpenCVActivity","Error loading casce",e);
        }

        MatOfRect faceArray = new MatOfRect();
        cascadeClassifier.detectMultiScale(matrix,faceArray);

        int numFaces=faceArray.toArray().length;
        for(Rect face:faceArray.toArray()){
            Imgproc.rectangle(src,new Point(face.x,face.y),new Point(face.x+face.width,face.y+face.height),new Scalar(0,0,255),3);
        }

        Mat finalMatrix = src.clone();
        Bitmap bitmap =Bitmap.createBitmap(finalMatrix.cols(),finalMatrix.rows(),Bitmap.Config.ARGB_8888);
        Utils.matToBitmap(finalMatrix,bitmap);
        imageView2.setImageBitmap(bitmap);

        Toast.makeText(getApplicationContext(),numFaces+ " faces found!",Toast.LENGTH_SHORT).show();
    }


	//需要在onResume方法中验证是否可以使用内置的OpenCV库
    @Override
    protected void onResume() {
        super.onResume();
        if(!OpenCVLoader.initDebug()){
            Log.i("cv","未收到内置OpenCV库,使用OpenCV Manager进行初始化。");

//            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_4_0, this, mLoaderCallback);
        }else
        {
            Log.i("cv","发现了内置OpenCV库,使用OpenCV 库进行初始化。");
//            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();
}

  • android 中raw文件下面的模型文件不支持直接读取,我们需要把模型保存到一个缓存目录,然后再从缓存目录加载模。
  • 片的地址就包括 MediaStore.Images.Media.INTERNAL_CONTENT_URIMediaStore.Images.Media.EXTERNAL_CONTENT_URI 两个基础地址。其值分别是 content://media/internal/images/media 和 content://media/external/images/media ,对应内部库和外部库地址。每一张图片的地址基本上是上面的基础URL地址下加上图片的内部ID。打个比方一张存储卡上的图片ID为2,其对应的Uri地址就是 content://media/external/images/media/2. 知道了这个地址,基本上就可以操作这张图片的所有信息了。参考
  • startActivityForResult主要用来从FirstActivity跳转到SecondActivity然后返回FirstActivity并且获取从SecondActivity传回来的参数。参考

2.4 人脸识别效果

点击LOAD按钮导入本地一张带有人脸的图片,点击DETECT按钮就可以识别出人脸,效果如下:
在这里插入图片描述

源码下载

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OpenCV(Open Source Computer Vision Library)是一款开源的计算机视觉库,专门为图像和视频处理任务设计,广泛应用于学术研究、工业应用以及个人项目中。以下是关于OpenCV的详细介绍: 历史与发展 起源:OpenCV于1999年由英特尔公司发起,旨在促进计算机视觉技术的普及和商业化应用。该项目旨在创建一个易于使用、高效且跨平台的库,为开发者提供实现计算机视觉算法所需的基础工具。 社区与支持:随着时间的推移,OpenCV吸引了全球众多开发者和研究人员的参与,形成了活跃的社区。目前,OpenCV由非盈利组织OpenCV.org维护,并得到了全球开发者、研究机构以及企业的持续贡献和支持。 主要特点 跨平台:OpenCV支持多种操作系统,包括但不限于Windows、Linux、macOS、Android和iOS,确保代码能够在不同平台上无缝运行。 丰富的功能:库中包含了数千个优化过的函数,涵盖了计算机视觉领域的诸多方面,如图像处理(滤波、形态学操作、色彩空间转换等)、特征检测与描述(如SIFT、SURF、ORB等)、物体识别与检测(如Haar级联分类器、HOG、DNN等)、视频分析、相机校正、立体视觉、机器学习(SVM、KNN、决策树等)、深度学习(基于TensorFlow、PyTorch后端的模型加载与部署)等。 高效性能:OpenCV代码经过高度优化,能够利用多核CPU、GPU以及特定硬件加速(如Intel IPP、OpenCL等),实现高速图像处理和实时计算机视觉应用。 多语言支持:尽管OpenCV主要使用C++编写,但它提供了丰富的API绑定,支持包括C、Python、Java、MATLAB、JavaScript等多种编程语言,方便不同领域的开发者使用。 开源与免费:OpenCV遵循BSD开源许可证发布,用户可以免费下载、使用、修改和分发库及其源代码,无需担心版权问题。 架构与核心模块 OpenCV的架构围绕核心模块构建,这些模块提供了不同层次的功能: Core:包含基本的数据结构(如cv::Mat用于图像存储和操作)、基本的图像和矩阵操作、数学函数、文件I/O等底层功能。 ImgProc:提供图像预处理、滤波、几何变换、形态学操作、直方图计算、轮廓发现与分析等图像处理功能。 HighGui:提供图形用户界面(GUI)支持,如图像和视频的显示、用户交互(如鼠标事件处理)以及简单的窗口管理。 VideoIO:负责视频的读写操作,支持多种视频格式和捕获设备。 Objdetect:包含预训练的对象检测模型(如Haar级联分类器用于人脸检测)。 Features2D:提供特征点检测(如SIFT、ORB)与描述符计算、特征匹配与对应关系估计等功能。 Calib3d:用于相机标定、立体视觉、多视图几何等问题。 ML:包含传统机器学习算法,如支持向量机(SVM)、K近邻(KNN)、决策树等。 DNN:深度神经网络模块,支持导入和运行预训练的深度学习模型,如卷积神经网络(CNN)。 应用领域 OpenCV广泛应用于: 科研与教育:作为计算机视觉教学和研究的基础工具,OpenCV简化了算法原型开发与验证过程。 工业自动化:在视觉检测、机器人导航、产品质量控制等工业场景中,OpenCV用于实时图像分析与决策。 安防监控:用于人脸识别、行人检测、行为分析等智能监控系统。 医疗影像分析:在医疗领域,OpenCV可用于医学图像处理、病灶检测、诊断辅助等应用。 自动驾驶:在车辆视觉感知系统中,OpenCV用于道路标志识别、障碍物检测、车道线识别等任务。 多媒体应用:如图像编辑软件、AR/VR应用、游戏开发等,利用OpenCV进行图像和视频处理。 物联网与嵌入式系统:在资源受限的嵌入式设备上,OpenCV提供轻量级的计算机视觉解决方案。 学习与社区资源 OpenCV拥有丰富的官方文档、教程、示例代码以及活跃的开发者社区,包括GitHub、StackOverflow、官方论坛等,为学习和使用OpenCV提供了有力支持。此外,有许多书籍、在线课程、博客文章和研讨会专门讲解OpenCV的使用和计算机视觉技术。 综上所述,OpenCV作为一款功能强大、高效、跨平台且开源的计算机视觉库,为开发者提供了实现各类图像和视频处理任务所需的工具箱,其广泛的应用领域和活跃的社区支持使之成为计算机视觉领域不可或缺的开发工具。
OpenCV(Open Source Computer Vision Library)是一款开源的计算机视觉库,专门为图像和视频处理任务设计,广泛应用于学术研究、工业应用以及个人项目中。以下是关于OpenCV的详细介绍: 历史与发展 起源:OpenCV于1999年由英特尔公司发起,旨在促进计算机视觉技术的普及和商业化应用。该项目旨在创建一个易于使用、高效且跨平台的库,为开发者提供实现计算机视觉算法所需的基础工具。 社区与支持:随着时间的推移,OpenCV吸引了全球众多开发者和研究人员的参与,形成了活跃的社区。目前,OpenCV由非盈利组织OpenCV.org维护,并得到了全球开发者、研究机构以及企业的持续贡献和支持。 主要特点 跨平台:OpenCV支持多种操作系统,包括但不限于Windows、Linux、macOS、Android和iOS,确保代码能够在不同平台上无缝运行。 丰富的功能:库中包含了数千个优化过的函数,涵盖了计算机视觉领域的诸多方面,如图像处理(滤波、形态学操作、色彩空间转换等)、特征检测与描述(如SIFT、SURF、ORB等)、物体识别与检测(如Haar级联分类器、HOG、DNN等)、视频分析、相机校正、立体视觉、机器学习(SVM、KNN、决策树等)、深度学习(基于TensorFlow、PyTorch后端的模型加载与部署)等。 高效性能:OpenCV代码经过高度优化,能够利用多核CPU、GPU以及特定硬件加速(如Intel IPP、OpenCL等),实现高速图像处理和实时计算机视觉应用。 多语言支持:尽管OpenCV主要使用C++编写,但它提供了丰富的API绑定,支持包括C、Python、Java、MATLAB、JavaScript等多种编程语言,方便不同领域的开发者使用。 开源与免费:OpenCV遵循BSD开源许可证发布,用户可以免费下载、使用、修改和分发库及其源代码,无需担心版权问题。 架构与核心模块 OpenCV的架构围绕核心模块构建,这些模块提供了不同层次的功能: Core:包含基本的数据结构(如cv::Mat用于图像存储和操作)、基本的图像和矩阵操作、数学函数、文件I/O等底层功能。 ImgProc:提供图像预处理、滤波、几何变换、形态学操作、直方图计算、轮廓发现与分析等图像处理功能。 HighGui:提供图形用户界面(GUI)支持,如图像和视频的显示、用户交互(如鼠标事件处理)以及简单的窗口管理。 VideoIO:负责视频的读写操作,支持多种视频格式和捕获设备。 Objdetect:包含预训练的对象检测模型(如Haar级联分类器用于人脸检测)。 Features2D:提供特征点检测(如SIFT、ORB)与描述符计算、特征匹配与对应关系估计等功能。 Calib3d:用于相机标定、立体视觉、多视图几何等问题。 ML:包含传统机器学习算法,如支持向量机(SVM)、K近邻(KNN)、决策树等。 DNN:深度神经网络模块,支持导入和运行预训练的深度学习模型,如卷积神经网络(CNN)。 应用领域 OpenCV广泛应用于: 科研与教育:作为计算机视觉教学和研究的基础工具,OpenCV简化了算法原型开发与验证过程。 工业自动化:在视觉检测、机器人导航、产品质量控制等工业场景中,OpenCV用于实时图像分析与决策。 安防监控:用于人脸识别、行人检测、行为分析等智能监控系统。 医疗影像分析:在医疗领域,OpenCV可用于医学图像处理、病灶检测、诊断辅助等应用。 自动驾驶:在车辆视觉感知系统中,OpenCV用于道路标志识别、障碍物检测、车道线识别等任务。 多媒体应用:如图像编辑软件、AR/VR应用、游戏开发等,利用OpenCV进行图像和视频处理。 物联网与嵌入式系统:在资源受限的嵌入式设备上,OpenCV提供轻量级的计算机视觉解决方案。 学习与社区资源 OpenCV拥有丰富的官方文档、教程、示例代码以及活跃的开发者社区,包括GitHub、StackOverflow、官方论坛等,为学习和使用OpenCV提供了有力支持。此外,有许多书籍、在线课程、博客文章和研讨会专门讲解OpenCV的使用和计算机视觉技术。 综上所述,OpenCV作为一款功能强大、高效、跨平台且开源的计算机视觉库,为开发者提供了实现各类图像和视频处理任务所需的工具箱,其广泛的应用领域和活跃的社区支持使之成为计算机视觉领域不可或缺的开发工具。
OpenCV(Open Source Computer Vision Library)是一款开源的计算机视觉库,专门为图像和视频处理任务设计,广泛应用于学术研究、工业应用以及个人项目中。以下是关于OpenCV的详细介绍: 历史与发展 起源:OpenCV于1999年由英特尔公司发起,旨在促进计算机视觉技术的普及和商业化应用。该项目旨在创建一个易于使用、高效且跨平台的库,为开发者提供实现计算机视觉算法所需的基础工具。 社区与支持:随着时间的推移,OpenCV吸引了全球众多开发者和研究人员的参与,形成了活跃的社区。目前,OpenCV由非盈利组织OpenCV.org维护,并得到了全球开发者、研究机构以及企业的持续贡献和支持。 主要特点 跨平台:OpenCV支持多种操作系统,包括但不限于Windows、Linux、macOS、Android和iOS,确保代码能够在不同平台上无缝运行。 丰富的功能:库中包含了数千个优化过的函数,涵盖了计算机视觉领域的诸多方面,如图像处理(滤波、形态学操作、色彩空间转换等)、特征检测与描述(如SIFT、SURF、ORB等)、物体识别与检测(如Haar级联分类器、HOG、DNN等)、视频分析、相机校正、立体视觉、机器学习(SVM、KNN、决策树等)、深度学习(基于TensorFlow、PyTorch后端的模型加载与部署)等。 高效性能:OpenCV代码经过高度优化,能够利用多核CPU、GPU以及特定硬件加速(如Intel IPP、OpenCL等),实现高速图像处理和实时计算机视觉应用。 多语言支持:尽管OpenCV主要使用C++编写,但它提供了丰富的API绑定,支持包括C、Python、Java、MATLAB、JavaScript等多种编程语言,方便不同领域的开发者使用。 开源与免费:OpenCV遵循BSD开源许可证发布,用户可以免费下载、使用、修改和分发库及其源代码,无需担心版权问题。 架构与核心模块 OpenCV的架构围绕核心模块构建,这些模块提供了不同层次的功能: Core:包含基本的数据结构(如cv::Mat用于图像存储和操作)、基本的图像和矩阵操作、数学函数、文件I/O等底层功能。 ImgProc:提供图像预处理、滤波、几何变换、形态学操作、直方图计算、轮廓发现与分析等图像处理功能。 HighGui:提供图形用户界面(GUI)支持,如图像和视频的显示、用户交互(如鼠标事件处理)以及简单的窗口管理。 VideoIO:负责视频的读写操作,支持多种视频格式和捕获设备。 Objdetect:包含预训练的对象检测模型(如Haar级联分类器用于人脸检测)。 Features2D:提供特征点检测(如SIFT、ORB)与描述符计算、特征匹配与对应关系估计等功能。 Calib3d:用于相机标定、立体视觉、多视图几何等问题。 ML:包含传统机器学习算法,如支持向量机(SVM)、K近邻(KNN)、决策树等。 DNN:深度神经网络模块,支持导入和运行预训练的深度学习模型,如卷积神经网络(CNN)。 应用领域 OpenCV广泛应用于: 科研与教育:作为计算机视觉教学和研究的基础工具,OpenCV简化了算法原型开发与验证过程。 工业自动化:在视觉检测、机器人导航、产品质量控制等工业场景中,OpenCV用于实时图像分析与决策。 安防监控:用于人脸识别、行人检测、行为分析等智能监控系统。 医疗影像分析:在医疗领域,OpenCV可用于医学图像处理、病灶检测、诊断辅助等应用。 自动驾驶:在车辆视觉感知系统中,OpenCV用于道路标志识别、障碍物检测、车道线识别等任务。 多媒体应用:如图像编辑软件、AR/VR应用、游戏开发等,利用OpenCV进行图像和视频处理。 物联网与嵌入式系统:在资源受限的嵌入式设备上,OpenCV提供轻量级的计算机视觉解决方案。 学习与社区资源 OpenCV拥有丰富的官方文档、教程、示例代码以及活跃的开发者社区,包括GitHub、StackOverflow、官方论坛等,为学习和使用OpenCV提供了有力支持。此外,有许多书籍、在线课程、博客文章和研讨会专门讲解OpenCV的使用和计算机视觉技术。 综上所述,OpenCV作为一款功能强大、高效、跨平台且开源的计算机视觉库,为开发者提供了实现各类图像和视频处理任务所需的工具箱,其广泛的应用领域和活跃的社区支持使之成为计算机视觉领域不可或缺的开发工具。
(支持linux、windows、mac、Android平台) OpenCV(Open Source Computer Vision Library)是一款开源的计算机视觉库,专门为图像和视频处理任务设计,广泛应用于学术研究、工业应用以及个人项目中。以下是关于OpenCV的详细介绍: 历史与发展 起源:OpenCV于1999年由英特尔公司发起,旨在促进计算机视觉技术的普及和商业化应用。该项目旨在创建一个易于使用、高效且跨平台的库,为开发者提供实现计算机视觉算法所需的基础工具。 社区与支持:随着时间的推移,OpenCV吸引了全球众多开发者和研究人员的参与,形成了活跃的社区。目前,OpenCV由非盈利组织OpenCV.org维护,并得到了全球开发者、研究机构以及企业的持续贡献和支持。 主要特点 跨平台:OpenCV支持多种操作系统,包括但不限于Windows、Linux、macOS、Android和iOS,确保代码能够在不同平台上无缝运行。 丰富的功能:库中包含了数千个优化过的函数,涵盖了计算机视觉领域的诸多方面,如图像处理(滤波、形态学操作、色彩空间转换等)、特征检测与描述(如SIFT、SURF、ORB等)、物体识别与检测(如Haar级联分类器、HOG、DNN等)、视频分析、相机校正、立体视觉、机器学习(SVM、KNN、决策树等)、深度学习(基于TensorFlow、PyTorch后端的模型加载与部署)等。 高效性能:OpenCV代码经过高度优化,能够利用多核CPU、GPU以及特定硬件加速(如Intel IPP、OpenCL等),实现高速图像处理和实时计算机视觉应用。 多语言支持:尽管OpenCV主要使用C++编写,但它提供了丰富的API绑定,支持包括C、Python、Java、MATLAB、JavaScript等多种编程语言,方便不同领域的开发者使用。 开源与免费:OpenCV遵循BSD开源许可证发布,用户可以免费下载、使用、修改和分发库及其源代码,无需担心版权问题。 架构与核心模块 OpenCV的架构围绕核心模块构建,这些模块提供了不同层次的功能: Core:包含基本的数据结构(如cv::Mat用于图像存储和操作)、基本的图像和矩阵操作、数学函数、文件I/O等底层功能。 ImgProc:提供图像预处理、滤波、几何变换、形态学操作、直方图计算、轮廓发现与分析等图像处理功能。 HighGui:提供图形用户界面(GUI)支持,如图像和视频的显示、用户交互(如鼠标事件处理)以及简单的窗口管理。 VideoIO:负责视频的读写操作,支持多种视频格式和捕获设备。 Objdetect:包含预训练的对象检测模型(如Haar级联分类器用于人脸检测)。 Features2D:提供特征点检测(如SIFT、ORB)与描述符计算、特征匹配与对应关系估计等功能。 Calib3d:用于相机标定、立体视觉、多视图几何等问题。 ML:包含传统机器学习算法,如支持向量机(SVM)、K近邻(KNN)、决策树等。 DNN:深度神经网络模块,支持导入和运行预训练的深度学习模型,如卷积神经网络(CNN)。 应用领域 OpenCV广泛应用于: 科研与教育:作为计算机视觉教学和研究的基础工具,OpenCV简化了算法原型开发与验证过程。 工业自动化:在视觉检测、机器人导航、产品质量控制等工业场景中,OpenCV用于实时图像分析与决策。 安防监控:用于人脸识别、行人检测、行为分析等智能监控系统。 医疗影像分析:在医疗领域,OpenCV可用于医学图像处理、病灶检测、诊断辅助等应用。 自动驾驶:在车辆视觉感知系统中,OpenCV用于道路标志识别、障碍物检测、车道线识别等任务。 多媒体应用:如图像编辑软件、AR/VR应用、游戏开发等,利用OpenCV进行图像和视频处理。 物联网与嵌入式系统:在资源受限的嵌入式设备上,OpenCV提供轻量级的计算机视觉解决方案。 学习与社区资源 OpenCV拥有丰富的官方文档、教程、示例代码以及活跃的开发者社区,包括GitHub、StackOverflow、官方论坛等,为学习和使用OpenCV提供了有力支持。此外,有许多书籍、在线课程、博客文章和研讨会专门讲解OpenCV的使用和计算机视觉技术。 综上所述,OpenCV作为一款功能强大、高效、跨平台且开源的计算机视觉库,为开发者提供了实现各类图像和视频处理任务所需的工具箱,其广泛的应用领域和活跃的社区支持使之成为计算机视觉领域不可或缺的开发工具。
要使用Java通过摄像头进行人脸识别,需要使用OpenCV库和JavaCV库。以下是基本步骤: 1. 下载安装OpenCVJavaCV库 2. 创建一个Java工程 3. 在工程中导入OpenCVJavaCV库 4. 编写代码,调用摄像头并实现人脸识别功能 示例代码: ```java import org.bytedeco.javacpp.opencv_core; import org.bytedeco.javacpp.opencv_objdetect; import org.bytedeco.javacv.FrameGrabber; import org.bytedeco.javacv.FrameGrabber.Exception; import org.bytedeco.javacv.OpenCVFrameGrabber; import org.bytedeco.javacv.OpenCVFrameConverter; import org.bytedeco.javacv.Java2DFrameConverter; import javax.swing.JFrame; import javax.swing.JPanel; import java.awt.Graphics; import java.awt.image.BufferedImage; public class FaceDetection { public static void main(String[] args) throws Exception, InterruptedException { //加载OpenCV库 System.loadLibrary(opencv_core.class.getSimpleName()); //创建FrameGrabber对象,调用摄像头 FrameGrabber grabber = new OpenCVFrameGrabber(0); grabber.start(); //创建JFrame窗口,用于显示摄像头的视频流 JFrame jFrame = new JFrame("Face Detection"); jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jFrame.setSize(640, 480); JPanel jPanel = new JPanel() { private static final long serialVersionUID = 1L; @Override public void paint(Graphics g) { super.paint(g); g.drawImage(image, 0, 0, this); } }; jFrame.setContentPane(jPanel); jFrame.setVisible(true); //创建OpenCVFrameConverter对象,将Frame对象转换为Mat对象 OpenCVFrameConverter.ToMat converterToMat = new OpenCVFrameConverter.ToMat(); //创建Java2DFrameConverter对象,将Frame对象转换为BufferedImage对象 Java2DFrameConverter converterToImage = new Java2DFrameConverter(); //创建CascadeClassifier对象,用于人脸识别 opencv_objdetect.CascadeClassifier classifier = new opencv_objdetect.CascadeClassifier( "haarcascade_frontalface_alt.xml"); while (true) { //获取摄像头的视频流 opencv_core.Mat mat = converterToMat.convert(grabber.grab()); //进行人脸识别 opencv_core.RectVector faces = new opencv_core.RectVector(); classifier.detectMultiScale(mat, faces); //将人脸框出并显示在JFrame窗口中 BufferedImage image = converterToImage.convert(converterToMat.convert(mat)); Graphics graphics = jPanel.getGraphics(); graphics.drawImage(image, 0, 0, null); for (int i = 0; i < faces.size(); i++) { opencv_core.Rect face = faces.get(i); graphics.drawRect(face.x(), face.y(), face.width(), face.height()); } Thread.sleep(100); } } } ``` 在该示例中,我们创建了一个JFrame窗口用于显示摄像头的视频流,并使用CascadeClassifier对象进行人脸识别。最后,我们将人脸框出并显示在JFrame窗口中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@BangBang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值