OpenCv NDK 银行卡/身份证号识别(1) OpenCv NDK项目集成

最近一直在学习ndk开发相关的知识点,其实也是一路迷茫不知道从哪里下手,其实想做ndk相关的开发还是要有一定的c和c++的基础,特别是对指针,结构体,c++的类,函数指针,命名空间,&引用等等,防止在开发的过程中出现问题而不知到具体原因。之前也有几篇文章对c和c++记录了一些容易错和重要的知识点:

1. JNI/NDK 开发 C/C++ 典型基础知识点
2. JNI/NDK开发 C 调用java方法
3. JNI/NDK开发 配置CMakelist文件加载第三方 so

有了c和c++的基础之后,我们就可以对 JNI 在做一些了解,毕竟JNI 是 java 和 c/c++ 通讯的桥梁,java调用c方法和c调java方法都需要JNI 进行过度。当然 ndk 开发的方式有很多,现在谷歌比较支持的 CMake 的开发方式,对于我们开发上可以说非常方便,我们可以直接创建 support c++的项目,里面自动给我们集成好了 CMakeList 的开发方式。

通过系统的学习了 C,C++,JNI/NDK,CmakeList的配置基本在就可以接着学习NDK 的开发章节了,所以为了锻炼自己,也为了学习新技术,我在学完这些基础之后,想用NDK 做一些比较有意思的开发。借助开源的Opencv来实现图像处理识别身份证或者银行卡卡号的识别。做的效果如下:

识别的效果还是不错的,接下来就来开始我们的第一步:

1. OpenCv 库介绍

对于Opencv的项目集成之前也有写过一篇集成的是 java 的库,这次我们就来集成native层,我用的是最新的Opencv4.1的,不同版本.2/.3之间的差别还是挺大的,包括后面我们用到的machine learn (机械学习)的SVM模型训练的时候,代码上和其他版本之间是有差别的,这个注意以下。去官网下载Opencv的包百度搜以下,尽量下载.3/.4的版本。

Opencv4的包结构:

下载好工具包之后,有两处是我们开发用到的,就是native下面的include头文件和手机CPU armeabi-v7a的.so库。接下来说一下怎么使用。

2. OpenCv NDK项目集成

   1.首先我们创建一个support c++ 的项目,这个就不多说了。然后拿到include头文件和.so库,创建JniLibs如图:

导入头文件和我们的.so库。这个头文件和我们的.so的关系其实很明确,.so就是c/c++代码的具体实现,头文件就是c/c++具体实现的声明和定义。例如:我们在开发的时候用到科大语音,为啥我们拿到.so文件之后还要加入一个.jar文件,.jar就相当于我们的java调用c/c++的方法是java类,.jar类中有我们的native方法用来调用.so中的c/c++文件,就是科大讯飞已经给我们封装好了java代码让我们调用。

   2.然后到build.gradle中配置支持的 abi CPU的类型: 

  externalNativeBuild {
            cmake {
                cppFlags ""
                abiFilters 'armeabi-v7a' //控制生成的so架构,有armxx7,armxx64(必须要指定)
            }
        }

  3. 配置CMakeList文件这个之前介绍过,再简单说一下
      JNI/NDK开发 配置CMakelist文件加载第三方 so

# 配置路径 so 的头文件(h)的路径引用
include_directories(src/main/jniLibs/include)

    这个是配置我们的头文件的引用路径,为何要配置这个因为我们在写c代码时候,需要引入opencv库中的.h头文件,配置这个之后我们项目中就能直接引用 :

#include <opencv2/opencv.hpp>

这种形式,不然我们的include进来的路径要引入很长,不方便。

# 加载第三方的so库文件
add_library(
        myopencvc #最终在build中生成的so名字
        SHARED
        IMPORTED)
set_target_properties(
        myopencvc #最终在build中生成的so名字
        PROPERTIES IMPORTED_LOCATION
        ../../../../src/main/jniLibs/armeabi-v7a/libopencv_java4.so) #so的路径

这个是把第三方的so文件编译到apk中,注意上下名字要一致,路径要一致。

add_library( # Sets the name of the library.
        native-lib

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        src/main/cpp/native-lib.cpp src/main/cpp/BitmapUtils.cpp)

这个是我们自己的cpp文件的引用,最终这个add_library会生成一libnative-lib.so文件,编译到我们的apk中。里面有所有我们自己写的cpp文件。

target_link_libraries( # Specifies the target library.
        native-lib
        myopencvc
        # 加上下面这一行
        
        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})

link我们本项目链接的所有.so ndk库文件,需要注意的是 jnigraphics 这个是android ndk 中的库,里面就是我们Bitamp 的jni调用头文件和c代码。这个是android源码相关的一个ndk库。

到此项目基本配置完成,也插入了个人对相关知识的理解和介绍。接下来就是介绍Opencv中的以些方法的使用。

发布了119 篇原创文章 · 获赞 140 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/WangRain1/article/details/97371424
ndk