• 【20160924】GOCVHelper 图像处理部分(3)


    //根据轮廓的圆的特性进行选择
        vector<VPselectShapeCircularity(Mat src,Matdraw,vector<VPcontours,float minvalue,float maxvalue){
            vector<VPresult_contours;
            draw = Mat::zeros(src.rows,src.cols,CV_8UC3);
            for (int i=0;i<contours.size();i++){
                float fcompare = calculateCircularity(contours[i]);
                if (fcompare >=minvalue && fcompare <=maxvalue)
                    result_contours.push_back(contours[i]);
            }
            for (int i=0;i<result_contours.size();i++){
                Scalar  color  = Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255));
                drawContours(draw,result_contours,i,color,-1);
            }
            return result_contours;
        }
        vector<VPselectShapeCircularity(vector<VPcontours,float minvalue,float maxvalue){
            vector<VPresult_contours;
            for (int i=0;i<contours.size();i++){
                float fcompare = calculateCircularity(contours[i]);
                if (fcompare >=minvalue && fcompare <=maxvalue)
                    result_contours.push_back(contours[i]);
            }
            return result_contours;
        }
        //计算轮廓的圆的特性
        float calculateCircularity(VP contour){
            Point2f center;
            float radius = 0;
            minEnclosingCircle((Mat)contour,center,radius);
            //以最小外接圆半径作为数学期望,计算轮廓上各点到圆心距离的标准差
            float fsum = 0;
            float fcompare = 0;
            for (int i=0;i<contour.size();i++){   
                Point2f ptmp = contour[i];
                float fdistenct = sqrt((float)((ptmp.x - center.x)*(ptmp.x - center.x)+(ptmp.y - center.y)*(ptmp.y-center.y)));
                float fdiff = abs(fdistenct - radius);
                fsum = fsum + fdiff;
            }
            fcompare = fsum/(float)contour.size();
            return fcompare;
        }
     
        //返回两点之间的距离
        float getDistance(Point2f f1,Point2f f2)
        {
            return sqrt((float)(f1.x - f2.x)*(f1.x - f2.x) + (f1.y -f2.y)*(f1.yf2.y));

        }

    基于Opencv论坛上提供的关于圆的尺度的评判算法,编写Opencv的圆的特性判断算法。主要就是“以最小外接圆半径作为数学期望,计算轮廓上各点到圆心距离的标准差”这个标准差达到一定的范围,则可以认定轮廓是为圆形的。
    轮廓处理的两种方法在实际使用的过程中,用途非常广泛。
     
    //投影到x或Y轴上,上波形为vup,下波形为vdown,gap为误差间隔
        void projection2(Mat src,vector<int>& vup,vector<int>& vdown,int direction,int gap){
            Mat tmp = src.clone();
            vector<intvdate;
            if (DIRECTION_X == direction){
                for (int i=0;i<tmp.cols;i++){
                    Mat data = tmp.col(i);
                    int itmp = countNonZero(data);
                    vdate.push_back(itmp);
                }
            }else{
                for (int i=0;i<tmp.rows;i++){
                    Mat data = tmp.row(i);
                    int itmp = countNonZero(data);
                    vdate.push_back(itmp);
                }
            }
            //整形,去除长度小于gap的零的空洞
            if (vdate.size()<=gap)
                return;
            for (int i=0;i<vdate.size()-gap;i++){
                if (vdate[i]>0 && vdate[i+gap]>0){
                    for (int j=i;j<i+gap;j++){
                        vdate[j] = 1;
                    }
                    i = i+gap-1;
                }
            }
            //记录上下沿
            for (int i=1;i<vdate.size();i++){
                if (vdate[i-1] == 0 && vdate[i]>0)
                    vup.push_back(i);
                if (vdate[i-1]>0 && vdate[i] == 0)
                    vdown.push_back(i);
            }
        }
    投影变换。投影分析是非常重要的分析方式。这里的投影分析是从书上扒下来的,能够直接对图像进行投影分析,效果非常好。当然工具具备了,如何灵活使用也是需要经验的。
     





  • 相关阅读:
    按行打印二叉树结点值
    Kafka消息队列(继续深挖)
    【Java IO模式】Java BIO NIO AIO总结
    JAVA线程池的执行过程
    CentOS7升级版本
    【转】KVM中打开virt-manager报错或者将其显示为中文界面的办法
    【转】linux kvm虚拟机配置及常见问题处理
    【转】关于Quartus ii无法识别Modelsim路径的问题
    【转】[git]error: pack-objects died of signal
    storm kafka整合
  • 原文地址:https://www.cnblogs.com/jsxyhelu/p/5907623.html
Copyright © 2020-2023  润新知