Android平台车牌识别开发手册

Posted curry666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android平台车牌识别开发手册相关的知识,希望对你有一定的参考价值。

目录

1 演示程序安装与激活 5

1.1 安装 5

1.2 android版本 5

1.3 激活方式介绍 5

2 拍摄注意事项 6

2.1 一般要求 6

2.2 对拍摄图像的要求 6

3 接口概述与集成说明 6

4 调用识别Activity 7

4.1 识别参数说明 7

4.2 识别返回值说明 8

5 调用识别Service 11

5.1 调用Service方式概述 11

5.2 示例代码 11

6 调用识别参数配置函数 15

7序列号在线激活方式的集成步骤 17

7.1 资源文件的拷贝 17

7.2配置AndroidManifest.xml文件, 18

7.3 授权服务的代码集成 20

7.4识别方法选择: 22

进入拍照识别界面代码: 22

进入视频识别界面代码: 22

进入选择识别界面代码: 22

7.5识别服务的集成 22

7.6 结束 24

8.项目授权方式的集成步骤 24

8.1资源文件拷贝 24

8.2配置AndroidManifest.xml文件 25

8.3识别方法选择: 28

进入拍照识别界面代码: 28

进入视频识别界面代码: 28

进入选择识别界面代码: 28

8.4识别服务的集成 28

8.5结束 30

9.TF授权方式的集成步骤 30

9.1资源文件设置 30

9.2配置AndroidManifest.xml文件 31

9.3识别方法选择: 33

进入拍照识别界面代码: 33

进入视频识别界面代码: 33

进入选择识别界面代码: 34

9.4识别服务的集成 34

9.5识别服务的代码 34

9.6 结束 35

10.SIM卡授权方式的集成步骤(请参照序列号集成步骤) 35

 

 

1 演示程序安装与激活

1.1 安装

安装文通车牌演示程序plate_id_sample_service.apk。

1.2 Android版本

支持Android2.3 – 5.1

1.3 激活方式介绍

在首次调用时提供序列号或激活文件进行激活。

1、 在线序列号激活方式。

由文通公司提供含有序列号的Excel文件,用户在调用程序中指定sn参数即用于该设备的某序列号,首次调用识别时设备须联网。可指定绑定设备deviceid或绑定SIM卡序号。默认绑定deviceid

2、 离线文件激活方式。

用户先提供文通公司含有deviceidandroididExcel文件(第一列为deviceid,第二列为androidid),然后文通公司提供对应设备的激活文件压缩包,压缩包中激活文件的数目与设备数目一致,以[deviceid]_cp.txt命名,用户在调用程序中指定authfile参数即激活文件的路径和名称,首次调用时设备无需联网。如authfile参数为null或等于””时,默认激活文件路径为根目录下的[deviceid]_cp.txt,当激活文件存在时做此激活操作。

3、 TF卡模式。

需使用文通公司授权的TF卡。

4、  项目授权方式。

项目授权文件中限制如下内容:开发码参数、用户程序包名、识别核心版本号、使用截止时间、用户程序名称、用户公司名称;

开发码与调用识别时传递的devcode参数比对,开发码由文通公司与项目授权文件一并提供;

程序包名与AndroidMenifest.xmlpackage比对;

使用截止时间与当前系统时间比对;

授权文件中核心版本号与底层核心版本号比对, 默认限制前两位;

项目名称与strings.xmlapp_name比对;

公司名称与strings.xmlcompany_name比对;

项目授权文件需放入项目assets文件夹中。

注意:如果使用12 所列的激活方式,请选择指定sn参数或authfile参数 ,不要同时指定sn参数和authfile参数,否则将只按1的方式进行激活,设置此两个参数请参见下文代码示例。

**采用项目授权无需调用验证授权服务

2 拍摄注意事项

目前支持的JPEG图像的分辨率为2048*1536像素及以下,支持图像中车牌的默认实际宽度为80-400像素。

2.1 一般要求

图像文字清晰,人眼可辨别;

对比度、亮度适中;

2.2 对拍摄图像的要求

拍摄时做好聚焦,以免图像模糊不清;

拍摄时不要使车牌过度倾斜;

尽量不要使拍摄角度倾斜过大,以免造成图像变形成梯形;

3 接口概述与集成说明

用户可以调用ActivityService的方式集成识别功能,识别Activity只支持JPG图片格式,识别Service也支持JPG图片格式,推荐使用Service方式集成;用户可以通过调用函数的方式设置识别参数,详情见后面章节。

注意将“plate_id_sdk集成所需文件”文件夹下的所有内容放到Android项目的根目录下;注意拷贝assetsliblibsres的内容到您的项目中;注意将AndroidManifest.xml里面的内容和res/values/strings.xml的内容合并到项目相关文件中;如果采用TF卡授权方式,请将 “TF”文件夹中的相关文件替换到项目中;如果采用序列号激活方式绑定设备,请将“序列号” 文件夹中的相关文件替换到项目中;

注意当与文通Android证件识别集成到一个项目中时,请删除lib文件夹下的misc_crypto.jar(如果有的话),否则会引起冲突。

4 调用识别Activity(V1.3.0.5不再使用)

4.1 识别参数说明

识别Activity具有如下参数:

类型

名称

说明

示例

String

cls

接收识别返回值的包名类名

com.wintone.demo.PlateIDRunner

String

pic

图片路径

 

int

imageformat

图像格式

1

int

width

图像宽度

420

int

height

图像高度

232

int

bVertFlip

 

0

int

bDwordAligned

 

1

boolean

GetVersion

是否需要获取开发包的版本信息

true

String

sn

序列号,第一次调用时激活,如不设置此项需通过自动激活或手动激活页面输入序列号。

请输入大写序列号

String

authfile

激活文件路径,激活文件中保存了用于该设备的序列号和激活码,不用时可设置为””

 

String

userdata

用户想在识别后和识别结果一起传回的字符串

 

String

returntype

接收识别结果的方式

默认值””,代表用第一种方式接收识别结果;值”withvalue”代表用第二种方式。详见示例程序章节。

4.2 识别返回值说明

识别Activity具有如下返回值:

类型

名称

说明

备注

int

nRet

识别结果标志

0成功;

1  FindPlate(没有找到车牌)

2 车牌评价值(0)

3 车牌评价值(不及格)

4 车牌识别分数(0)

5 车牌识别分数(不及格)

-1001 jpg图片错误,可能是图片超过2048*1536分辨率

-10001 未调用初始化函数

-10003 没有激活或激活码校验失败

-10004 指定序列号为null""

-10005 未连接到服务器

-10006 获取激活码失败或未连接到服务器

-10007 授权服务器无此序列号

-10008 序列号已使用

-10009 无法创建授权文件

-10010 校验激活码失败

-10011 其他错误

-10012 未激活

-10015 激活文件校验失败

-10401 开发码错误或未找到authmode.lsc文件

-10402 设备型号未授权

-10500 未检测到SIM

-1008 未读到TF卡;

-1005 TF卡授权模式下使用了非TF卡授权的动态库;

20 所插TF中的license\license.dat授权文件不匹配;或非TF卡授权模式下使用了TF卡模式动态库;

-8:license\license.dat授权文件未找到

-10600 其他错误;

-10601 开发码错误;

-10602 程序包名错误;

-10603 截止时间过期;

-10604 核心版本号错误;

-10605 项目名称错误;

-10606 公司名称错误。

String[]

GetFieldName

字段名

"车牌号", "车牌颜色", "车牌颜色代码", "车牌类型代码", "整牌可信度", "亮度评价","车牌运动方向", "车牌左上点横坐标", "车牌左上点纵坐标", "车牌右下点横坐标", "车牌右下点纵坐标", "时间","车的亮度", "车的颜色"

String[]

GetRecogResult

字段值

车牌颜色编码:

0 未知

1

2

3

4

5 绿

车牌类型编码:

0 未知车牌

1 蓝牌小汽车

2 黑牌小汽车

3 单排黄牌

4 双排黄牌(大车尾牌,农用车)

5 警车车牌

6 武警车牌

7 个性化车牌

8 单排军车

9 双排军车

10 使馆牌

11 香港牌

12 拖拉机

车辆亮度编码:

0

1

车辆颜色编码:

0

1 ()

2

3

4

5 绿

6

7

8

运动方向编码:

1

2

3

4

String

ReturnGetVersion

取版本信息,如果定义了GetVersiontrue才能取版本信息

 

String

ReturnUserData

返回用户自定义数据参数userdata

 

String

ReturnLPFileName

用户指定的图像路径

 

 

5 调用识别Service

5.1 调用Service方式概述 

Service接口包括两个Service,分别是验证Service AuthService和识别Service RecogService

验证Service所需参数:序列号方式激活时用sn参数;激活文件方式时用authfile参数;不要同时指定sn参数和authfile参数,否则将只按序列号方式进行激活;如果未设置sn参数和authfile参数,将在根目录寻找激活文件。

TF卡授权方式不用调用验证Service,只调用识别Service即可。

验证Service调用顺序:bindService、激活验证函数getAuthunbindService;即每次产生验证Service新实例完成验证和激活的操作。

识别Service调用顺序:在验证Service的返回值ReturnAuthority0时,每次识别时调用依次调用一次bondService、读取初始化状态函数getInitPlateIDSDK、设置识别参数的函数setRecogArgu、识别函数doRecogDetail、unbondService

注意:Service方式支持JEPG图像文件识别。

public String[]doRecogDetail(PlateRecognitionParameter prp)//用于识别JEPG图片。

5.2 示例代码

5.2.1 在AndroidManifest.xml中定义Service

<service android:enabled="true" android:name="com.wintone.plateid.AuthService">

    <intent-filter >

        <action android:name="wintone.plateid.authservice"/>

    </intent-filter>

</service>

<service android:enabled="true" android:name="com.wintone.plateid.RecogService">

    <intent-filter >

        <action android:name="wintone.plateid.recogService"/>

    </intent-filter>

</service>

5.2.2 绑定授权验证服务

//绑定授权验证服务

Intent authIntent = new Intent(MainActivity.this, AuthService.class);

bindService(authIntent, authConn, Service.BIND_AUTO_CREATE);

5.2.3 授权验证服务绑定后的操作

//授权验证服务绑定后的操作

 public ServiceConnection authConn = new ServiceConnection() {

        @Override

        public void onServiceDisconnected(ComponentName name) {

            authBinder = null;

        }

 

        @Override

        public void onServiceConnected(ComponentName name, IBinder service) {

            Log.i(TAG, "authConn onServiceConnected");

            authBinder = (AuthService.MyBinder) service;

            Toast.makeText(getApplicationContext(), "授权验证服务 绑定成功", Toast.LENGTH_SHORT).show();

            try {

             // sn:采用序列号方式激活时设置此参数,否则写""

             // authfile:采用激活文件方式激活时设置此参数,否则写""

             // 以上俩个参数都不为""时按序列号方式激活;当snauthfile""时会在根目录下找激活文件 xxxxxxxxxxxxxxx_cp.txt

                ReturnAuthority = authBinder.getAuth(sn, authfile);

                if (ReturnAuthority != 0) {

                    recogButton.setEnabled(false);

                    String[] str = {"" + ReturnAuthority};

                    getResult(str);

                    Toast.makeText(getApplicationContext(), "授权验证失败", Toast.LENGTH_SHORT).show();

                } else {

                 //若授权成功,则启动识别服务

                    recogIntent = new Intent(MainActivity.this, RecogService.class);

                    //startService(recogIntent);

                    Toast.makeText(getApplicationContext(), "授权验证成功", Toast.LENGTH_SHORT).show();

                }

            }catch (Exception e) {

                e.printStackTrace();

                Log.i(TAG, "e=" + e.toString());

            }finally{

                if (authBinder != null) {

                    unbindService(authConn);//解绑授权验证服务

                }

            }

        }

 };

5.2.4 绑定识别服务

//绑定识别服务

 recogIntent = new Intent(MainActivity.this, RecogService.class);

 bindService(recogIntent, recogConn, Service.BIND_AUTO_CREATE);

5.2.5 识别服务绑定后的操作

    //识别服务绑定后的操作

    public ServiceConnection recogConn = new ServiceConnection() {

@Override

public void onServiceDisconnected(ComponentName name) {

recogConn = null;

}

 

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

recogBinder = (RecogService.MyBinder) service;

 

iInitPlateIDSDK = recogBinder.getInitPlateIDSDK();

if (iInitPlateIDSDK != 0) {

 

nRet = iInitPlateIDSDK;

String[] str = { "" + iInitPlateIDSDK };

getResult(str);

} else {

 

PlateCfgParameter cfgparameter = new PlateCfgParameter();

cfgparameter.armpolice = 4;

cfgparameter.armpolice2 = 16;

cfgparameter.embassy = 12;

cfgparameter.individual = 0;

cfgparameter.nContrast = 0;

cfgparameter.nOCR_Th = 2;

cfgparameter.nPlateLocate_Th = 5;

cfgparameter.onlylocation = 15;

cfgparameter.tworowyellow = 2;

cfgparameter.tworowarmy = 6;

cfgparameter.szProvince = "";

cfgparameter.onlytworowyellow = 11;

cfgparameter.tractor = 8;

cfgparameter.bIsNight = 0;

recogBinder.setRecogArgu(cfgparameter, imageformat, bVertFlip,

bDwordAligned);

 

PlateRecognitionParameter prp = new PlateRecognitionParameter();

prp.height = height;

prp.width = width;

prp.pic = recogPicPath;

 

fieldvalue = recogBinder.doRecogDetail(prp);

nRet = recogBinder.getnRet();

if (nRet != 0) {

String[] str = { "" + nRet };

getResult(str);

} else {

getResult(fieldvalue);

}

 

}

 

if (recogBinder != null) {

unbindService(recogConn);

}

}

};

6 调用识别参数配置函数

public void setRecogArgu(PlateCfgParameter cfgparameter, int imageformat, int bVertFlip, int bDwordAligned)

说明:本函数存在于识别Service内,参数cfgparameter见下表,其他参数请勿修改。

类型

参数名称

取值范围

默认值

int

nPlateLocate_Th

定位阈值 (取值范围0-9,7:默认阈值,0:最宽松的阈值,9:最严格的阈值)

5

int

nOCR_Th

识别阈值(取值范围0-9,5:默认阈值0:最宽松的阈值9:最严格的阈值)

2

int

bIsAutoSlope

是否要倾斜校正

1

int

nSlopeDetectRange

倾斜校正的范围(取值范围0-16)

0

String

szProvince

省份顺序

 

int

nContrast

清晰度指数(取值范围0-9,最模糊时设为1;最清晰时设为9)

0(不校验)

int

bIsNight

是否夜间模式:1是;0不是

0

int

individual

是否开启个性化车牌:0是;1不是

0

int

tworowyellow

双层黄色车牌是否开启:2是;3不是

3

int

armpolice

单层武警车牌是否开启:4是;5不是

5

int

tworowarmy

双层军队车牌是否开启:6是;7不是

7

int

tractor

农用车车牌是否开启:8是;9不是

9

int

onlytworowyellow

只识别双层黄牌是否开启:10是;11不是

11

int

embassy

使馆车牌是否开启:12是;13不是

13

int

onlylocation

只定位车牌是否开启:14是;15不是

15

int

armpolice2

双层武警车牌是否开启:16是;17不是

17

 

public String[] doRecogDetail(PlateRecognitionParameter prp)

说明:本函数存在于识别Service内,参数prp见下表。

识别接口,该函数返回的是识别后的数据。

类型

参数名称

 

默认值

byte[]

picByte

相机获取的字节数组数据

 

String

pic

拍照识别,图片的存储路径

 

int

width

图像宽度

 

int

heigth

图像高度

 

String

userdata

用户自定义数据参数userdata

 

String

devCode

开发码

 

String

dataFile

时间授权文件路径

 

String

versionfile

版本授权文件路径

 

boolean

isCheckDevType

是否检查设备型号

false

int

plateIDCfg.bRotate

预览图片在进行识别时需要旋转的角度:

0:不旋转;190度;2:旋转1803:旋转270

0

int

plateIDCfg.left

扫描框在预览图片上所对应的左坐标点

0

int

plateIDCfg.right

扫描框在预览图片上所对应的右坐标点

0

int

plateIDCfg.top

扫描框在预览图片上所对应的上坐标点

0

int

plateIDCfg.bottom

扫描框在预览图片上所对应的下坐标点

0

 

 public int getnRet()  获取识别后的返回值   nRet   (详见4.2返回结果说明)


7序列号在线激活方式的集成步骤

7.1 资源文件的拷贝

assets文件夹、lib文件夹、libs文件夹全部按照下图的目录结构复制到集成的项目中:

先选中所有的jar包,然后add Path,右键lib文件夹点击Buid Path选项并选择config buid Path选项,点击Order and Export选项,android_auth.jarksoap2-android-assembly-2.4-jar-with-dependencies.jarplate_id_sdk.jar

bcprov-ext-jdk15-146.jarpki.jar等全部勾选并点击“确定”按钮,如图:

 

res的内容合并到您的项目中;注意将AndroidManifest.xml里面的内容和res/values/strings.xml的内容合并到项目相关文件中

7.2配置AndroidManifest.xml文件,

打开要集成的项目的AndroidManifest.xml文件,将以下权限、相应的serviceactivity加入其中:

<!-- 读取机器各种ID的权限 -->

    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

    <!-- SDCard中创建与删除文件权限 -->

    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

    <!-- SDCard写入数据权限 -->

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <!-- 关闭该包下的所有应用程序 -->

    <uses-permission android:name="android.permission.RESTART_PACKAGES" />

    <!-- 访问internet权限 -->

    <uses-permission android:name="android.permission.INTERNET" />

    <!-- 访问震动权限 -->

<uses-permission android:name="android.permission.VIBRATE" />

    <!--

    guangda

    <uses-permission android:name="cybertech.pstore.permission.COMPONENT" />

    <uses-permission android:name="cybertech.permission.READ_PSTORE_USERINFO" />

以上是关于Android平台车牌识别开发手册的主要内容,如果未能解决你的问题,请参考以下文章

移动端车牌识别(支持AndroidiOS平台,支持接口开发)

手机端扫描识别车牌二次开发接口

移动端车牌识别TF卡授权

DK:安卓车牌识别/Android车牌识别SDK/Android车牌识别软件

Android平台车牌识别SDK

移动端车牌识别TF卡授权