android dlib 人脸检测使用

一、编译阶段

1、在cmakelist.txt中加入:

include(src/main/cpp/dlib/cmake)

然后再链接dlib库就可以了:

target_link_libraries( # Specifies the target library.native-libdlib# Links the target library to the log library# included in the NDK.${log-lib} )

2、可能出现的错误

Android NDK 编译器默认不支持 C++ 异常控制导致。

Error:(124, 17) error: cannot use 'throw' with exceptions disabled
Error:(119, 21) error: cannot use typeid with -fno-rtti

在build.gradle中加入cpp编译选项:

cppFlags "-fexceptions"
cppFlags "-frtti"

最后build文件如下:

    compileSdkVersion 24buildToolsVersion "24.0.1"defaultConfig {applicationId "image.imageapp"minSdkVersion 19targetSdkVersion 24versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"externalNativeBuild {cmake {cppFlags "-std=c++11"cppFlags "-fexceptions"cppFlags "-frtti"}}}

4、找不到opencv.cmake

SET(OpenCV_INCLUDE_DIRS "/usr/include")
SET(OpenCV_LIB_DIR "/usr/lib")
INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS})

二、NDK使用、Dlib调用

1、dlib接口调用

#include <jni.h>
#include <string>
#include <vector>
#include <iostream>#include "face_detection/dlib/image_io.h"
#include "face_detection/dlib/image_processing.h"
#include "face_detection/dlib/image_processing/frontal_face_detector.h"#include <ctime>dlib::frontal_face_detector m_facedetector=dlib::get_frontal_face_detector();
//获取人脸框
std::vector<int > getfacerect(const std::vector<int>img,int height,int width)
{dlib::array2d<unsigned char>image;image.set_size(height,width);for (int i = 0; i < height; i++){for(int j=0;j<width;j++){int clr = img[i*width+j];int red = (clr & 0x00ff0000) >> 16; // 取高两位int green = (clr & 0x0000ff00) >> 8; // 取中两位int blue = clr & 0x000000ff; // 取低两位unsigned char gray=red*0.299+green*0.587+blue*0.114;//dlib::rgb_pixel pt(red,green,blue);image[i][j]=gray;}}clock_t begin = clock();std::vector<dlib::rectangle> dets= m_facedetector(image);std::vector<int >rect;if (!dets.empty()){rect.push_back(dets[0].left());rect.push_back(dets[0].top());rect.push_back(dets[0].width());rect.push_back(dets[0].height());}return rect;}extern "C" jintArray  Java_image_imageapp_MainActivity_stringFromJNI(JNIEnv *env, jobject /* this */,jintArray image_data,jint image_height,jint image_widht)
{//const char* cha = env->GetStringUTFChars(imagepath, nullptr);// char* 转 string// std::string image_str(cha);// if(cha == NULL) {//return NULL;// }//jstring rtstr = env->NewStringUTF(image_str.c_str());//env->NewStringUTF(hello.c_str());// return rtstr;std::vector<int>image_datacpp(image_height*image_widht);jsize len = env->GetArrayLength(image_data);jint *body = env->GetIntArrayElements(image_data, 0);for (jsize i=0;i<len;i++){image_datacpp[i]=(int)body[i];}std::vector<int>rect=getfacerect(image_datacpp,image_height,image_widht);jintArray result =env->NewIntArray(4);env->SetIntArrayRegion(result, 0, 4, &rect[0]);return result;}

2、MainActivity.JAVA中调用库函数:

    private int[] face_detection(Bitmap origin_image){float scale = 240.f/ Math.max(origin_image.getHeight(), origin_image.getWidth());int width = (int)(origin_image.getWidth()*scale);int height = (int)(origin_image.getHeight()*scale);Bitmap resize_image=Bitmap.createScaledBitmap(origin_image,width,height , false);// 保存所有的像素的数组,图片宽×高int[] pixels = new int[width * height];resize_image.getPixels(pixels, 0, width, 0, 0, width, height);int[] rect=stringFromJNI(pixels,height,width);int[] result_rect=new int[4];result_rect[0]=(int)(rect[0]/scale);result_rect[1]=(int)(rect[1]/scale);result_rect[2]=(int)(rect[2]/scale);result_rect[3]=(int)(rect[3]/scale);result_rect[2]=result_rect[2]+result_rect[0];result_rect[3]=result_rect[3]+result_rect[1];return  result_rect;}

3、显示绘制结果

            int[] rect=face_detection(scaled);Canvas canvas=new Canvas(scaled);Paint p=new Paint();p.setColor(Color.RED);p.setStrokeWidth(3.0f);canvas.drawLine(rect[0], rect[1], rect[2], rect[1], p);//upcanvas.drawLine(rect[0], rect[1], rect[0], rect[3], p);//leftcanvas.drawLine(rect[0], rect[3], rect[2], rect[3], p);//downcanvas.drawLine(rect[2], rect[1], rect[2], rect[3], p);//cnvs.drawRect(rectangle,paint);imageView.setImageBitmap(scaled);

算法移植优化(三)android dlib 人脸检测使用相关推荐

  1. 人脸识别系列二 | FisherFace,LBPH算法及Dlib人脸检测

    前言 前面介绍了使用特征脸法进行人脸识别,这里介绍一下OpenCV人脸识别的另外两种算法,一种是FisherFace算法,一种是LBPH算法. FisherFace算法 FisherFace是基于线性 ...

  2. 嵌入式算法移植优化学习笔记5——CPU,GPU,TPU,NPU都是什么

    嵌入式算法移植优化学习笔记5--CPU,GPU,TPU,NPU都是什么 一.什么是CPU? 二.什么是GPU? 三.什么是NPU? 四.什么是TPU? 附: 随着AI的广泛应用,深度学习已成为当前AI ...

  3. python dlib人脸检测_Python 3 利用 Dlib 实现人脸检测和剪切

    0. 引言 利用 Python 开发,借助 Dlib 库进行人脸检测 / face detection 和剪切: 将检测到的人脸剪切下来,依次排序平铺显示在新的图像上: 实现的效果如 图1 所示,将 ...

  4. opencv联合dlib人脸检测例子二(加快检测)

    本篇博客是在opencv联合dlib人脸检测例子的基础上改进了下,加快检测流程 观察了下,opencv利用haar级联分类器检测人脸区域的速度要稍快于dlib的frontal_face_detecto ...

  5. 人脸识别系统——Dlib人脸检测

    EduCoder平台:人脸识别系统--Dlib人脸检测 第1关:HOG特征描述方法 编程要求: 请在右侧编辑器中的BEGIN-END之间编写代码,完成如下要求: 声明OpenCV中的HOG特征描述方法 ...

  6. OpenCV vs Dlib 人脸检测比较分析

    点击我爱计算机视觉标星,更快获取CVML新技术 人脸检测是计算机视觉最典型的应用之一,早期OpenCV的logo就是Haar人脸检测的示意图. 很多人的第一个OpenCV学习目标就是跑通Haar级联人 ...

  7. 人脸检测算法_目前最强!开源人脸检测算法:RetinaFace

    加入极市专业CV交流群,与6000+来自腾讯,华为,百度,北大,清华,中科院等名企名校视觉开发者互动交流!更有机会与李开复老师等大牛群内互动! 同时提供每月大咖直播分享.真实项目需求对接.干货资讯汇总 ...

  8. 【Dlib人脸识别】1. Dlib人脸检测的基本原理

    Dlib中,人脸识别的基本思路为: 计算已知图片中所有人脸对应的特征向量: 计算要识别的未知图片中所有人脸对应的特征向量: 计算人脸之间的欧式距离: 如果两张人脸之间的欧式距离小于设定的阈值,则认为是 ...

  9. win7环境下安装dlib人脸检测包

    背景 项目中需要用到dlib包进行人脸检测与关键点提取,之前都是在mac或者linux系统下进行的,这次需要在Windows系统下进行.在mac或者linux系统下,安装非常简单,使用以下命令即可 p ...

最新文章

  1. class 与 原型链 解析
  2. SAP FI新手常用代码
  3. 【做事必须搞清10个顺序】
  4. oracle中rownum和row_number()的区别
  5. 到2030年丰田将斥资135亿美元开发电动汽车电池技术及供应系统
  6. CNN(卷积神经网络)
  7. DDR2 DDR3 PCBlayout规则
  8. Vijos 1048 送给圣诞夜的贺卡(dfs)
  9. 【JS】用JS实现系统常见日周月时间按钮切换效果
  10. java8中的Stream用法详解
  11. 洛谷P3373线段树
  12. 【《视觉SLAM十四讲》前ch2-ch6实践全过程和遇到的问题及解决办法】
  13. 华三光纤交换机默认密码和重置方法
  14. ios safari 描述文件 跳转到_iOS-app跳转safari及从safari跳回app功能实现
  15. Object.assign()用法和特性
  16. python js 性能_lua与python性能测试比较
  17. 养生需知:藏在水里的“杀机” 你遇到了吗
  18. 梯度下降法的理解以及马鞍点
  19. soul之websocket数据同步
  20. 信息墒与压缩编码基础

热门文章

  1. python rtsp转换为图片_化异为同,Python 在背后帮你做的转换
  2. 为什么要返回function_宇宙飞船返回时,为什么要冒着烧毁的风险加速穿过大气层?...
  3. dotnet 找不到控制生成器_真的有自媒体原创文章生成器吗?
  4. 做折线图_python的visvis库做折线图(line.py)代码详解
  5. springboot整合activemq加入会签,自动重发机制,持久化
  6. linux导出Excel The maximum column width for an individual cell is 255 characters
  7. StringUtils工具类说明
  8. LINQ学习——JOIN
  9. 从下往上飞入的动画效果
  10. ubuntu 14.04 登录 界面 root