Canny一類的邊緣檢測算法可以根據像素之間的差異,檢測出輪廓邊界的像素,但它沒有將輪廓作為一個整體。所以要將輪廓提起出來,就必須將這些邊緣像素組裝成輪廓。

OpenCV中有一個很強大的函數,它可以從二值圖像中找到輪廓:findContours函數。

有時我們還需要把找到的輪廓畫出來,那就要用到函數drawContours了。

findContours函數和那就要用到函數drawContours函數一般配套使用。

#include "opencv2/imgproc.hpp"#include "opencv2/highgui.hpp"#include <iostream>using namespace cv;using namespace std;void main() 
{
    Mat original = imread("test5.jpg");
    namedWindow("My original");
    imshow("My original", original);
    Mat gray = original;
    cvtColor(gray, gray, CV_RGB2GRAY);//灰度化

    int thresh_size = (100 / 4) * 2 + 1; //自適應二值化閾值
    adaptiveThreshold(gray, gray, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY_INV, thresh_size, thresh_size / 3);    //morphologyEx(gray, gray, MORPH_OPEN, Mat());//形態(tài)學開運算去噪點

    imshow("gray", gray);

    vector<vector<Point> > contours;
    findContours(gray, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); //找輪廓
    vector<vector<Point>> contours1;    for (int i = 0; i < contours.size(); ++i)
    {
        contours1.push_back(contours[i]);
    }    Mat hole(gray.size(), CV_8U, Scalar(0)); //遮罩圖層
    drawContours(hole, contours1, -1, Scalar(255), CV_FILLED); //在遮罩圖層上,用白色像素填充輪廓,得到MASK
    namedWindow("My hole");
    imshow("My hole", hole);    Mat crop(original.rows, original.cols,&n