• 图像的轮廓发现与绘制


     

     

     

     

    #include <opencv2/opencv.hpp>
    #include <iostream>
    #include <math.h>
    
    using namespace std;
    using namespace cv;
    
    Mat src, dst;
    const char* output_win = "findcontours-demo";
    int threshold_value = 100;
    int threshold_max = 255;
    RNG rng;
    void Demo_Contours(int, void*);
    int main(int argc, char** argv) {
        src = imread("L:/12.jpg");
        if (src.empty()) {
            printf("could not load image...
    ");
            return -1;
        }
        namedWindow("input-image", CV_WINDOW_AUTOSIZE);
        namedWindow("output_win", CV_WINDOW_AUTOSIZE);
        imshow("input-image", src);
        cvtColor(src, src, CV_BGR2GRAY);
    
        const char* trackbar_title = "Threshold Value:";
        createTrackbar(trackbar_title, output_win, &threshold_value, threshold_max, Demo_Contours);
        Demo_Contours(0, 0);
    
        waitKey(0);
        return 0;
    }
    
    void Demo_Contours(int, void*) {
        Mat canny_output;
        vector<vector<Point>> contours;    //定义一个二维数组     数组的使用见下图
        vector<Vec4i> hierachy;            //四维整型的数组   
        Canny(src, canny_output, threshold_value, threshold_value * 2, 3, false);
        //Canny边缘检测,阈值
        findContours(canny_output, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
        //findContours参数:
        //1.输入图像 2.检测出的所有轮廓对象(数组) 3.拓扑结构 4.轮廓返回模式  5.发现方法 6.默认P(0,0)没有位移 
        dst = Mat::zeros(src.size(), CV_8UC3);  //初始化dst为一个src大小的零矩阵
    
        RNG rng(12345);
        for (size_t i = 0; i < contours.size(); i++) {
            Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
            //contours的每一段轮廓取一次随机颜色
            drawContours(dst, contours, i, color, 1, 8, hierachy, 0, Point(0, 0));
            //drawContours参数:
            //1.输出图像 2.轮廓集contours 3.第几个轮廓 4.颜色 5.线宽 6.线条类型 7.拓扑结构 
            //8. 0表示绘制当前 1表示绘制当前及其内嵌的轮廓  9.轮廓位移
    
        }
        imshow(output_win, dst);
    }

    结果:

     代码中涉及数组的使用方法:

      vector<vector<Point>> contours;    //定义一个二维数组     数组的使用见下图
        vector<Vec4i> hierachy;            //四维整型的数组   

    这两个数组为 findContours的第2和第3个参数;

    vector<vector<Point>>://一般在轮廓查找和轮廓绘制使用,参数 contours

    vector容器里面放了一个vector容器,子容器里放点

     vector<V e c 4 i>:放了4维int向量//一般在轮廓查找和轮廓绘制使用,参数 hierarchy

     vector<R e ct>: 像素width * height   from  位置(x*y)

     vector<R o t a t e d R e c t>:如图三个成员

  • 相关阅读:
    机器学习--k-means聚类原理
    机器学习--朴素贝叶斯模型原理
    关联分析原理小结
    批发经销商客户价值细分
    员工离职预测
    共享单车租赁需求预测
    蓝桥杯 区间k大数查询
    蓝桥杯 猴子吃包子
    java计算程序运行时间
    leetcode 185周周赛 字节专场
  • 原文地址:https://www.cnblogs.com/Jack-Elvis/p/11545280.html
Copyright © 2020-2023  润新知