怎么在android中使用openCV检测车牌
本篇文章给大家分享的是有关怎么在android中使用openCV检测车牌,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
1、导入module
先从官网下载openCVForAndroid的sdk,以3.2.0版本为例,找到依赖库路径,然后导入module。
2、导入动态与静态库
在sdk里面找到lib目录,把所有的.a和.so文件拷贝到项目的libs对应ABI路径下:
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检测车牌,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注恰卡编程网行业资讯频道。
推荐阅读
-
怎么使用Android基准配置文件Baseline Profile方案提升启动速度
-
HTML5如何实现禁止android视频另存为
-
学java好还是学php好?
-
Android如何实现多点触控功能
-
android怎么实现多点触摸应用
-
Android怎么实现手势划定区域裁剪图片
-
android怎么实现简单的矩形裁剪框
-
Android单选多选按钮怎么使用
-
Android中如何利用oncreate获取控件高度或宽度
Android中如何利用oncreate获取控件高度或宽度本篇内容...
-
Android中怎么使用onSaveInstanceState()方法
Android中怎么使用onSaveInstanceState()方法...