Android 调用Tensorflow C++实现

Android 调用Tensorflow C++实现

概述
功能:Android 端调用Tensorflow分为Java接口和C接口调用,本文主要说明C接口的调用。通过JNI方式将结果返回给Android上层并对数据渲染处理,实现对象检测功能。其中数据内容包括left,top,right,bottom坐标及标签内容和分数等)。如果想了解如何通过训练得到最优模型及推理过程,可以通过官网了解其原理。
Tensorflow官网.

效果如图:
在这里插入图片描述
调用过程
1.添加OpenCV,Tensorflow 动态库,配置CmakeLists。

代码如下:

cmake_minimum_required(VERSION 3.4.1)

set(CMAKE_VERBOSE_MAKEFILE on)

set(OPENCV_BASE ${
   CMAKE_SOURCE_DIR}/src/main/cpp/native)
set(OPENCV_SHARED ${
   OPENCV_BASE}/libs) # OpenCV动态库
set(OPENCV_HEADER ${
   OPENCV_BASE}/jni/include) # OpenCV头文件


set(TFLITE_BASE ${
   CMAKE_SOURCE_DIR}/src/main/cpp/third_party/tensorflow_lite)
set(TFLITE_HEADER ${
   TFLITE_BASE}/headers)
set(TFLITE_SHARED ${
   TFLITE_BASE}/libs)

message("OPENCV_HEADER : " ${
   OPENCV_HEADER})
message("OPENCV_SHARED : " ${
   OPENCV_SHARED})
message("TFLITE_BASE :" ${
   TFLITE_BASE})

include_directories(${
   OPENCV_HEADER} ${
   TFLITE_HEADER})
#link_directories(${
   TFLITE_SHARED}/${
   ANDROID_ABI})

add_library(tensorflowlite_jni
        SHARED
        IMPORTED)
set_target_properties(tensorflowlite_jni PROPERTIES
        IMPORTED_LOCATION
        ${
   CMAKE_SOURCE_DIR}/src/main/jniLibs/${
   ANDROID_ABI}/libtensorflowlite_jni.so)

#  配置依赖库
add_library(libopencv_java4
        SHARED
        IMPORTED)

set_target_properties(libopencv_java4 PROPERTIES
        IMPORTED_LOCATION
        ${
   CMAKE_SOURCE_DIR}/src/main/jniLibs/${
   ANDROID_ABI}/libopencv_java4.so)

add_library(native-gw
        SHARED
        src/main/cpp/native-gw.cpp)

target_link_libraries(native-gw
        libopencv_java4
        tensorflowlite_jni
        android
        log)

2.定义本地函数,结合OpenCV接口调用Camera2并返回Mat对象,将图片内存地址传递至本地函数。

代码如下:

@Override
    public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
   
        rgba = inputFrame.rgba();
        newSingleThreadExecutor.execute(new Runnable() {
   
            @Override
            public void run() {
   
                try {
   
                    show_detect_results(NativeLoad.TfLiteDetect(rgba.getNativeObjAddr()));
                    Thread.sleep(50);
                }  catch (InterruptedException e) {
   
                    e.printStackTrace
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值