OpenCv(11)-- 轮廓发现

1、findContours()//寻找得到轮廓

输入image;
输出contours,是二维向量的Point。如:vector< vector>contours;
hierarchy;每个轮廓的信息,后面要用到这些重要信息。
mode;轮廓检索模式,网上很多参数说明。
method;轮廓的近似办法。
offset;我没用过,直接默认参数。

2、这里说一下mode这个参数。

RETR_EXTERNAL:表示只检测最外层轮廓,意思是图像中独立的个体只检测最外层轮廓,包含在里面的轮廓不会提取出来。
RETR_LIST:提取所有轮廓,并放置在list中,不建立等级关系。意思就是提取出来的轮廓之间是没有联系的。
RETR_CCOMP:提取所有轮廓,并且将其组织为双边结构。意思就是第一层为它的外围轮廓,第二层为内围轮廓,利用这个参数可以筛选出来一个独立边缘只对应一个轮廓。
RETR_TREE:提取所有轮廓,并且重新建立网状轮廓结构。它体现出来的轮廓联系很紧密,比如说一个轮廓在另外一个轮廓的里面,轮廓里面又包含轮廓。
对了,在参数method中有个标识符–CV_CHAIN_CODE,是生成Freeman码的,但是OpenCV提供的C++接口好像不好提取

3、drawContours()//画轮廓

    void drawContours//绘制轮廓,用于绘制找到的图像轮廓  
    (  
     InputOutputArray image,//要绘制轮廓的图像  
     InputArrayOfArrays contours,//所有输入的轮廓,每个轮廓被保存成一个point向量  
     int contourIdx,//指定要绘制轮廓的编号,如果是负数,则绘制所有的轮廓  
     const Scalar& color,//绘制轮廓所用的颜色  
     int thickness = 1, //绘制轮廓的线的粗细,如果是负数,则轮廓内部被填充  
     int lineType = 8, /绘制轮廓的线的连通性  
     InputArray hierarchy = noArray(),//关于层级的可选参数,只有绘制部分轮廓时才会用到  
     int maxLevel = INT_MAX,//绘制轮廓的最高级别,这个参数只有hierarchy有效的时候才有效  
                                              //maxLevel=0,绘制与输入轮廓属于同一等级的所有轮廓即输入轮廓和与其相邻的轮廓  
                                              //maxLevel=1, 绘制与输入轮廓同一等级的所有轮廓与其子节点。  
                                              //maxLevel=2,绘制与输入轮廓同一等级的所有轮廓与其子节点以及子节点的子节点  
     Point offset = Point()  
    )  

4、代码演示如下:

//利用createTrackbar实现动态绘制轮廓
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <stdio.h>

using namespace std;
using namespace cv;
int threshold_value = 100;
int threshold_max = 255;
RNG rng;
void Demo_Contours(int, void*);
Mat src, dst;
int main()
{
    src = imread("D:/VS2015Program/baby2.jpg");
    if (src.empty())
    {
        cout << "could not open picture" << endl;
        return -1;
    }

    namedWindow("input", CV_WINDOW_AUTOSIZE);
    namedWindow("output", CV_WINDOW_AUTOSIZE);
    imshow("input", src);

    cvtColor(src, src, CV_BGR2GRAY);
    createTrackbar("Trackbar", "output", &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);
    findContours(canny_output, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
    dst = Mat::zeros(src.size(), CV_8UC3);
    RNG rng(123456);
    for (size_t i = 0; i < contours.size(); i++)
    {
        Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
        drawContours(dst, contours, i, color, 2, 8, hierachy, 0, Point(0, 0));

    }
    imshow("hihi", dst);
}

猜你喜欢

转载自blog.csdn.net/missayaaa/article/details/80016168