铁军智能

400 0800 729

车牌识别系统工作原理及程序组成

作者:恒创智能   时间:2021-03-26 10:26  来源:未知   浏览:

实际生活中,车牌识别是很常见的:高速公路,停车系统,电子警察,甚至还有车载设备。

作为车牌识别专业厂商的恒创智能,为您讲述车牌识别系统的工作原理及程序组成。

其工作原理大致是这样的:使用摄像头作为“眼睛”,使用 openCV和深度学习作为“大脑”。车辆牌照识别的实时工作步骤:摄像头抓拍—> openCV对车牌位置进行初步定位——>对车牌位置的左右上下边界进行二次确认——>车牌倾斜校正——>牌号字符分割——>字符识别。而车牌检测是车牌识别的前提和重要基础。


安卓车牌识别: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深度学习对每个字符进行识别。最终得到识别结果与识别置信度,如果置信度大于一定阈值,那么该轮识别结果可靠。

购买车牌识别产品,认准恒创智能。