c# opencv车牌识别_车牌中的文字识别 OCR车牌识别

车牌识别在现实生活当中非常普遍:高速公路、停车系统、电子警察,甚至出现在车载设备上。它的工作原理大致这样:使用摄像头充当“眼睛”,使用openCV与深度学习充当“大脑”。实时车牌识别工作步骤:摄像头抓拍—>openCV初步定位车牌位置—>二次确认车牌位置的左右上下边界—>车牌倾斜校正—>车牌字符切割—>车牌字符识别。其中,车牌检测是车牌识别的前提条件和重要基础。

213f78da6828d0b0633443f54eb58e7d.png

安卓车牌识别:android端使用openCV如何实现车牌检测。

关于openCV的初始化,调用车牌识别JNI接口时,首先进行初始化,加载caffe训练模型相关文件:

plateRecognition = new PlateRecognition(this, mHandler);

//init plate recognizer

new Thread(new Runnable() {

@Override

public void run() {

plateRecognition.initRecognizer("pr");

}

}).start();

摄像头实时抓拍,回调每帧数据给车牌识别线程。需要注意的是,车牌识别中openCV操作对象是Mat,而不是Bitmap:

public Mat onCameraFrame(CvCameraViewFrame inputFrame) {

//每次进行车牌识别间隔3s

long currentTime = System.currentTimeMillis();

if((currentTime - lastRecognizeTime) > 3000){

lastRecognizeTime = currentTime;

//回调给车牌识别线程处理

if(onNewFrameListener != null){

onNewFrameListener.onNewFrame(inputFrame.rgba());

}

}

return inputFrame.rgba();

}

public void onNewFrame(Mat newFrame) {

if(dstMat == null){

dstMat = new Mat(newFrame.rows(), newFrame.cols(), CvType.CV_8UC4);

}

//mat格式转换

newFrame.copyTo(dstMat);

//添加到车牌识别线程的队列中

if(recognizeThread != null){

recognizeThread.addMat(dstMat);

}

}

其中,车牌识别线程调用native层执行,最终把识别结果返回给java层:

public void run() {

while (isRunning){

Mat mat = null;

synchronized (lock){

//从队列取出mat对象

if(matQueue != null && matQueue.size() > 0){

mat = matQueue.poll();

}

}

//调用native层,执行车牌识别

if(mat != null && plateRecognition != null){

plateRecognition.doPlateRecognize(mat);

}

}

}

使用openCV的级联分类器CascadeClassifier去检测,得到车牌所在整个图像的矩形区域,然后二次确认车牌的左右、上下边界,判断车牌是否发生倾斜,如果有倾斜则进行校正。通过滑动窗口来切割车牌字符,使用CNN深度学习对每个字符进行识别。最终得到识别结果与识别置信度,如果置信度大于一定阈值,那么该轮识别结果可靠。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值