天天看點

opencv學習(二十三)尋找并繪制輪廓findCounters()/找出凸包convexHull()1,查找輪廓findCounters()函數2,繪制輪廓drawCounters()執行個體1查找輪廓執行個體2查找并繪制輪廓2,找凸包執行個體3,随機點找凸包執行個體(vector出錯–①複制時注意變動的東西②for循環語句後面不要跟封号;)執行個體4,對圖檔輪廓找凸包(類似執行個體2,畫出輪廓後在對其求凸包)

1,查找輪廓findCounters()函數

opencv學習(二十三)尋找并繪制輪廓findCounters()/找出凸包convexHull()1,查找輪廓findCounters()函數2,繪制輪廓drawCounters()執行個體1查找輪廓執行個體2查找并繪制輪廓2,找凸包執行個體3,随機點找凸包執行個體(vector出錯–①複制時注意變動的東西②for循環語句後面不要跟封号;)執行個體4,對圖檔輪廓找凸包(類似執行個體2,畫出輪廓後在對其求凸包)
opencv學習(二十三)尋找并繪制輪廓findCounters()/找出凸包convexHull()1,查找輪廓findCounters()函數2,繪制輪廓drawCounters()執行個體1查找輪廓執行個體2查找并繪制輪廓2,找凸包執行個體3,随機點找凸包執行個體(vector出錯–①複制時注意變動的東西②for循環語句後面不要跟封号;)執行個體4,對圖檔輪廓找凸包(類似執行個體2,畫出輪廓後在對其求凸包)
opencv學習(二十三)尋找并繪制輪廓findCounters()/找出凸包convexHull()1,查找輪廓findCounters()函數2,繪制輪廓drawCounters()執行個體1查找輪廓執行個體2查找并繪制輪廓2,找凸包執行個體3,随機點找凸包執行個體(vector出錯–①複制時注意變動的東西②for循環語句後面不要跟封号;)執行個體4,對圖檔輪廓找凸包(類似執行個體2,畫出輪廓後在對其求凸包)

2,繪制輪廓drawCounters()

opencv學習(二十三)尋找并繪制輪廓findCounters()/找出凸包convexHull()1,查找輪廓findCounters()函數2,繪制輪廓drawCounters()執行個體1查找輪廓執行個體2查找并繪制輪廓2,找凸包執行個體3,随機點找凸包執行個體(vector出錯–①複制時注意變動的東西②for循環語句後面不要跟封号;)執行個體4,對圖檔輪廓找凸包(類似執行個體2,畫出輪廓後在對其求凸包)
opencv學習(二十三)尋找并繪制輪廓findCounters()/找出凸包convexHull()1,查找輪廓findCounters()函數2,繪制輪廓drawCounters()執行個體1查找輪廓執行個體2查找并繪制輪廓2,找凸包執行個體3,随機點找凸包執行個體(vector出錯–①複制時注意變動的東西②for循環語句後面不要跟封号;)執行個體4,對圖檔輪廓找凸包(類似執行個體2,畫出輪廓後在對其求凸包)

執行個體1查找輪廓

#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main()
{
    //【1】讀圖
    Mat srcimg = imread("D://1.jpg", );
    imshow("原始圖", srcimg);

    //【2】初始化結果圖
    Mat dstimg = Mat::zeros(srcimg.rows, srcimg.cols, CV_8UC3);

    //【3】取門檻值大于119的原圖部分
    srcimg = srcimg > ;
    imshow("取門檻值後", srcimg);

    //【4】定義輪廓和層次結構
    vector<vector<Point>>contours;
    vector<Vec4i> hierarchy;

    //【5】查找輪廓
    findContours(srcimg, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);

    //【6】曆遍所有頂層可以囊括,以随機顔色繪制出每個連接配接元件的顔色
    int index = ;
    for (;index>=;index=hierarchy[index][])
    {
        Scalar color(rand() & , rand() & , rand() & );//rand()&255用法
        drawContours(dstimg, contours, index, color, FILLED, , hierarchy);
    }
    //【7】顯示最後輪廓圖
    imshow("輪廓圖", dstimg);

    waitKey();
}
           
opencv學習(二十三)尋找并繪制輪廓findCounters()/找出凸包convexHull()1,查找輪廓findCounters()函數2,繪制輪廓drawCounters()執行個體1查找輪廓執行個體2查找并繪制輪廓2,找凸包執行個體3,随機點找凸包執行個體(vector出錯–①複制時注意變動的東西②for循環語句後面不要跟封号;)執行個體4,對圖檔輪廓找凸包(類似執行個體2,畫出輪廓後在對其求凸包)

執行個體2查找并繪制輪廓

#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;

//全局變量申明
Mat g_srcimg, g_grayimg;
int g_thresh = ;
int g_thresh_max = ;
RNG g_rng();
Mat g_cannyMat_output;
vector<vector<Point>> g_vContours;
vector<Vec4i>g_vHierarchy;

//全局函數申明
void on_ThreshChange(int, void*);

//主函數
int main()
{
    //【1】讀圖處理
    g_srcimg = imread("D://1.jpg", );
    blur(g_srcimg, g_grayimg, Size(, ));
    imshow("灰階模糊降噪圖", g_grayimg);

    //【2】建立滑動條
    createTrackbar("canny門檻值", "灰階模糊降噪圖", &g_thresh, g_thresh_max, on_ThreshChange);
    on_ThreshChange(, );
    waitKey();
    return();


}//【3】回調函數
void on_ThreshChange(int, void*)
{
    //【4】邊緣檢測
    Canny(g_grayimg, g_cannyMat_output, g_thresh, g_thresh * , );

    //【5】查找輪廓
    findContours(g_cannyMat_output, g_vContours, g_vHierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(, ));


    //【6】繪制輪廓
    Mat drawing = Mat::zeros(g_cannyMat_output.size(), CV_8UC3);
    int i = ;
    for (; i <g_vContours.size(); i++)
    {
        Scalar color(g_rng.uniform(, ), g_rng.uniform(, ), g_rng.uniform(, ));// g_rng.uniform(0, 255))用法?
        drawContours(drawing, g_vContours, i, color, , , g_vHierarchy, , Point());
    }
    //【7】顯示最後輪廓圖
    imshow("輪廓圖", drawing);
}
           
opencv學習(二十三)尋找并繪制輪廓findCounters()/找出凸包convexHull()1,查找輪廓findCounters()函數2,繪制輪廓drawCounters()執行個體1查找輪廓執行個體2查找并繪制輪廓2,找凸包執行個體3,随機點找凸包執行個體(vector出錯–①複制時注意變動的東西②for循環語句後面不要跟封号;)執行個體4,對圖檔輪廓找凸包(類似執行個體2,畫出輪廓後在對其求凸包)

2,找凸包

opencv學習(二十三)尋找并繪制輪廓findCounters()/找出凸包convexHull()1,查找輪廓findCounters()函數2,繪制輪廓drawCounters()執行個體1查找輪廓執行個體2查找并繪制輪廓2,找凸包執行個體3,随機點找凸包執行個體(vector出錯–①複制時注意變動的東西②for循環語句後面不要跟封号;)執行個體4,對圖檔輪廓找凸包(類似執行個體2,畫出輪廓後在對其求凸包)
opencv學習(二十三)尋找并繪制輪廓findCounters()/找出凸包convexHull()1,查找輪廓findCounters()函數2,繪制輪廓drawCounters()執行個體1查找輪廓執行個體2查找并繪制輪廓2,找凸包執行個體3,随機點找凸包執行個體(vector出錯–①複制時注意變動的東西②for循環語句後面不要跟封号;)執行個體4,對圖檔輪廓找凸包(類似執行個體2,畫出輪廓後在對其求凸包)

執行個體3,随機點找凸包執行個體(vector出錯–①複制時注意變動的東西②for循環語句後面不要跟封号;)

#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main()
{
    //初始化變量和随機值
    Mat image(, , CV_8UC3);
    RNG&rng = theRNG();

    //循環
    while ()
    {
        char key;//鍵值
        int count = (unsigned)rng %  + ;//随機生成點數量
        vector<Point> points;//點值

                            //随機生成坐标
        for (int i = ; i < count; i++)
        {
            Point point;
            point.x = rng.uniform(image.cols / , image.cols *  / );
            point.y = rng.uniform(image.rows / , image.rows *  / );//注意X,y分别指派

            points.push_back(point);

        }

        //檢測凸包
        vector<int>hull;
        convexHull(Mat(points), hull, true);


        //繪制出随機顔色點
        image = Scalar::all();

        for (int i = ; i < count; i++)//for後面不需要分号
        {
            circle(image, points[i], , Scalar(rng.uniform(, ), rng.uniform(, ), rng.uniform(, )), FILLED, LINE_AA);
        }


        //準備參數
        int hullcount = (int)hull.size();
        Point point0 = points[hull[hullcount - ]];//連接配接凸包邊的坐标點


                                                   //繪凸包的邊
        for (int i = ; i < hullcount; i++)
        {
            Point point = points[hull[i]];
            line(image, point0, point, Scalar(, , ), , LINE_AA);
            point0 = point;

        }
        imshow("凸包檢測執行個體", image);
        //按下ESC或q退出
        key = (char)waitKey();
        if (key ==  || key == 'q' || key == 'Q')
            break;
    }
    return ;
}
           
opencv學習(二十三)尋找并繪制輪廓findCounters()/找出凸包convexHull()1,查找輪廓findCounters()函數2,繪制輪廓drawCounters()執行個體1查找輪廓執行個體2查找并繪制輪廓2,找凸包執行個體3,随機點找凸包執行個體(vector出錯–①複制時注意變動的東西②for循環語句後面不要跟封号;)執行個體4,對圖檔輪廓找凸包(類似執行個體2,畫出輪廓後在對其求凸包)
opencv學習(二十三)尋找并繪制輪廓findCounters()/找出凸包convexHull()1,查找輪廓findCounters()函數2,繪制輪廓drawCounters()執行個體1查找輪廓執行個體2查找并繪制輪廓2,找凸包執行個體3,随機點找凸包執行個體(vector出錯–①複制時注意變動的東西②for循環語句後面不要跟封号;)執行個體4,對圖檔輪廓找凸包(類似執行個體2,畫出輪廓後在對其求凸包)

執行個體4,對圖檔輪廓找凸包(類似執行個體2,畫出輪廓後在對其求凸包)