輪廓查找與繪製(一)
1.查找輪廓——findContours()
2.繪製輪廓——drawContours()
先上ppt:
代碼:查找輪廓並繪製輪廓
///查找輪廓並繪製輪廓
#include "opencv2/opencv.hpp"
using namespace cv;
#include <iostream>
using namespace std;
int main()
{
//1.查找輪廓時,一般使用二值化圖像,進行閾值化處理或者Canny邊緣檢測
Mat srcImg = imread("11.png",CV_LOAD_IMAGE_COLOR);
imshow("srcImg",srcImg);
Mat copyImg = srcImg.clone();//將原圖像備份(查找輪廓會改變原圖像)
cvtColor(srcImg,srcImg,CV_BGR2GRAY);//轉換成灰度圖(閾值化需要圖像會灰度圖)
threshold(srcImg, srcImg, 100, 255, CV_THRESH_BINARY_INV); //閾值化並保證黑色背景白色輪廓
imshow("threshold",srcImg);
//2.查找輪廓並繪製輪廓
vector<vector<Point>> contours;//存放檢測到的輪廓,每個輪廓均由點組成
vector<Vec4i> hierarchy;//還未理解,沒用到.
//2.1查找輪廓——findContours()
//輪廓檢索模式:CV_RETR_EXTERNAL爲檢測最外層
//輪廓近似方法:CV_CHAIN_APPROX_NONE爲連續存儲所有的輪廓點
//findContours(srcImg,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
//輪廓檢索模式:CV_RETR_TREE及其他均爲檢測所有輪廓
//輪廓近似方法:CV_CHAIN_APPROX_SIMPLE爲對於壓縮存儲,對於水平、垂直或斜向的線段,只會存儲端點
findContours(srcImg, contours, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
//2.2繪製輪廓——drawContours()
//contourIdx:繪製輪廓索引,-1爲繪製所有輪廓
//*線寬若爲負數則向內填充輪廓,可實現簡單的孔洞填充和標記聯通域
drawContours(copyImg,contours,-1,Scalar(0,255,0),2,8);//contourIdx:繪製輪廓索引,-1爲繪製所有輪廓
imshow("draw contours",copyImg);
waitKey(0);
return 0;
}
運行結果: