MSER用于文本检测已经成熟了,现简单使用来识别车牌号。
目录
- MSER参数
- 最大最小区域固定
MSER参数
默认:int delta = 5, int min_area = 60, int max_area = 14400, double max_variation = 0.25, double min_diversity = .2
* Full constructor for %MSER detector** @param delta it compares \((size_{i}-size_{i-delta})/size_{i-delta}\)* @param min_area prune the area which smaller than minArea* @param max_area prune the area which bigger than maxArea* @param max_variation prune the area have similar size to its children* @param min_diversity for color image, trace back to cut off mser with diversity less than min_diversity* @return automatically generated*/public static MSER create(int delta, int min_area, int max_area, double max_variation, double min_diversity) {return MSER.__fromPtr__(create_4(delta, min_area, max_area, max_variation, min_diversity));}
- delta:
它表示一个区域需要多少个灰度等级才能成为MSER区域。
d e l t a 用 来 计 算 : q ( i ) = ( ( s i z e i − s i z e i − d e l t a ) / s i z e i − d e l t a delta用来计算:q(i)=((size_{i}-size_{i-delta})/size_{i-delta} delta用来计算:q(i)=((sizei−sizei−delta)/sizei−delta
当q(i)局部最小时,认为是MSER区域。
固然,delta越大,得到的区域越少。 - min,max_area
MSER区域 的像素数 在 【min,max】区间内才考虑。否则直接prune - max_variation
MSER区域变化率>max_variation,不考虑.
即 即使 q(i)局部最小,但q(i)>maxVariation,也不考虑。
故max_variation,越小,得到的区域越少。 - min_diversity
此参数用于解决两个十分相似的MSER区域。
两个嵌套的MSER区域的diversity=父-子 / 子,小于指定参数,去掉子MSER区域。
此参数越大,得到的区域越少
最大最小区域固定
首先生成MSER区域,然后按照矩形大小 从大到小排序,去掉重复的矩形,保留最小的矩形。
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);//定义mser的参数MSER mser = MSER.create(5,350,1200);Mat img= Imgcodecs.imread("D:\\PlateDemo\\src\\main\\resources\\14.jpg");//对读取的图片进行灰度化Mat gray=new Mat();Imgproc.cvtColor(img,gray,Imgproc.COLOR_RGB2GRAY);ArrayList<MatOfPoint> matOfPoints = new ArrayList<>();MatOfRect matOfRect = new MatOfRect();//mser检测mser.detectRegions(gray,matOfPoints,matOfRect);//对所有mser区域矩形按照面积从大到小排序,List<Rect> rects = matOfRect.toList();Collections.sort(rects, new Comparator<Rect>() {@Overridepublic int compare(Rect o1, Rect o2) {if(o1.area()>=o2.area()) return -1;return 1;}});ArrayList<Rect> ansRect = new ArrayList<>();for(int i=0;i<rects.size();i++){int height=rects.get(i).height;int width=rects.get(i).width;double a=height/width;if(a>=1&&a<=8) {//车牌字符 90/45int flag=1;Imgproc.rectangle(img,rects.get(i).tl(),rects.get(i).br(),new Scalar(0,0,255));//如果包含关系,去掉面积较大者for(int j=i+1;j<rects.size();j++){Point point = new Point(rects.get(j).x + rects.get(j).width / 2, rects.get(j).y + rects.get(j).height / 2);if(rects.get(i).contains(point)) {flag=0;break;}}if(flag==1) ansRect.add(rects.get(i));}}Imgcodecs.imwrite("D:\\PlateDemo\\src\\main\\resources\\allRect.jpg",img);img= Imgcodecs.imread("D:\\PlateDemo\\src\\main\\resources\\14.jpg");for(int i=0;i<ansRect.size();i++) Imgproc.rectangle(img,ansRect.get(i).tl(),ansRect.get(i).br(),new Scalar(0,0,255));Imgcodecs.imwrite("D:\\PlateDemo\\src\\main\\resources\\NoRepeat.jpg",img);
参考:https://www.cnblogs.com/shangd/p/6164916.html