javacpp-opencv圖像處理系列:國內車輛牌照檢測識別系統(萬份測試車牌識別准確率99.7%以上,單次平均耗時39ms)


javaCV圖像處理系列:

 

 

一、實現的功能

1、車牌檢測(支持圖片中含有單車牌和多車牌檢測)

2、車牌定位

3、車牌字符識別

4、千份測試單次檢測識別完成平均耗時39ms,准確率99.9%

二、項目維護

github項目地址:https://github.com/eguid/vlpr4j

注意:由於授權協議具有傳染性,本項目采用GPL v2.0與ODL(Open Database License)授權協議,本項目不適用於任何商業性行為,包括銷售或者贈送。

三、使用方式

 
package cc.eguid.charsocr;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferByte;
import java.awt.image.SampleModel;
import java.math.BigDecimal;
import java.util.Vector;

import org.bytedeco.javacpp.opencv_imgcodecs;
import org.bytedeco.javacpp.Pointer;
import org.bytedeco.javacpp.opencv_core;
import org.bytedeco.javacpp.opencv_core.CvType;
import org.bytedeco.javacpp.opencv_core.CvTypeInfo;
import org.bytedeco.javacpp.opencv_core.Mat;

import cc.eguid.charsocr.core.CharsRecognise;
import cc.eguid.charsocr.core.PlateDetect;

/**
 * 車牌識別
 * @author eguid
 *
 */
public class PlateRecognition {
	 static PlateDetect plateDetect =null;
	 static CharsRecognise cr=null;
	 static{
		plateDetect=new PlateDetect();
		plateDetect.setPDLifemode(true);
		cr = new CharsRecognise();
	 }
	
	 /**
	     * 單個車牌識別
	     * @param mat
	     * @return
	     */
	    public static String plateRecognise(Mat mat){
	         Vector<Mat> matVector = new Vector<Mat>(1);
	         if (0 == plateDetect.plateDetect(mat, matVector)) {
	             if(matVector.size()>0){
	            	 return cr.charsRecognise(matVector.get(0));
	             }
	         }
	         return null;
	    }
	    /**
	     * 多車牌識別
	     * @param mat
	     * @return
	     */
	    public static String[] mutiPlateRecognise(Mat mat){
	    	 PlateDetect plateDetect = new PlateDetect();
	         plateDetect.setPDLifemode(true);
	         Vector<Mat> matVector = new Vector<Mat>(10);
	         if (0 == plateDetect.plateDetect(mat, matVector)) {
	             CharsRecognise cr = new CharsRecognise();
	             String[] results=new String[matVector.size()];
	             for (int i = 0; i < matVector.size(); ++i) {
	                 String result = cr.charsRecognise(matVector.get(i));
	               results[i]=result;
	             }
	             return results;
	         }
	         return null;
	    }
	    /**
	     * 單個車牌識別
	     * @param mat
	     * @return
	     */
	    public static String plateRecognise(String imgPath){
	    	 Mat src = opencv_imgcodecs.imread(imgPath);
	    	 return plateRecognise(src);
	    }
	    /**
	     * 多車牌識別
	     * @param mat
	     * @return
	     */
	    public static String[] mutiPlateRecognise(String imgPath){
	    	Mat src = opencv_imgcodecs.imread(imgPath);
	    	return mutiPlateRecognise(src);
	    }
	    
	    public static void main(String[] args){
	    	int sum=100;
	    	int errNum=0;
	    	int sumTime=0;
	    	long longTime=0;
	    	for(int i=sum;i>0;i--){
	    	 String imgPath = "res/image/test_image/plate_judge.jpg";
	    	 Mat src = opencv_imgcodecs.imread(imgPath);
	    	 long now =System.currentTimeMillis();
	    	String ret=plateRecognise(src);
	    	System.err.println(ret);
	    	long s=System.currentTimeMillis()-now;
	    	if(s>longTime){
	    		longTime=s;
	    	}
        	sumTime+=s;
        	if(!"川A0CP56".equals(ret)){
        		errNum++;
        	}
	    	}
	    	System.err.println("總數量:"+sum);
	    	System.err.println("單次最長耗時:"+longTime+"ms");
	    	
	    	BigDecimal errSum=new BigDecimal(errNum);
	    	BigDecimal sumNum=new BigDecimal(sum);
	    	BigDecimal c=sumNum.subtract(errSum).divide(sumNum).multiply(new BigDecimal(100));
	    	System.err.println("總耗時:"+sumTime+"ms,平均處理時長:"+sumTime/sum+"ms,錯誤數量:"+errNum+",正確識別率:"+c+"%");
	    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM