最大輪廓和投影 轉

轉自:http://www.opencv.org.cn/forum.php?mod=viewthread&tid=37839&page=1php

最大輪廓和投影
    
    最近很是多的用到了最大輪廓和投影運算。回想起來,這兩種算法的確是屬於很是常見的基礎算法。這裏加以總結和提取。
      最大輪廓:
      前提是圖像通過了灰度和閾值處理,也能夠直接處理canny的結果,有些時候須要預先通過色彩域的轉換。最後獲得的結果,應該是一個contour,固然能夠採用必定的方法處理獲得外接矩形。
//尋找最大的輪廓
vector<cv:Point> FindBigestContour(Mat src)
{    
    int imax = 0; //表明最大輪廓的序號
    int imaxcontour = -1; //表明最大輪廓的大小
    std::vector<std::vector<cv:Point>>contours;    
    findContours(src,contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);
    for (int i=0;i<contours.size();i++)
    {
        int itmp =  contourArea(contours[i]);//這裏採用的是輪廓大小
        if (imaxcontour < itmp )
        {
            imax = i;
            imaxcontour = itmp;
        }
    }
    return contours[imax];
}
調用方法,獲得外接矩陣
                   Rect boundRect = boundingRect(Mat(FindBigestContour(canny)));
     投影處理:
     這裏的前提和最大輪廓是很是類似的。投影主要關心的是經過投影圖像,得到原始圖像中的ROI,或者得到有多少個上波形多少個下波形這些定量的結果。

    Vector<int> vectorV; //橫向循環
    Vector<int> vectorH; //縱向循環
    Vector<int> VUpper;
    Vector<int> VDown;
    vector<int> HUpper;
    vector<int> HDower;

   // 作橫向循環
    for (int i=0;i<ostu.cols;i++)
    {
        Mat data = ostu.col(i);
        int itmp = countNonZero(data);
        vectorV.push_back(itmp);
    }
    //上波形爲VUpper,下波形爲VDown
    for (int i=1;i<vectorV.size();i++)
    {
        if (vectorV[i-1] == 0 && vectorV[i]>0)
        {
            VUpper.push_back(i);
        }
        if (vectorV[i-1]>0 && vectorV[i] == 0)
        {
            VDown.push_back(i);
        }
    }
    //作縱向循環,這個每每處理的是橫向循環的結果圖片
      for (int j=0;j<ostu.rows;j++)
        {
            Mat data = roitmp.row(j);
            int itmp = countNonZero(data);
            vectorH.push_back(itmp);
        }
        for (int j=0;j<vectorH.size()-1;j++)
        {   
            if (vectorH[j]>0 && vectorH[j+1] == 0)
            {
                HDower.push_back(j);
            }
            if (vectorH[j] == 0 && vectorH[j+1]>0)
            {
                HUpper.push_back(j);
            }
        }

     //因爲處理的上波形和下波形可能會有問題,須要進行必定的處理
     //這裏的一個處理就是提出哪些短暫的空白區域
    for (int j=0;j<HDower.size()-1;j++)
            {
                //得出之間空白的區域
                int iwidth = HUpper[j+1] - HDower[j];
                if (iwidth > 10)
                {
                    iresult = iresult +1;
                }
            }算法

相關文章
相關標籤/搜索