移植成功后的源码链接如下:
http://download.csdn.NET/detail/daiyinger/9416320
关于源码的说明如下:
1、安装后打开应用后点击 车牌检测即可测试sd卡目录下的默认包含车牌的图片。
2、如果要编译C,ndk我用的是r10e,当然r9c也没问题,我是在cygwin中进行ndk编译的。
3、基于OpenCV-Android-sdk3.0,编译时,可将工程拷到opencv-android-sdk的sampls目录下。
4、编译后生成的日志在sd卡的ai目录下,首次安装或者升级时也会将.xml文件拷贝到该目录下。
5、显示区的图像指示缩放和拖拽,但体验还需完善,也欢迎大家下载优化后共享出来。
关于如何搭建ndk环境网上资料太多,主要对主要流程和代码做概要说明。
第一步
拷贝EasyPR的src目录到Anroid的工程下的jni目录。
第二步
编写jni接口的函数和接口。
接口头文件com_daiyinger_carplate_CarPlateDetection.h的定义如下
- /* DO NOT EDIT THIS FILE - it is machine generated */
- #include <jni.h>
- /* Header for class com_daiyinger_carplate_CarPlateDetection */
- #ifndef _Included_com_daiyinger_carplate_CarPlateDetection
- #define _Included_com_daiyinger_carplate_CarPlateDetection
- #ifdef __cplusplus
- extern "C" {
- #endif
- /*
- * Class: com_example_carplate_CarPlateDetection
- * Method: ImageProc
- * Signature: ([III)Ljava/lang/String;
- */
- JNIEXPORT jbyteArray JNICALL Java_com_daiyinger_carplate_CarPlateDetection_ImageProc
- (JNIEnv *, jclass, jstring, jstring, jstring, jstring, jstring);
- #ifdef __cplusplus
- }
- #endif
- #endif
第三步
为jni代码编写Anroid.mk。
- LOCAL_PATH := $(call my-dir)/src
- include $(CLEAR_VARS)
- # OpenCV
- OPENCV_CAMERA_MODULES:=on
- OPENCV_INSTALL_MODULES:=on
- include ../../sdk/native/jni/OpenCV.mk
- FILE_LIST := $(wildcard $(LOCAL_PATH)/core/*.cpp)
- FILE_LIST += $(wildcard $(LOCAL_PATH)/preprocess/*.cpp)
- FILE_LIST += $(wildcard $(LOCAL_PATH)/util/*.cpp)
- LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)
- LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
- LOCAL_MODULE := imageproc
- #LOCAL_LDLIBS := -landroid
- LOCAL_LDLIBS += -llog
- include $(BUILD_SHARED_LIBRARY)
为jni代码编写Application.mk
- APP_STL := gnustl_static
- NDK_TOOLCHAIN_VERSION=4.8
- APP_CPPFLAGS := -frtti -std=c++11 -fexceptions
- APP_ABI := armeabi-v7a
- APP_PLATFORM := android-8
第四部
进行ndk编译生成库。
第五步
在Anroid中编写调用的代码
首先声明接口函数
public static native byte[] ImageProc(String sdpath,String logpath, String imgpath, String svmpath, String annpath);
其中 sdpath 为外部sd卡路径,识别库过程中的一些文件会写入sd卡根目录下的/ai/tmp/路径下,故须传入,在Anroid中可通过Environment.getExternalStorageDirectory().getAbsolutePath()获取
logpath为识别的日志文件存储路径,一般放在sd开的ai目录下,比如"/sdcard/ai/"
imgpath为待识别的图片的路径
svmpath为车牌检测svm.xml资源的存放路径。现在程序做了一个功能,首次安装或者升级,都会将需要用到的svm.xml和ann.xml从程序的assets目录下拷贝到sd卡的ai目录下,故一般该路径为"/sdcard/svm.xml"
annpath为车牌识别ann.xml资源的存放路径。一般该路径为"/sdcard/ann.xml"
Java代码如下
- String resultImgDirPath = path +"/ai/tmp/";
- String logpath = path+"/ai/ai_log.log";
- String svmpath = path+"/ai/svm.xml";
- String annpath = path+"/ai/ann.xml";
- String imagepath = new String(imgpath.getBytes(),"gbk");
- System.out.println("entering the jni");
- SendMsgText("正在识别.....",1);
- Thread.sleep(100);
- String result = null;
- byte[] resultByte =CarPlateDetection.ImageProc(path, logpath, imagepath, svmpath, annpath);
- System.out.println(result);
- if(resultByte != null)
- {
- bmp = BitmapFactory.decodeFile(resultImgDirPath+"result.jpg");
- SendMsgRefresh(3);
- result = new String(resultByte,"UTF-8");
- SendMsgText(result,1);
- SendMsgText(result,2);
- }
- else
- {
- SendMsgText("识别失败!",1);
- }
目前写的比较简单,以后再完善吧,更多可查看代码实现。效果图如下