MSER常见参数

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} deltaq(i)=((sizeisizeidelta)/sizeidelta
    当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>() {
            @Override
            public 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/45
                int 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);

MSER常见参数_第1张图片
MSER常见参数_第2张图片
参考:https://www.cnblogs.com/shangd/p/6164916.html

你可能感兴趣的:(opencv,opencv,计算机视觉)