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