怎么在android中使用openCV检测车牌

本篇文章给大家分享的是有关怎么在android中使用openCV检测车牌,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

1、导入module

先从官网下载openCVForAndroid的sdk,以3.2.0版本为例,找到依赖库路径,然后导入module。

2、导入动态与静态库

在sdk里面找到lib目录,把所有的.a和.so文件拷贝到项目的libs对应ABI路径下:

怎么在android中使用openCV检测车牌

3、配置gradle

将依赖的静态库编译到native-libs里面:

tasknativeLibsToJar(type:Jar,description:'createajararchiveofthenativelibs'){
destinationDirfile("$buildDir/native-libs")
baseName'native-libs'
fromfileTree(dir:'libs',include:'**/*.so')
into'lib/'
}
tasks.withType(JavaCompile){
compileTask->compileTask.dependsOn(nativeLibsToJar)
}

dependencies{
compilefileTree(include:['*.jar'],dir:'libs')
compilefileTree(dir:"$buildDir/native-libs",include:'native-libs.jar')
......
}

好了,经过配置三步曲,我们就可以愉快地使用openCV了。

------------------------中场休息---------------------------

接下来是调用三步曲:加载openCV、初始化车牌检测器和执行车牌检测

1、加载openCV

调用openCVLoader去加载,如果加载成功进行下一步操作:

privatevoidinitOpenCV(){
booleanresult=OpenCVLoader.initDebug();
if(result){
Log.i(TAG,"initOpenCVsuccess...");
//初始化车牌检测器
mPlateDetector=newObjectDetector(this,R.raw.haarcascade_license_plate,
3,newScalar(255,0,0,0));
mObject=newMatOfRect();
}else{
Log.e(TAG,"initOpenCVfail...");
}
}

2、初始化检测器

使用车牌检测的级联分类xml文件进行初始化:

/**
*创建级联分类器
*@paramcontext上下文
*@paramid级联分类器ID
*@return级联分类器
*/
privateCascadeClassifiercreateDetector(Contextcontext,intid){
CascadeClassifierjavaDetector;
InputStreamis=null;
FileOutputStreamos=null;
try{
is=context.getResources().openRawResource(id);
FilecascadeDir=context.getDir(LICENSE_PLATE_MODEL,Context.MODE_PRIVATE);
FilecascadeFile=newFile(cascadeDir,id+".xml");
os=newFileOutputStream(cascadeFile);

byte[]buffer=newbyte[4096];
intbytesRead;
while((bytesRead=is.read(buffer))!=-1){
os.write(buffer,0,bytesRead);
}

javaDetector=newCascadeClassifier(cascadeFile.getAbsolutePath());
if(javaDetector.empty()){
javaDetector=null;
}

booleandelete=cascadeDir.delete();
Log.i("ObjectDetector","deleteResult="+delete);
returnjavaDetector;
}catch(IOExceptione){
e.printStackTrace();
returnnull;
}finally{
try{
if(null!=is){
is.close();
}
if(null!=os){
os.close();
}
}catch(IOExceptione){
e.printStackTrace();
}
}
}

3、执行车牌检测

由于openCV操作对象是Mat,所以我们得把Bitmap转成Mat,然后转成Gray灰度图去进行检测:

/**
*执行车牌检测
*@parambitmapbitmap
*@return车牌检测后的bitmap
*/
privateBitmapdoPlateDetecting(Bitmapbitmap){
if(mPlateDetector!=null&&bitmap!=null){
MatmRgba=newMat();
MatmGray=newMat();
//bitmap转成map
Utils.bitmapToMat(bitmap,mRgba);
//rgba转成灰度图
Imgproc.cvtColor(mRgba,mGray,Imgproc.COLOR_RGBA2GRAY);
//检测车牌
Rect[]object=mPlateDetector.detectObject(mGray,mObject);
if(object!=null&&object.length>0){
//检测到车牌区域
Rectrect=object[0];
//矩形标识
Imgproc.rectangle(mRgba,rect.tl(),rect.br(),mPlateDetector.getRectColor(),3);
}
//mat转回bitmap
Utils.matToBitmap(mRgba,bitmap);
}
returnbitmap;
}

其中,detectObject方法体是调用cascadeClassifier的detectMultiScale来完成检测的:

publicRect[]detectObject(Matgray,MatOfRectobject){
mCascadeClassifier.detectMultiScale(
gray,//要检查的灰度图像
object,//检测到的车牌
1.1,//表示在前后两次相继的扫描中,搜索窗口的比例系数
mMinNeighbors,//默认是3
Objdetect.CASCADE_SCALE_IMAGE,
getSize(gray,80),//检测目标最小值
getSize(gray,800));//检测目标最大值

returnobject.toArray();
}

以上就是怎么在android中使用openCV检测车牌,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注恰卡编程网行业资讯频道。

发布于 2021-03-26 01:50:07
收藏
分享
海报
0 条评论
156
上一篇:使用urlretrieve()函数怎么下载网络文件 下一篇:怎么在python中使用response.read()函数接收json数据
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码