移植开源EasyPR的车牌识别源码到Android工程

考虑到Anroid的便携性,平时又方便拍照,故有了将最新的1.4版本的源码移植到Anroid上使用。

      移植成功后的源码链接如下:

      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的定义如下

    

  1. /* DO NOT EDIT THIS FILE - it is machine generated */  
  2. #include <jni.h>  
  3. /* Header for class com_daiyinger_carplate_CarPlateDetection */  
  4.   
  5. #ifndef _Included_com_daiyinger_carplate_CarPlateDetection  
  6. #define _Included_com_daiyinger_carplate_CarPlateDetection  
  7. #ifdef __cplusplus  
  8. extern "C" {  
  9. #endif  
  10. /* 
  11.  * Class:     com_example_carplate_CarPlateDetection 
  12.  * Method:    ImageProc 
  13.  * Signature: ([III)Ljava/lang/String; 
  14.  */  
  15. JNIEXPORT jbyteArray JNICALL Java_com_daiyinger_carplate_CarPlateDetection_ImageProc  
  16.   (JNIEnv *, jclass, jstring, jstring, jstring, jstring, jstring);  
  17.   
  18. #ifdef __cplusplus  
  19. }  
  20. #endif  
  21. #endif  

    第三步

    为jni代码编写Anroid.mk。

     

  1. LOCAL_PATH := $(call my-dir)/src  
  2. include $(CLEAR_VARS)  
  3. # OpenCV  
  4. OPENCV_CAMERA_MODULES:=on  
  5. OPENCV_INSTALL_MODULES:=on  
  6. include ../../sdk/native/jni/OpenCV.mk    
  7. FILE_LIST := $(wildcard $(LOCAL_PATH)/core/*.cpp)  
  8. FILE_LIST += $(wildcard $(LOCAL_PATH)/preprocess/*.cpp)  
  9. FILE_LIST += $(wildcard $(LOCAL_PATH)/util/*.cpp)  
  10. LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)  
  11. LOCAL_C_INCLUDES += $(LOCAL_PATH)/include  
  12. LOCAL_MODULE     :imageproc   
  13. #LOCAL_LDLIBS := -landroid  
  14. LOCAL_LDLIBS += -llog   
  15. include $(BUILD_SHARED_LIBRARY)    

为jni代码编写Application.mk

  1. APP_STL :gnustl_static    
  2. NDK_TOOLCHAIN_VERSION=4.8  
  3. APP_CPPFLAGS := -frtti -std=c++11 -fexceptions  
  4. APP_ABI :armeabi-v7a    
  5. 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代码如下

      

  1. String resultImgDirPath = path +"/ai/tmp/";  
  2.             String logpath = path+"/ai/ai_log.log";  
  3.             String svmpath = path+"/ai/svm.xml";  
  4.             String annpath = path+"/ai/ann.xml";  
  5.             String imagepath =  new String(imgpath.getBytes(),"gbk");  
  6.             System.out.println("entering the jni");  
  7.             SendMsgText("正在识别.....",1);  
  8.             Thread.sleep(100);  
  9.             String result = null;  
  10.               
  11.             byte[] resultByte =CarPlateDetection.ImageProc(path, logpath, imagepath, svmpath, annpath);  
  12.             System.out.println(result);  
  13.             if(resultByte != null)  
  14.             {  
  15.                 bmp = BitmapFactory.decodeFile(resultImgDirPath+"result.jpg");  
  16.                 SendMsgRefresh(3);  
  17.                 result = new String(resultByte,"UTF-8");                     
  18.                     SendMsgText(result,1);  
  19.                     SendMsgText(result,2);  
  20.             }  
  21.             else  
  22.             {  
  23.                 SendMsgText("识别失败!",1);  
  24.             }  


        目前写的比较简单,以后再完善吧,更多可查看代码实现。效果图如下

          

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值