Opencv learning (twenty-three) find and draw the contour findCounters()/find the convex hull convexHull()

1, find the contour findCounters() function

write picture description here
write picture description here
write picture description here

2, draw the outline drawCounters()

write picture description here
write picture description here

Example 1 Finding contours

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

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

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

    //【3】取阈值大于119的原图部分
    srcimg = srcimg > 119;
    imshow("取阈值后", srcimg);

    //【4】定义轮廓和层次结构
    vector<vector<Point>>contours;
    vector<Vec4i> hierarchy;

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

    //【6】历遍所有顶层可以囊括,以随机颜色绘制出每个连接组件的颜色
    int index = 0;
    for (;index>=0;index=hierarchy[index][0])
    {
        Scalar color(rand() & 255, rand() & 255, rand() & 255);//rand()&255用法
        drawContours(dstimg, contours, index, color, FILLED, 8, hierarchy);
    }
    //【7】显示最后轮廓图
    imshow("轮廓图", dstimg);

    waitKey(0);
}

write picture description here

Example 2 Find and draw contours

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

//全局变量申明
Mat g_srcimg, g_grayimg;
int g_thresh = 80;
int g_thresh_max = 255;
RNG g_rng(12345);
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", 0);
    blur(g_srcimg, g_grayimg, Size(3, 3));
    imshow("灰度模糊降噪图", g_grayimg);

    //【2】创建滑动条
    createTrackbar("canny阈值", "灰度模糊降噪图", &g_thresh, g_thresh_max, on_ThreshChange);
    on_ThreshChange(0, 0);
    waitKey(0);
    return(0);


}//【3】回调函数
void on_ThreshChange(int, void*)
{
    //【4】边缘检测
    Canny(g_grayimg, g_cannyMat_output, g_thresh, g_thresh * 2, 3);

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


    //【6】绘制轮廓
    Mat drawing = Mat::zeros(g_cannyMat_output.size(), CV_8UC3);
    int i = 0;
    for (; i <g_vContours.size(); i++)
    {
        Scalar color(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255));// g_rng.uniform(0, 255))用法?
        drawContours(drawing, g_vContours, i, color, 2, 8, g_vHierarchy, 0, Point());
    }
    //【7】显示最后轮廓图
    imshow("轮廓图", drawing);
}

write picture description here

2, find the convex hull

write picture description here
write picture description here

Example 3, random point to find the convex hull instance (vector error - ① pay attention to the changed things when copying ② for loop statement do not follow the title;)


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

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

    //循环
    while (1)
    {
        char key;//键值
        int count = (unsigned)rng % 100 + 3;//随机生成点数量
        vector<Point> points;//点值

                            //随机生成坐标
        for (int i = 0; i < count; i++)
        {
            Point point;
            point.x = rng.uniform(image.cols / 4, image.cols * 3 / 4);
            point.y = rng.uniform(image.rows / 4, image.rows * 3 / 4);//注意X,y分别赋值

            points.push_back(point);

        }

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


        //绘制出随机颜色点
        image = Scalar::all(0);

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


        //准备参数
        int hullcount = (int)hull.size();
        Point point0 = points[hull[hullcount - 1]];//连接凸包边的坐标点


                                                   //绘凸包的边
        for (int i = 0; i < hullcount; i++)
        {
            Point point = points[hull[i]];
            line(image, point0, point, Scalar(255, 255, 255), 2, LINE_AA);
            point0 = point;

        }
        imshow("凸包检测实例", image);
        //按下ESC或q退出
        key = (char)waitKey();
        if (key == 27 || key == 'q' || key == 'Q')
            break;
    }
    return 0;
}

write picture description here
write picture description here

Example 4, find the convex hull of the image outline (similar to example 2, after drawing the outline, find the convex hull)

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325637146&siteId=291194637