Android下使用jni实现基于opencv与dlib的68关键点检测
来源:互联网 发布:cad平面设计软件 编辑:程序博客网 时间:2024/05/21 19:35
关键点:
- 配置项目依赖项环境
- 从手机摄像头获取图片帧
- 将图片帧数据传到C++层及从C++层获取处理后的图片帧数据
- 不安装opencv manager运行基于android opencv库
- C++层68关键点检测
- 项目编译
效果图:
配置项目依赖项环境
NDK的安装配置请自行百度,Android opencv sdk下载
1.新建Android项目
2.右键项目—>Android Tools—>Add Native Supports…
3.在生成的jni目录下新建Application.mk
APP_PLATFORM := android-18APP_STL := gnustl_staticAPP_ABI := armeabi-v7a
4.右键项目—>properties—>c/c++General—>Paths and Symbols—>Include—>add
${NDK_HOME}/platforms/android-18/arch-arm/usr/include${NDK_HOME}/sources/cxx-stl/gnu-libstdc++/4.9/include${NDK_HOME}/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include
5.在Project Explorer空白处右键import->General->Existing Projects into Workspace->选择下载的opencvSDK目录下sdk目录
如:E:\OpenCV-2.4.10-android-sdk\sdk,在Project中选择Opencv Library这个项目->Finish.
然后右键之前创建的项目->properties->android->在Library栏中点击Add,弹出框中选择OpenCV Library,点击OK,然后Apply,OK。
6.在项目根目录创建third_party目录,然后将E:\OpenCV-2.4.10-android-sdk\sdk\native拷贝进来具体结构可参考Demo。
从手机摄像头获取图片帧(下一篇博文讲述)
将图片帧数据传到C++层及从C++层获取处理后的图片
private Bitmap srcBitmap;Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.person);srcBitmap = bitmap;Mat input = new Mat();Mat output = new Mat();Utils.bitmapToMat(srcBitmap, input);Landmarks.landMarks(input.getNativeObjAddr(), output.getNativeObjAddr());Utils.matToBitmap(output, srcBitmap);
不安装opencv manager运行基于android opencv库
1.在项目jni目录下创建prebuilt文件夹,在opencv sdk中将相应Android架构下的libopencv_java.so拷贝进来然后新建Androidusc.mk文件.
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := opencv_javaLOCAL_SRC_FILES := libopencv_java.soinclude $(PREBUILT_SHARED_LIBRARY)
在Android.mk文件最后添加include $(TOP_LEVEL_PATH)/prebuilt/Androidusc.mk(TOP_LEVEL_PATH路径根据项目进行修改)
在Java代码中引用
@Overridepublic void onResume(){ super.onResume(); if (!OpenCVLoader.initDebug()) { } else { System.loadLibrary("DlibLandmarks"); }}
C++层68关键点检测
void detect(cv::Mat input){ LOGE("detect"); Mat result; cvtColor(input, result, CV_RGBA2BGR); assign_image(img, cv_image<bgr_pixel>(result)); std::vector<dlib::rectangle> dets = detector(img);//检测人脸,获得边界框 int Max = 0; int area = 0; if (dets.size() != 0) { for (unsigned long t = 0; t < dets.size(); ++t) { if (area < dets[t].width()*dets[t].height()) { area = dets[t].width()*dets[t].height(); Max = t; } } } full_object_detection shape = sp(img, dets[Max]); box.x = dets[Max].left(); box.y = dets[Max].top(); box.width = dets[Max].width(); box.height = dets[Max].height(); pts2d.clear(); // 将结果保存至 pts2d 里面 for (size_t k = 0; k < shape.num_parts(); k++) { Point2d p(shape.part(k).x(), shape.part(k).y()); pts2d.push_back(p); }}
项目编译
项目Android.mk
LOCAL_PATH := $(call my-dir)# =======================================================include $(CLEAR_VARS)# Define 3rd party pathTOP_LEVEL_PATH = $(LOCAL_PATH)/..$(info TOP_LEVEL_PATH: $(TOP_LEVEL_PATH))THIRD_PARTY_PATH = $(LOCAL_PATH)/../../third_partyOPENCV_PATH = $(THIRD_PARTY_PATH)/opencvOpenCV_INSTALL_MODULES := onOPENCV_LIB_TYPE := SHAREinclude $(OPENCV_PATH)/jni/OpenCV.mkLOCAL_MODULE := DlibLandmarksLOCAL_C_INCLUDES :=$(OPENCV_PATH)/jni/include \ $(LOCAL_PATH)/../dlib \LOCAL_SRC_FILES := \ ../dlib//dlib/threads/threads_kernel_shared.cpp \ ../dlib/dlib/entropy_decoder/entropy_decoder_kernel_2.cpp \ ../dlib/dlib/base64/base64_kernel_1.cpp \ ../dlib/dlib/threads/threads_kernel_1.cpp \ ../dlib/dlib/threads/threads_kernel_2.cpp LOCAL_SRC_FILES += \ DlibLandmarks.cppLOCAL_LDLIBS := -lm -llog -ldl -lz -ljnigraphicsLOCAL_CPPFLAGS += -fexceptions -frtti -std=c++11LOCAL_ARM_MODE := armifeq ($(TARGET_ARCH_ABI), armeabi-v7a) LOCAL_ARM_NEON := trueendifinclude $(BUILD_SHARED_LIBRARY)#-----------------------------------------------------------------------------include $(TOP_LEVEL_PATH)/prebuilt/Androidusc.mk
注意:请仔细查看各级文件路径,具体文件层级请参考Demo。
Demo(DlibLandmarks)下载
- Android下使用jni实现基于opencv与dlib的68关键点检测
- 【Python】使用openCV与dlib实现人脸68特征点的检测与手动修改
- python下通过dlib和opencv实现人脸对齐(包括关键点检测和仿射变换)
- Opencv与dlib联合进行人脸关键点检测与识别
- Opencv与dlib联合进行人脸关键点检测与识别【转】
- Dlib库中实现正脸人脸关键点(landmark)检测的测试代码
- Dlib人脸检测及关键点描述的python实现
- Dlib 实现人脸的68点检测
- 用dlib和opencv进行不同角度人脸检测及68个关键点提取(Python)
- Dlib人脸关键点检测顺序
- dlib、opencv - 人脸关键点定位
- python︱利用dlib和opencv实现简单换脸、人脸对齐、关键点定位与画图
- 基于Caffe的人脸关键点检测实现
- 基于opencv 和 Dlib的人眼检测,放大与贴纸替换
- opencv结合dlib进行人脸特征点的检测
- 结合dlib与OpenCV的视频流人脸检测
- OpenCV自学笔记31. Android 上使用jni和opencv 实现边缘检测和直线检测
- 使用Dlib库进行68个人脸特征点检测
- lua 内存
- Onboard SDK
- CodeM美团点评编程大赛 初赛B轮 A 黑白树 贪心 E 子串 暴力
- 架构设计:负载均衡层设计方案(5)——LVS单节点安装
- 程序编译后的结构和动态编译重定位,程序编译知识
- Android下使用jni实现基于opencv与dlib的68关键点检测
- 设计模式-创建者模式总结
- HDU 6026
- Log4j1升级Log4j2实战
- 四大组件之Service
- Cookie的使用----MVC
- 复杂链表的复制
- org.springframework.web.util.NestedServletException: Request processing fail
- 使用Hystrix实现自动降级与依赖隔离