图像的轮廓发现与绘制

 

 

 

 

 

 

 

 

 

 

#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...\n");
        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>:如图三个成员

 

posted @ 2019-09-18 20:57  量子与太极  阅读(280)  评论(0编辑  收藏  举报