- 识别出人脸后会得到两个人脸的 Rect 数组,然后比较这两个 Rect 数组的相似度即可!
实现步骤
====
工程目录准备
-
新建 Android Studio 项目 OpenCVCheck
-
导入 OpenCVLibrary320
-
在 module 下的 build.gradle 中引入 OpenCVLibrary 的编译:
compile project(‘:openCVLibrary320’)
检测任意两张图片的相似度的实现步骤
- 初始化 OpenCV:
static {
if (OpenCVLoader.initDebug()) {
Log.e(TAG, “OpenCV load success !”);
} else {
Log.e(TAG, “OpenCV load failed !”);
}
}
- 加载两张图片进入内存
Bitmap mBitmap1 = BitmapFactory.decodeResource(getResources(), R.mipmap.pic1);
Bitmap mBitmap2 = BitmapFactory.decodeResource(getResources(), R.mipmap.pic2);
- 将内存中的两张图片 bitmap 转换为 Mat 矩阵
Mat mat1 = new Mat();
Mat mat2 = new Mat();
Mat mat11 = new Mat();
Mat mat22 = new Mat();
Utils.bitmapToMat(mBitmap1, mat1);
Utils.bitmapToMat(mBitmap2, mat2);
Imgproc.cvtColor(mat1, mat11, Imgproc.COLOR_BGR2GRAY);
Imgproc.cvtColor(mat2, mat22, Imgproc.COLOR_BGR2GRAY);
- 把 Mat 矩阵的 type 转换为 Cv_8uc1(1 通道 8 位矩阵)类型,然后转换为 Cv_32F,通过 OpenCV 来进行俩个矩阵的比较
/**
-
比较来个矩阵的相似度
-
@param srcMat
-
@param desMat
*/
public void comPareHist(Mat srcMat, Mat desMat) {
srcMat.convertTo(srcMat, CvType.CV_32F);
desMat.convertTo(desMat, CvType.CV_32F);
double target = Imgproc.compareHist(srcMat, desMat, Imgproc.CV_COMP_CORREL);
textView.setText(“相似度:” + target);
}
识别图片中是否有人脸步骤
- 初始化 OpenCV
if (!OpenCVLoader.initDebug()) {
Log.d(TAG, “Internal OpenCV library not found. Using OpenCV Manager for initialization”);
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_11, this, mLoaderCallback);
} else {
Log.d(TAG, “OpenCV library found inside package. Using it!”);
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
- 编译 .so 库
通过 ndk 来编译 jni 文件下的.cpp 文件,生成.so 库,以备程序使用
- 加载.so 库
// 在 Opencv 初始化完成后,调用 Native 库
System.loadLibrary(“detection_based_tracker”);
- 加载需要的人脸的 Haar 特征分类器就是一个 XML 文件,该文件中会描述人脸的 Haar 特征值
``` 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);
}
}
break;
default: {
super.onManagerConnected(status);
}
break;
}
}
};
- 加载图片进入内存,得到 Mat 矩阵,有了 Mat 矩阵,然后通过调用 OpenCV 的 Native 方法,人脸探测器 CascadeClassifier 在该 Mat 矩阵中检测当前是否有人脸
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
学习福利
【Android 详细知识点思维脑图(技能树)】
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。
这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
由于篇幅有限,这里以图片的形式给大家展示一小部分。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。文章来源地址https://www.toymoban.com/news/detail-853739.html
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
的),所以努力让自己成为高级工程师才是最重要的。
这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
由于篇幅有限,这里以图片的形式给大家展示一小部分。
[外链图片转存中…(img-SmGr923u-1711869631803)]文章来源:https://www.toymoban.com/news/detail-853739.html
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
到了这里,关于OpenCV 人脸识别、图片相似度检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!